Важная вводная по железу 2026 года. На Apple Silicon (M-серия) у тебя не классический x86 с одним типом ядер. Там big.LITTLE: производительные ядра (P-cores, кластер обычно зовётся ANE0/P-cluster) и энергоэффективные (E-cores). Плюс GPU и ANE - Apple Neural Engine, отдельный блок для ML. powermetrics видит все три. На macOS 26 Tahoe (последний релиз с поддержкой Intel, дальше только Apple Silicon) часть классических инструментов вроде dtrace зажата SIP, а часть samc-сэмплеров просто исчезла. Учитываем это сразу.
powermetrics - главный инструмент для mac производительности
powermetrics - это утилита Apple, которая читает аппаратные счётчики энергии, частоты P-state, загрузку по кластерам, тепловое давление и состояние сна. Требует root, потому что лезет к защищённым счётчикам ядра. Без sudo получишь отказ.
Базовый запуск - один срез за 5 секунд и выход:
Код: Выделить всё
sudo powermetrics -n 1 -i 5000
Самое полезное - выбирать конкретные сэмплеры через --samplers (короткий ключ -s). Посмотрим энергию CPU и GPU плюс сводку по процессам:
Код: Выделить всё
sudo powermetrics --samplers cpu_power,gpu_power -i 1000 -n 1
Код: Выделить всё
**** Processor usage ****
E-Cluster Power: 41 mW
E-Cluster HW active frequency: 1024 MHz
E-Cluster HW active residency: 18.43%
P-Cluster Power: 1872 mW
P-Cluster HW active frequency: 3204 MHz
P-Cluster HW active residency: 64.10%
CPU 4 frequency: 3036 MHz
CPU 4 active residency: 52.18% ...
ANE Power: 0 mW
GPU Power: 95 mW
Combined Power (CPU + GPU + ANE): 2008 mW
Тепловое давление - отдельный сэмплер, и это ключ к троттлингу на Apple Silicon:
Код: Выделить всё
sudo powermetrics -s thermal -i 1000 -n 1
Код: Выделить всё
**** SMC sensors ****
Current pressure level: Nominal
Хочешь увидеть, кто именно тратит энергию по процессам - добавь сэмплер tasks:
Код: Выделить всё
sudo powermetrics -s tasks --show-process-energy -i 2000 -n 1
Грабли powermetrics. Сэмплер smc на свежих Mac убрали - не пиши его, получишь "unrecognised sampler". На Intel-машинах набор сэмплеров другой (есть smc, нет E/P-кластеров). Не путай мгновенное значение thermal (срез на конце окна) с усреднёнными по окну энергией и частотами.

