mpstat
Утилизация по каждому CPU. Первый шаг при диагностике CPU bottleneck.
# Все CPU, каждую секунду
mpstat -P ALL 1
# Только агрегат, 5 итераций
mpstat 1 5
# Статистика прерываний по каждому CPU (/proc/interrupts и /proc/softirqs)
mpstat -P ALL -I ALL 1
Ключевые колонки: %usr (user), %sys (kernel), %iowait (ожидание I/O), %steal (отобрано гипервизором), %idle.
runqlen
eBPF: длина очереди планировщика. Показывает, сколько потоков ждут CPU.
# Гистограмма длины очереди, интервал 1 секунда
runqlen 1
# С разбивкой по CPU
runqlen -C 1
# 10 итераций
runqlen 1 10
Если очередь стабильно > 0, система насыщена по CPU.
offcputime
eBPF: анализ времени, проведённого потоками вне CPU (блокировки, I/O, сон). Комплемент к on-CPU профилированию.
# Off-CPU стеки для всей системы, 5 секунд
offcputime 5
# Только для конкретного PID
offcputime -p 1234 5
# Вывод в формате flame graph
offcputime -f 5 > /tmp/offcpu.stacks
# Далее: flamegraph.pl < /tmp/offcpu.stacks > offcpu.svg
# Минимальный порог — только блокировки > 1 мс
offcputime -m 1000 5
profile
eBPF: семплирование стеков CPU. Основа для flame graphs.
# Профилирование всей системы, 10 секунд
profile 10
# Только для конкретного PID, с частотой 99 Hz
profile -p 1234 -F 99 10
# Вывод в формате folded stacks (для flamegraph.pl)
profile -f 10 > /tmp/cpu.stacks
# Только ядро / только userspace
profile -K 10 # только kernel
profile -U 10 # только user
softirqs / hardirqs
eBPF: время, затраченное на программные и аппаратные прерывания.
# Время в softirq по типу, каждую секунду
softirqs 1
# Распределение (гистограмма) вместо средних
softirqs -d 1
# Аналогично для hardirq
hardirqs 1
hardirqs -d 1
Типичный use-case: высокий %si в mpstat → softirqs покажет, кто виноват (NET_RX, BLOCK, TIMER).
criticalstat
Измерение задержек критических секций ядра (preempt-off, irq-off). Для realtime и latency-sensitive нагрузок.
# Секции с выключенными прерываниями дольше 100 мкс (режим по умолчанию)
criticalstat -d 100
# То же для секций с выключенной вытесняемостью
criticalstat -p -d 100
top / atop / htop
Мониторинг процессов. Разные trade-off: top — встроен везде, htop — удобнее интерактивно, atop — ведёт историю.
# top: сортировка по CPU, batch mode (для скриптов)
top -b -n 1 -o %CPU | head -20
# htop: фильтр по имени процесса (интерактивно — F4)
htop -p $(pgrep -d, nginx)
# atop: ретроспективный анализ из лога
atop -r /var/log/atop/atop_20260227
# atop: запись лога каждые 10 секунд
atop -w /tmp/atop.log 10
ps / pidstat
Снимок процессов и статистика по PID.
# Процессы с наибольшим потреблением CPU
ps aux --sort=-%cpu | head -10
# Детальная статистика по процессу: CPU, memory, I/O, context switches
pidstat -p 1234 -u -r -d -w 1
# Все потоки процесса
pidstat -p 1234 -t 1
# Переключения контекста по всей системе (voluntary + involuntary)
pidstat -w 1
sched_ext 🟢
Подключаемые BPF-планировщики (kernel 6.12+). Позволяют менять алгоритм планирования без перекомпиляции ядра.
# Запуск scx_rusty (NUMA-aware планировщик)
scx_rusty
# scx_lavd — для десктопных нагрузок (latency-optimized)
scx_lavd
# scx_layered — многослойный, с правилами по cgroup/comm
scx_layered file:/etc/scx/layers.json
# Проверить, какой sched_ext активен
cat /sys/kernel/sched_ext/root/ops
scx_stats 🟢
Интроспекция активного sched_ext планировщика.
# Статистика активного планировщика через сервер scx_stats
scx_rusty --monitor 1
# Включён ли sched_ext
cat /sys/kernel/sched_ext/state
# Счётчики событий активного планировщика
cat /sys/kernel/sched_ext/root/events
Причину аварийного выключения печатает сам бинарник планировщика при выходе; тот же отладочный дамп доступен через tracepoint sched_ext_dump и по SysRq-D.
Связанные заметки
- Linux — средства диагностики производительности — обзорная карта инструментов
- Linux — мониторинг и отладка — методология и интерпретация метрик
- Linux — справочник команд: память — смежный слой диагностики
Из библиотеки института уносят только знания. Читателей здесь не считают: посещение не регистрируется, отметок в издании не остаётся, счётчиков нет ни у одного издания фонда.
Издание пополняется и пересверяется. Текст доступен на условиях CC BY-SA 4.0 — унесённое можно передавать дальше на тех же условиях.