Зачем я написал ещё одну утилиту мониторинга CPU для Мака

Привет, чат. Хочу во-первых рассказать вам историю разочарования в довольно известной утилите мониторинга потребления энергии и загрузки CPU для macOS — MX Power Gadget. А во-вторых, поделиться очень простой заменой, которую я собрал за пару вечеров — pgauge.

Я часто что-то тестирую и такие метрики как потребление электричества, частота и загрузка CPU нередко бывают полезными при бенчмарках. Кроме того, я ненавижу когда какая-то фоновая задача или что похуже вдруг начинает греть ноутбук и разряжать батарею. У меня даже был случай, когда я купил переходник USB-C и оказалось, что пока он вставлен, процессор потребляет лишние два Ватта! Я думаю, что для многих моя дотошность в этом вопросе может даже показаться фанатичной. Считайте это ОКР.

В то же время, я не хочу использовать для этих целей командный центр, мне часто нужны вполне конкретные простые метрики. Раньше (когда трава была зеленая, а процессоры в макбуках синие), я использовал Intel Power Gadget. И когда я Эпл перешла архитектуру ARM, я грустил, но не долго, потому что быстро нашлась замена — MX Power Gadget.

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 почему-то показывал около двух ватт.

b6654f7cb0f72110d7c6f83b4e5a37f9.png

При этом, если закрыть MX Power Gadget, то показания powermetrics тоже становились околонулевыми. А если открыть, то снова около двух. Сперва я подумал что это какой-то баг. Две утилиты мониторинга запущены одновременно, мало ли, какие это дает сайд-эффекты. Но сомнения закрались, я решил попробовать разобраться.

На всякий случай я открыл Activity Monitor, он не показывал никаких процессов, потребляющий CPU, кроме фоновой мелочи. Но я ввел в поиск powermetrics и снова увидел странное.

429b1dc953e4aefeca42f7699f4c0ef3.png

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.

939cf99a52b595492c255003cfddb71d.png

Устанавливается через pip, запускается как отдельной командой, так и как модуль питона python -m pgauge. Показывает все то же самое, что MX Power Gadget, но без температуры и без красивых графиков, только экстремальные значения за последнюю минуту. Просто и со вкусом. Естественно сам по себе почти ничего не потребляет.

К сожалению требует пароля администратора, но можно добавить в sudoers правило для запуска powermetrics, чтобы не водить его каждый раз.

echo `whoami` "ALL=(ALL) NOPASSWD: /usr/bin/powermetrics *" | sudo tee /etc/sudoers.d/powermetrics

На этом всё. Пишите пожелания и замечания по pgauge и какие были проблемы с выводом значений на вашем процессоре, что смогу — исправлю.

© Habrahabr.ru