Память и своп: vm_stat без иллюзий
vm_stat (через подчёркивание, не vmstat как в Linux - это BSD) показывает виртуальную память в страницах. Размер страницы на Apple Silicon - 16 КБ (на Intel был 4 КБ), и это важно для расчётов.
Код: Выделить всё
vm_stat
Код: Выделить всё
Mach Virtual Memory Statistics: (page size of 16384 bytes)
Pages free: 45213.
Pages active: 812904.
Pages inactive: 798210.
Pages wired down: 201554.
Pages occupied by compressor: 331290.
Swapins: 1204553.
Swapouts: 1840221.
Для динамики гоняй с интервалом - первый аргумент это секунды:
Код: Выделить всё
vm_stat 2
Что делает процесс прямо сейчас: fs_usage, sample
Процесс завис или непонятно молотит диск - смотрим его системные вызовы. fs_usage в реальном времени показывает файловые и сетевые операции. Нужен sudo, и обязательно ограничивай по процессу, иначе захлебнёшься потоком.
Код: Выделить всё
sudo fs_usage -w -f filesys Safari
Код: Выделить всё
14:22:09 open F=23 /Users/u/Library/Caches/... 0.000042 Safari
14:22:09 read F=23 B=0x4000 0.000018 Safari
14:22:09 stat64 /Applications/Safari.app/... 0.000009 Safari
Когда процесс не завис намертво, а просто тупит - снимай sample (это "sample mac"-инструмент профайлинга по статистике). Он сэмплирует стеки указанного процесса N секунд и строит дерево вызовов:
Код: Выделить всё
sample Safari 5 -file /tmp/safari.txt
Зависшее приложение: spindump и поиск утечек
Если sample - про один процесс, то spindump - тяжёлая артиллерия для системных зависаний. Когда приложение не отвечает (beachball), macOS сама делает spindump и кладёт отчёт в /Library/Logs/DiagnosticReports/. Запустить вручную:
Код: Выделить всё
sudo spindump Final\ Cut\ Pro 10 -file /tmp/fcp.spindump
Код: Выделить всё
Thread 0x... DispatchQueue 1 Thread name "main"
1000 ??? (in AppKit) ...
1000 -[NSApplication run] ...
1000 mach_msg_trap ... (blocked)
Связка инструментов под задачу:
- Activity Monitor показал высокий CPU у процесса -> sample на этот процесс, смотрим горячую функцию.
- Приложение крутит beachball -> spindump, смотрим где застрял main-поток.
- Процесс молотит диск -> fs_usage -f filesys, смотрим повторяющиеся syscall.
- Батарея садится в простое -> powermetrics -s tasks --show-process-energy, ищем Energy Impact.
- Тормоза при свопе -> vm_stat 2, смотрим swapouts.
Код: Выделить всё
sudo dtruss -p 1234
Энергия, батарея и тяжёлая артиллерия Instruments
Что грузит батарею, помимо powermetrics, показывает pmset - менеджер питания:
Код: Выделить всё
pmset -g
pmset -g assertions
pmset -g log | grep -i wake
Когда нужен графический профайлер с микросекундной точностью - это Instruments из состава Xcode (instruments mac - стандартный поисковый запрос разработчиков). Это GUI поверх движка DTrace и собственных трасс. Ключевые инструменты:
- Time Profiler - сэмплирует стеки во времени, тот же принцип что sample, но с временной шкалой и фильтрами по потокам. Главный инструмент против тормозов CPU.
- Allocations - все аллокации памяти, размеры, кто и где выделил. Ловит раздувание памяти.
- Leaks - детектор настоящих утечек: объекты, на которые потеряны все ссылки. Идёт в паре с Allocations.
- Energy Log / CPU Counters - энергопрофиль, привязанный к коду, по тем же принципам что powermetrics, но с привязкой к функциям.
Мини-лаба: снимаем рентген за пять минут
Сделай руками, по шагам:
- Запусти sudo powermetrics --samplers cpu_power,gpu_power -i 1000 -n 3 и найди P-Cluster Power и frequency. Открой тяжёлую вкладку в браузере, повтори - увидь, как выросла мощность и частота.
- В одном окне запусти sudo powermetrics -s thermal -i 1000, в другом запусти стресс: yes > /dev/null & (несколько раз, по числу ядер). Смотри, как pressure уходит от Nominal. Потом убей нагрузку: killall yes.
- Сделай vm_stat, запиши Swapouts. Открой пару тяжёлых приложений, повтори. Посчитай дельту в страницах и переведи в мегабайты (страница 16384 байт).
- Выбери любое работающее приложение и сними sample ИмяПриложения 5 -file /tmp/s.txt. Открой файл, найди heavy-дерево и топовую функцию.
- Запусти sudo fs_usage -w -f filesys ИмяПриложения и поработай в приложении - поймай его реальные файловые вызовы. Останови по Ctrl-C.
- Глянь pmset -g assertions - кто сейчас мешает Mac уснуть.
- Чем отличается мгновенное значение thermal pressure от значений энергии и частоты в выводе powermetrics, и почему это важно при диагностике троттлинга?
- Ты видишь в vm_stat большой и растущий compressor, но swapouts почти не меняются. Это проблема нехватки памяти или нет? Обоснуй.
- Приложение крутит beachball. Какой инструмент возьмёшь - sample или spindump - и что конкретно будешь искать в отчёте?
- Почему на Apple Silicon под SIP dtruss часто бесполезен, и чем его заменить для большинства задач трассировки?
Глубокая диагностика Mac - это не магия, а конкретный набор: powermetrics для энергии, частот, ANE и теплового давления (всегда sudo, выбирай сэмплеры); vm_stat для памяти и свопа (страница 16 КБ, следи за swapouts); fs_usage для файловых вызовов процесса; sample для горячих функций одного процесса; spindump для системных зависаний и застрявшего main-потока; pmset для батареи и сна; Instruments, когда нужен GUI-профайлер с привязкой к коду. dtrace и dtruss держи в уме, но помни про SIP. Эти инструменты превращают расплывчатое "тормозит и греется" в точный диагноз - процесс, стек, syscall, ватт.