Зачем я написал ещё одну утилиту мониторинга CPU для Мака
Привет, чат. Хочу во-первых рассказать вам историю разочарования в довольно известной утилите мониторинга потребления энергии и загрузки CPU для macOS — MX Power Gadget. А во-вторых, поделиться очень простой заменой, которую я собрал за пару вечеров — pgauge.
Я часто что-то тестирую и такие метрики как потребление электричества, частота и загрузка CPU нередко бывают полезными при бенчмарках. Кроме того, я ненавижу когда какая-то фоновая задача или что похуже вдруг начинает греть ноутбук и разряжать батарею. У меня даже был случай, когда я купил переходник USB-C и оказалось, что пока он вставлен, процессор потребляет лишние два Ватта! Я думаю, что для многих моя дотошность в этом вопросе может даже показаться фанатичной. Считайте это ОКР.
В то же время, я не хочу использовать для этих целей командный центр, мне часто нужны вполне конкретные простые метрики. Раньше (когда трава была зеленая, а процессоры в макбуках синие), я использовал Intel Power Gadget. И когда я Эпл перешла архитектуру ARM, я грустил, но не долго, потому что быстро нашлась замена — MX Power Gadget.
MX Power Gadget
Она показывает отдельно потребление электричества CPU, GPU и вместе. Частоту и утилизацию отдельно по разным типам ядер. Ну и температуру до кучи. Ещё и графики какие красивые строит, лепота! Но не спешите очаровываться, сейчас я расскажу вам, почему это это всё чушь)
Обратите внимание, на то что в простое (а я специально сделал скриншот, когда компьютер был в простое) потребление CPU 5 — 10 милливатт (если закрыть все приложение, может быть вообще 1). И это с учетом того, что сама утилита тоже работает и рисует графики. Ну потрясающе же, показывает точные значения и ещё и сама практически ничего не потребляет!
В общем пользовался я этой утилитой часто и подолгу держал открытой во время работы (т.к. она показывает графики только с момента запуска), в том числе при работе от батареи.
А ещё есть встроенная в 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.
Устанавливается через pip, запускается как отдельной командой, так и как модуль питона python -m pgauge
. Показывает все то же самое, что MX Power Gadget, но без температуры и без красивых графиков, только экстремальные значения за последнюю минуту. Просто и со вкусом. Естественно сам по себе почти ничего не потребляет.
К сожалению требует пароля администратора, но можно добавить в sudoers правило для запуска powermetrics
, чтобы не водить его каждый раз.
echo `whoami` "ALL=(ALL) NOPASSWD: /usr/bin/powermetrics *" | sudo tee /etc/sudoers.d/powermetrics
На этом всё. Пишите пожелания и замечания по pgauge
и какие были проблемы с выводом значений на вашем процессоре, что смогу — исправлю.