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

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

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

MX Power Gadget
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)


  1. jonic
    15.11.2024 00:21

    Симпатичное. А по сабжу, я в целом после перехода с i9 на m3 забыл об этом. Иногда шторм тупит и может начать жрать 148%, но я это чую по лишнему нагреву


  1. ris58h
    15.11.2024 00:21

    Я правильно понял что вы делаете тоже самое что и MXPG, но с меньшей частотой? Не проще было им issue закинуть, чтоб такую опцию добавили?


    1. homm Автор
      15.11.2024 00:21

      Неправильно. Лучше все же прочитать статью )

      А issue закинуть некуда, это не опенсорс. Если кто-то покажет статью разработчикам, буду рад.


      1. ris58h
        15.11.2024 00:21

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

        Так и в чём отличие то кроме UI? В экстремальных значениях за минуту? В статье вы рассказываете о недостатках MXPG (энергопотребление), но не объясняете за счёт чего ваше решение выигрывает. Вы powermetrics один раз запускаете?

        А issue закинуть некуда, это не опенсорс.

        support@seense.com


        1. homm Автор
          15.11.2024 00:21

          Один раз и читаю показания которые выводятся в stdout


          1. ris58h
            15.11.2024 00:21

            Стоит это указать в статье. Читателю сразу станет понятно как и за счёт чего выше решение лучше.


  1. TZPrototype
    15.11.2024 00:21

    Спасибо за интересный материал! Кажется нашел занятие на выходные, написать power gadgets нормального человека)
    Интересно, как можно ещё получать метрики системы, помимо вызова powermetrics? Он как никак больше похож на тулзу для конечного пользователя, нежели промежуточный инструмент.


    1. homm Автор
      15.11.2024 00:21

      Можно посмотреть как это делает macmon. Но учитывайте, что он тоже это делает неправильно: https://github.com/vladkens/macmon/issues/10


  1. skovpen
    15.11.2024 00:21

    А решение не запускать powermetrics, а читать данные напрямую через системные функции не рассматривалось?


    В https://github.com/exelban/stats это реализовано


    1. homm Автор
      15.11.2024 00:21

      Не увидел в stats частоты ядер и потребление мощности в ваттах


  1. ris58h
    15.11.2024 00:21

    1. Возможно ли сделать то же самое shell-скриптом?

    2. Установка через pip не самое удобное решение для маководов. Homebrew для этого подошел бы лучше.


    1. homm Автор
      15.11.2024 00:21

      Установка через pip не самое удобное решение для маководов. Homebrew для этого подошел бы лучше.

      Эээ? Установка через homebrew: brew install. Установка через pip: pip install

      ¯ \ _ (ツ) _ / ¯

      При этом brew ставится отдельно, pip уже стоит вместе с системой.


      1. ris58h
        15.11.2024 00:21

        pip уже стоит вместе с системой

        ris@ris-mbp ~ % pip
        zsh: command not found: pip


        1. homm Автор
          15.11.2024 00:21

          Попробуйте pip3 или python -m pip или python3 -m pip. Что-то из этого должно сработать