Привет, чат. Хочу во-первых рассказать вам историю разочарования в довольно известной утилите для мониторинга потребления энергии и загрузки CPU в macOS — MX Power Gadget. А во-вторых, поделиться очень простой заменой, которую я собрал за пару вечеров — pgauge.
Я часто что-то тестирую и такие метрики как потребление электричества, частота и загрузка CPU нередко бывают полезными при бенчмарках. Кроме того, я ненавижу когда фоновая задача или что-то еще неожиданно начинает греть ноутбук и разряжать батарею. У меня даже был случай, когда я купил переходник USB-C и оказалось, что пока он вставлен, процессор потребляет лишние два ватта! Я думаю, что для многих моя дотошность в этом вопросе может даже показаться фанатичной. Можно считать это моим проявлением ОКР.
В то же время, я не хочу использовать для этих целей командный центр — мне часто нужны вполне конкретные простые метрики. Раньше, когда трава была зеленая, а процессоры в макбуках синие, я использовал Intel Power Gadget. И когда Apple перешла на архитектуру ARM, я грустил, но недолго, потому что быстро нашлась замена — MX Power Gadget.
Она показывает отдельно потребление электричества CPU, GPU и вместе. Частоту и утилизацию отдельно по разным типам ядер. Ну и температуру до кучи. Ещё и графики какие красивые строит, лепота! Но не спешите очаровываться, сейчас я расскажу вам, почему это всё чушь )
Обратите внимание на то, что в простое (а я специально сделал скриншот, когда компьютер был в простое) потребление CPU — 50–100 милливатт (если закрыть все приложения, может быть вообще 10). И это с учетом того, что сама утилита тоже работает и рисует графики. Ну потрясающе же, показывает точные значения и ещё и сама практически ничего не потребляет!
В общем, пользовался я этой утилитой часто и подолгу держал открытой во время работы (так как она показывает графики только с момента запуска), в том числе при работе от батареи.
А ещё есть встроенная в macOS консольная утилита powermetrics
, с которой собственно MX Power Gadget и собирает почти все данные. Её особенность в том, что она выводит излишне много информации, просто срёт в консоль разнообразными подробностями, поэтому использовать её в сыром виде очень проблематично. Вот я и не использовал. Но так случилось, что однажды я зачем-то (уже даже не вспомню зачем) запустил в консоли powermetrics
, когда у меня был запущен MX Power Gadget и я увидел странное.
Странность была в том, что MX Power Gadget, как обычно, показывал околонулевое потребление электричества, а вот powermetrics
почему-то показывал около двух ватт.
При этом, если закрыть MX Power Gadget, то показания powermetrics
тоже становились околонулевыми. А если открыть, то снова около двух. Сперва я подумал что это какой-то баг. Две утилиты мониторинга запущены одновременно, мало ли, какие сайд-эффекты это может дать. Но сомнения закрались, я решил попробовать разобраться.
На всякий случай я открыл Activity Monitor, он не показывал никаких процессов, потребляющих CPU, кроме фоновой мелочи. Но я ввел в поиск powermetrics
, и снова увидел странное.
Activity Monitor показывал два процесса powermetrics
, но оба почему-то без потребления CPU. Не с нулевым потреблением, а без потребления вообще. Понаблюдав, я заметил, что у них постоянно накручивался PID. Ага. Получается, MX Power Gadget не просто однажды запускал powermetrics
, который через заданный интервал сбрасывает метрики в stdout, а запускает его на каждое измерение (раз в секунду)! Тут мои подозрения превратились в стойкое ощущение, что с MX Power Gadget правда что-то не так. Осталось только выяснить, насколько это затратно.
Выяснить это конечно очень просто. Нужно всего лишь запустить powermetrics
и замерить, сколько он жрет CPU сам по себе. И вот результаты для двух секунд и для около тридцати секунд:
$ /usr/bin/time sudo powermetrics -i 1000 --samplers cpu_power
....
Combined Power (CPU + GPU + ANE): 97 mW
^C 1.81 real 0.14 user 0.39 sys
$ /usr/bin/time sudo powermetrics -i 1000 --samplers cpu_power
....
Combined Power (CPU + GPU + ANE): 70 mW
^C 25.17 real 0.17 user 0.63 sys
То есть, когда powermetrics
стартует, он жрет прилично так времени CPU (≈500 ms), а потом выдает результаты уже почти ничего не тратя. При этом, показатели начинают сниматься уже после этой долгой инициализации и не попадают в статистику. Лол.
А теперь взгляните на самый первый скриншот. Вас тоже смущают около 9% утилизации P-ядер при нулевом потреблении электричества? :~) И странное совпадение: 9% × 6 (количество ядер) ≈ 50%, то есть ≈500 ms работы одного ядра.
Около двух ватт — много это или мало? Батарея моего макбука сейчас 60 ватт-часов. Допустим, что в среднем мне хватает одного заряда часов на 7. Значит, среднее потребление всего макбука вместе с экраном — 8,6 ватт. Если бы я не пользовался MX Power Gadget, то одного заряда мне бы хватало на 9 часов :~)
А что делать?
Пришлось отказаться от MX Power Gadget, брать всё в свои руки и снимать показания с powermetric
самостоятельно. В первом приближении неплохо работает просто grep
.
$ sudo powermetrics -i 1000 --samplers cpu_power | grep "Combined Power"
Combined Power (CPU + GPU + ANE): 114 mW
Combined Power (CPU + GPU + ANE): 81 mW
Combined Power (CPU + GPU + ANE): 81 mW
^C
Но конечно хотелось чего-то более функционального. Так что я написал скрипт, которым с вами и хочу поделиться: pgauge. Он запускает powermetrics
один раз, поэтому сам почти ничего не потребляет.
Устанавливается через pip, запускается как отдельной командой, так и как модуль питона python -m pgauge
. Показывает все то же самое, что MX Power Gadget, но без температуры и красивых графиков, только экстремальные значения за последнюю минуту. Просто и со вкусом.
К сожалению требует пароля администратора, но можно добавить правило в sudoers для запуска powermetrics
, чтобы не вводить его каждый раз.
echo `whoami` "ALL=(ALL) NOPASSWD: /usr/bin/powermetrics *" | sudo tee /etc/sudoers.d/powermetrics
На этом всё. Пишите пожелания и замечания по pgauge
и рассказывайте о любых проблемах с выводом значений на вашем процессоре, что смогу — исправлю.
Комментарии (14)
ris58h
15.11.2024 00:21Я правильно понял что вы делаете тоже самое что и MXPG, но с меньшей частотой? Не проще было им issue закинуть, чтоб такую опцию добавили?
homm Автор
15.11.2024 00:21Неправильно. Лучше все же прочитать статью )
А issue закинуть некуда, это не опенсорс. Если кто-то покажет статью разработчикам, буду рад.
ris58h
15.11.2024 00:21Показывает все то же самое, что MX Power Gadget, но без температуры и красивых графиков, только экстремальные значения за последнюю минуту.
Так и в чём отличие то кроме UI? В экстремальных значениях за минуту? В статье вы рассказываете о недостатках MXPG (энергопотребление), но не объясняете за счёт чего ваше решение выигрывает. Вы
powermetrics
один раз запускаете?А issue закинуть некуда, это не опенсорс.
TZPrototype
15.11.2024 00:21Спасибо за интересный материал! Кажется нашел занятие на выходные, написать power gadgets нормального человека)
Интересно, как можно ещё получать метрики системы, помимо вызова powermetrics? Он как никак больше похож на тулзу для конечного пользователя, нежели промежуточный инструмент.homm Автор
15.11.2024 00:21Можно посмотреть как это делает macmon. Но учитывайте, что он тоже это делает неправильно: https://github.com/vladkens/macmon/issues/10
skovpen
15.11.2024 00:21А решение не запускать powermetrics, а читать данные напрямую через системные функции не рассматривалось?
В https://github.com/exelban/stats это реализовано
ris58h
15.11.2024 00:21Возможно ли сделать то же самое shell-скриптом?
Установка через pip не самое удобное решение для маководов. Homebrew для этого подошел бы лучше.
homm Автор
15.11.2024 00:21Установка через pip не самое удобное решение для маководов. Homebrew для этого подошел бы лучше.
Эээ? Установка через homebrew:
brew install
. Установка через pip:pip install
¯ \ _ (ツ) _ / ¯
При этом
brew
ставится отдельно, pip уже стоит вместе с системой.
jonic
Симпатичное. А по сабжу, я в целом после перехода с i9 на m3 забыл об этом. Иногда шторм тупит и может начать жрать 148%, но я это чую по лишнему нагреву