Карта инструментов и сквозной разбор инцидента производительности

Рейтинг: 74.1% · 11 голосов
Подробный курс по диагностике и производительности Linux для админов и DevOps: с чего начать, методология USE, логи (journalctl, dmesg), процессы, CPU, память и OOM, диск и IO (iostat), сеть (ss, tcpdump), системные вызовы и strace, ltrace, perf, флеймграфы, ftrace, eBPF и bpftrace, lsof, мониторинг. Разбор каждого инструмента с чтением вывода.
Ответить
Аватара пользователя
Dmitry_SRE
Сообщения: 47
Зарегистрирован: 11 май 2026, 05:31

Карта инструментов и сквозной разбор инцидента производительности

Сообщение Dmitry_SRE »

Оглавление курса (47)
  1. С чего начать диагностику Linux: методология вместо паники
  2. Первые 60 секунд: экспресс-диагностика нагруженного сервера
  3. Методологии диагностики: USE, RED и здравый смысл
  4. Логи systemd через journalctl: где искать причину
  5. Где лежат логи Linux: /var/log, dmesg и rsyslog
  6. Источники правды: load average, /proc и /sys
  7. Процессы Linux: ps, pstree и состояния процессов
  8. Интерактивный мониторинг: top и htop
  9. Метрики процессов во времени: pidstat
  10. Приоритеты и ограничения: nice, ionice, cgroups
  11. Сигналы и зависшие процессы: kill, и что делать с D-state
  12. Загрузка CPU: user, system, iowait, steal и контекст-свитчи
  13. Диагностика CPU по ядрам: vmstat и mpstat
  14. Профилирование CPU: perf top и поиск пожирателя
  15. Частоты, троттлинг и NUMA: turbostat и numastat
  16. Память Linux: RSS, VSZ, page cache и миф о нехватке памяти
  17. Сколько памяти занято: free, /proc/meminfo и vmstat
  18. Поиск утечек и пожирателей памяти: smem, pmap, smaps
  19. Swap и подкачка: swapon, swappiness, когда своп - это боль
  20. OOM killer: кто и за что убил процесс
  21. Память ядра и slab: slabtop и куда уходит RAM
  22. Подсистема ввода-вывода: путь запроса от приложения до диска
  23. Диагностика диска: iostat и чтение await, %util
  24. Кто грузит диск: iotop и атрибуция io процессам
  25. Файловые системы: df, du, иноды и куда делось место
  26. Глубокая диагностика блочного слоя: blktrace и biolatency
  27. Кеш страниц и грязные данные: dirty pages, fsync, drop_caches
  28. Сетевой стек Linux: путь пакета и где возникают задержки
  29. Сокеты и соединения: ss и netstat
  30. Захват трафика: tcpdump для диагностики сети
  31. Задержки и потери в сети: ping, mtr, диагностика латентности
  32. Сеть как источник проблем: nftables, conntrack, дропы
  33. Что такое системный вызов и зачем его трассировать
  34. strace: трассировка системных вызовов на практике
  35. strace в бою: почему программа висит, падает или тормозит
  36. ltrace: трассировка вызовов библиотек
  37. Накладные расходы трассировки и безопасные альтернативы
  38. perf: универсальный профайлер Linux
  39. Флеймграфы: визуализация профиля производительности
  40. Трассировка ядра: ftrace и trace-cmd
  41. eBPF: революция в наблюдаемости Linux
  42. Инструменты eBPF на практике: BCC и bpftrace
  43. lsof: открытые файлы, дескрипторы, кто держит файл и порт
  44. Разбор кейса: приложение тормозит - пошаговая диагностика
  45. Непрерывный мониторинг: sar, node_exporter, Grafana, Zabbix
  46. Диагностика в контейнерах: cgroups, лимиты, Docker и Kubernetes
  47. Карта инструментов и сквозной разбор инцидента производительности (вы здесь)
Это финальный урок курса, и он не про новую утилиту. Он про то, как все 45 предыдущих уроков складываются в один навык - умение спокойно разобрать инцидент производительности от симптома до корневой причины. Знакомая боль: в три часа ночи приходит алерт "сервер тормозит", а ты сидишь и не знаешь, с какой команды начать. top? strace? tcpdump? Когда инструментов много, а методологии нет, диагностика linux превращается в случайное тыканье - открываешь пять терминалов и гадаешь. Этот урок дает тебе карту: какой инструмент к какому слою системы, и какой порядок действий гарантированно выводит на причину. Главное, что ты унесешь, - не список команд (он устареет), а способ думать, который работает и на ноутбуке, и на кластере из тысячи нод.

Карта инструментов Linux по подсистемам

Главную идею подарил Брендан Грегг (Brendan Gregg) - инженер, который нарисовал знаменитую карту инструментов наблюдаемости Linux (Linux Performance Observability Tools). Суть: система состоит из слоев (приложение, библиотеки, системные вызовы, ядро и его подсистемы, железо), и под каждый слой есть свои утилиты. Если держать эту карту в голове, анализ производительности linux перестает быть гаданием. Вот она по подсистемам, с актуальными на 2026 акцентами:
  • Приложение - что делает сам процесс. Инструменты: perf (профилирование стеков и flame graphs), strace (трассировка системных вызовов), ltrace (вызовы библиотек), gdb для точечной отладки.
  • Системные вызовы - граница между процессом и ядром. Тут strace, perf trace, а из eBPF - bpftrace и готовые инструменты execsnoop (новые процессы), opensnoop (какие файлы открываются), syscount (гистограмма вызовов).
  • Файловые системы и блочный слой - диски. iostat (статистика по устройствам), iotop (кто грузит диск), а на eBPF - biolatency (латентность блочного I/O гистограммой), biosnoop (каждый запрос с PID и временем), ext4slower/xfsslower (медленные операции ФС). blktrace остается, но в 2026 чаще берут eBPF - он легче и нагляднее.
  • Сеть - сокеты и пакеты. ss (состояние сокетов, давно заменил netstat), ip (интерфейсы и маршруты), tcpdump (захват пакетов), а на eBPF - tcplife (жизнь TCP-соединений с байтами и временем), tcpretrans (ретрансмиты без флуда tcpdump), tcpconnect.
  • Планировщик и память - top, vmstat, pidstat, free, slabtop. На eBPF - runqlat (задержка в очереди планировщика), runqlen, cachestat (попадания в page cache). Сюда же sar для исторической картины.
  • CPU - mpstat (загрузка по ядрам), perf (циклы, кэш-промахи, профиль по событиям PMU), turbostat (реальная частота, C-состояния, энергопотребление).
Запомни принцип: сначала найди подсистему-виновника (CPU, память, диск, сеть), и только потом доставай узкоспециальный инструмент. Не наоборот. Карта инструментов linux нужна именно для того, чтобы не лезть в tcpdump, когда на самом деле упирается диск. На 2026 заметь важный сдвиг: связка eBPF (bpftrace и инструменты bcc) на проде уже почти везде вытеснила тяжелый strace по горячим путям и часть perf-сценариев - она дает ту же глубину почти без накладных расходов.

Изображение

Методология USE: как не утонуть в утилитах

Карта отвечает на вопрос "чем смотреть", но не "что смотреть". Для этого есть метод USE того же Грегга. Расшифровка: Utilization (утилизация - доля времени, что ресурс занят работой), Saturation (насыщение - есть ли очередь работы, которую ресурс не успевает обработать), Errors (ошибки). Идея простая: для каждого ресурса проверь утилизацию, насыщение и ошибки. Как чек-лист пилота перед взлетом - быстро, полно, без пропусков. Грегг утверждает, что так решается большинство типовых проблем малыми усилиями, потому что ты системно обходишь все ресурсы, а не цепляешься за первый попавшийся график.

Самое важное для новичка - различать утилизацию и насыщение. Утилизация 100 процентов сама по себе не катастрофа: ресурс просто полностью используется, и это может быть желаемым (зачем платить за простаивающее железо). А вот насыщение - это очередь, ожидание, и именно оно превращается в тормоза для пользователя. Простой образ: касса в магазине. Кассир пробивает без перерыва - это утилизация 100 процентов. Очередь из десяти человек за кассой - это насыщение. Тормозит людей именно очередь, а не занятость кассира.

Где смотреть эти три метрики по ресурсам:
  • CPU: утилизация - mpstat -P ALL, top (поля us+sy); насыщение - load average и поле "r" в vmstat (число процессов в очереди на выполнение), точнее - runqlat из eBPF.
  • Память: утилизация - free -h, /proc/meminfo (важно: available, а не free); насыщение - своппинг (поля si/so в vmstat), срабатывания OOM-killer в dmesg или journalctl -k, и метрики PSI в /proc/pressure/memory.
  • Диск: утилизация и насыщение - iostat -xz (колонки %util, aqu-sz, await), а точнее по латентности - biolatency.
  • Сеть: утилизация - sar -n DEV, ip -s link; ошибки и дропы - ip -s link (errors, dropped), ss -s, nstat.
На 2026 добавился сильный помощник для насыщения - PSI (Pressure Stall Information) в /proc/pressure/{cpu,memory,io}. Поле avg10/avg60 показывает процент времени, что задачи стояли в ожидании ресурса. Это насыщение в чистом виде, одной цифрой, и его уже умеют читать современные системы мониторинга.

Сквозной разбор инцидента: linux мониторинг в бою

Теперь самое ценное - проживем инцидент целиком. Симптом: linux мониторинг прислал алерт, что веб-сервис отвечает с задержкой 2 секунды вместо обычных 50 мс. Идем по USE сверху вниз, не перепрыгивая шаги.

Шаг 1. Общая картина за 60 секунд. Грегг предлагает начинать с быстрого осмотра (его чек-лист "первых 60 секунд"). Запускаем vmstat с интервалом 1 секунда:

Код: Выделить всё

$ vmstat 1 5
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 2 18      0 198432  10220 540112    0    0    14   980  520 1100  4  3 12 81  0
 1 19      0 195880  10220 541004    0    0     8  1024  540 1180  5  4  9 82  0
Первую строку vmstat игнорируем - это средние с момента загрузки, смотрим со второй. Читаем по колонкам. r - очередь на CPU (2, мало, процессор не виноват). b - процессы в непрерывном сне состояния D (18-19, очень много - почти все ждут чего-то, обычно блочного I/O). si/so - своп в страницах в секунду (нули, память в порядке). И главное - wa (iowait) = 81-82 процента. Это доля времени, когда CPU простаивает, потому что нечего считать - все ждут диск. Норма - близко к нулю. 81 процент - красный флаг: система уперлась в диск. Колонка bo (блоки записаны на устройства) тоже высокая - подтверждает запись.

Шаг 2. Подтверждаем по дискам. Спускаемся на блочный слой:

Код: Выделить всё

$ iostat -xz 1 3
Device   r/s    w/s    rkB/s     wkB/s  r_await  w_await  aqu-sz  %util
nvme0n1 12.0  480.0    200.0  122000.0     1.20   198.50   92.30   99.80
Колонки разбираем по USE. w/s - 480 записей в секунду. w_await - среднее время записи 198 мс, и это сумма времени в очереди плюс обслуживание; для NVMe норма - доли миллисекунды, тут в сотни раз хуже. aqu-sz - средняя глубина очереди 92 (в старых версиях sysstat эта колонка звалась avgqu-sz; огромное насыщение, диск завален запросами). %util - 99.8 процента. Тут важный нюанс актуальный на 2026: для NVMe и SSD %util обманчив, потому что они обслуживают много запросов параллельно, и 100 процентов не значит "уперлись в потолок". Поэтому опорная метрика - не %util, а латентность (await) и очередь (aqu-sz). Здесь и await огромный, и очередь зашкаливает - значит диск действительно виновник, а не просто "загружен".

Шаг 3. Находим процесс. Кто пишет на диск:

Код: Выделить всё

$ sudo iotop -oP
  PID  PRIO  USER  DISK READ  DISK WRITE  COMMAND
 4412  be/4  www    0.00 B/s   118.20 M/s  php-fpm: pool www
 4418  be/4  www    0.00 B/s     3.10 M/s  php-fpm: pool www
Флаг -o (--only) показывает только активные процессы, -P (--processes) агрегирует по процессам, а не по потокам. Видим php-fpm пишет 118 МБ/с. Альтернатива без интерактива - pidstat -d 1, она даст ту же картину по PID во времени и удобнее для логов и скриптов. На eBPF тот же ответ дает biosnoop - он покажет каждый блочный запрос с PID.

Шаг 4. Что именно он пишет. Спускаемся на слой системных вызовов и трассируем процесс (флаги: -f включая потоки, -p подключиться к PID, -e trace фильтр по вызовам):

Код: Выделить всё

$ sudo strace -f -p 4412 -e trace=write
[pid 4412] write(7, "DEBUG: query took 0.4ms full row"..., 8192) = 8192
[pid 4412] write(7, "DEBUG: query took 0.5ms full row"..., 8192) = 8192
Вот и корневая причина. Приложение льет отладочный лог в файловый дескриптор 7. Что это за файл - смотрим ls -l /proc/4412/fd/7. Кто-то выкатил релиз с забытым DEBUG-логированием на каждый запрос, и поток записей утопил диск. На горячем проде вместо strace правильнее взять bpftrace одной строкой, чтобы не тормозить сервис:

Код: Выделить всё

$ sudo bpftrace -e 'tracepoint:syscalls:sys_enter_write /pid == 4412/ { @bytes = hist(args->count); }'
Цепочка симптом -> wa в vmstat -> очередь и await в iostat -> процесс в iotop -> вызов в strace/bpftrace привела нас от "сервис тормозит" до конкретной строки кода. Это и есть сквозная диагностика по карте инструментов и методу USE: ты не угадывал, ты последовательно спускался по слоям.

Типичные грабли и заблуждения
  • load average - это не загрузка CPU. В Linux в load average входят и процессы в состоянии D (ждут диск, состояние uninterruptible sleep). Высокий load при низком us/sy в top - почти всегда I/O, а не процессор. Чтобы увидеть это явно, смотри колонку wa и количество процессов в b в vmstat.
  • Высокий %util диска не значит "диск умирает". Для NVMe и SSD с параллельными очередями %util=100 может быть нормой. Смотри на await и aqu-sz, латентность важнее процента занятости. Это одна из главных ловушек, перешедших из эпохи вращающихся дисков.
  • strace тормозит цель. Он останавливает процесс на каждом системном вызове (механизм ptrace) и может замедлить горячий сервис в разы, иногда на порядок. На проде по горячим путям бери perf trace или bpftrace - они на порядки дешевле и не ставят процесс на паузу.
  • free показывает мало "free" - паника. Linux намеренно отдает свободную память под page cache (колонки buff/cache). Свободная память, которую можно отдать процессам, - это поле available в free -h, а не free. Низкий free при высоком available - норма.
  • Начинать с tcpdump. Классическая ошибка - сразу лезть в пакеты. Сначала USE по всем ресурсам, и только если виновата сеть - доставай захват, а лучше ss и tcpretrans, чтобы не утонуть в гигабайтах дампа.
Мини-лаба: повтори руками прямо сейчас

Не закрывай терминал, сделай это на любой тестовой машине (не на проде):
  • Запусти искусственную нагрузку на диск: dd if=/dev/zero of=/tmp/lab.bin bs=1M count=4096 oflag=direct (если direct не поддержан файловой системой, убери oflag).
  • В соседнем терминале смотри vmstat 1 - найди рост колонки wa и bo, и процессы в b.
  • Параллельно запусти iostat -xz 1 и понаблюдай %util, w_await, aqu-sz на своем диске - это твой шаг 2 из кейса вживую.
  • Если ядро 5.2 или новее и стоит bpftrace - запусти sudo bpftrace -e 'tracepoint:block:block_rq_complete { @ = hist(args->nr_sector); }' и посмотри гистограмму размеров запросов. Так выглядит eBPF-наблюдаемость.
  • Нагрузи CPU: yes > /dev/null & и поймай разницу - теперь в vmstat растут us и колонка r, а wa остается низким. Прочувствуй, чем CPU-bound отличается от I/O-bound. Не забудь kill %1.
  • Удали /tmp/lab.bin.
Чек-лист на инцидент, держи под рукой: 1) общий снимок (vmstat / top / dstat / журнал PSI) - какая подсистема горит; 2) USE по виновному ресурсу (утилизация, насыщение, ошибки); 3) найти процесс (pidstat, iotop, ss); 4) спуститься к причине (bpftrace / perf / strace); 5) проверить логи и dmesg (journalctl -k -p err, OOM, ошибки ФС); 6) зафиксировать гипотезу и проверить ее изменением (поменял одно - посмотрел эффект).

Куда расти дальше

Ты прошел путь от чтения логов до strace, perf и eBPF. Следующая ступень - книга Брендана Грегга "BPF Performance Tools" и его сайт brendangregg.com: там и полная карта инструментов наблюдаемости, и больше 150 готовых eBPF-утилит. Актуальная на 2026 деталь: классические инструменты bcc на Python считаются устаревшим способом, проект переехал на libbpf-tools (C + BTF + CO-RE) - это компактные бинарники без зависимостей, которые собираются один раз и работают на разных ядрах. Для CO-RE нужно ядро 5.2 или новее с включенным CONFIG_DEBUG_INFO_BTF, что в современных дистрибутивах с systemd уже по умолчанию (в Astra Linux и RED OS свежих веток - тоже, но версию ядра стоит проверить заранее). Дальше - в сторону наблюдаемости (метрики, трейсинг, Prometheus, Grafana, OpenTelemetry) и культуры SRE, где диагностика производительности linux становится не подвигом в три часа ночи, а рутиной с метриками, SLO и заранее заготовленными дашбордами. Карта и метод USE остаются с тобой - подсистемы и очереди работают одинаково везде.

Контрольные вопросы
  • Чем утилизация ресурса отличается от насыщения, и какая из этих метрик обычно и есть причина тормозов для пользователя?
  • В выводе vmstat ты видишь wa=80, r=1, si/so=0, много процессов в b. На какую подсистему это указывает и какой инструмент возьмешь следующим?
  • Почему по %util нельзя судить о пределе NVMe-диска, и на какие две колонки iostat смотреть вместо него?
  • Почему strace опасно запускать на горячем продакшен-процессе и чем его заменить в 2026?
Что запомнить

Инструментов много, но порядок один: карта Грегга подсказывает, чем смотреть на каждом слое, а метод USE (утилизация, насыщение, ошибки) - что именно проверять. Сначала находи подсистему-виновника по общему снимку, потом спускайся к процессу и к конкретному системному вызову, не перепрыгивая через шаги. Не начинай с узких инструментов и помни про цену strace на проде - по горячим путям бери eBPF. Высокий iowait - вниз к диску. Высокий load при низком CPU - тоже почти всегда диск. Для SSD и NVMe верь латентности (await) и очереди (aqu-sz), а не проценту %util. Методология бьет случайное тыканье каждый раз - и это главный итог всего курса.
👍4 ❤️1 🔥1 😄 🤔2
Аватара пользователя
thegod
Сообщения: 1
Зарегистрирован: 02 июн 2026, 22:11

Re: Карта инструментов и сквозной разбор инцидента производительности

Сообщение thegod »

Спасибо за курс, дочитал до финала. Раньше при алерте я реально открывал пять терминалов и тыкал наугад, а теперь хотя бы знаю: сначала vmstat, потом по слоям. Колонка wa - открытие, всю жизнь на нее не смотрел.
👍1 ❤️1 🔥1 😄 🤔
Аватара пользователя
solidity9
Сообщения: 1
Зарегистрирован: 30 май 2026, 18:21

Re: Карта инструментов и сквозной разбор инцидента производительности

Сообщение solidity9 »

Про %util на NVMe прям в точку, нас полгода вводила в заблуждение эта цифра 100 процентов. Перешли на await и aqu-sz в дашборде - сразу стало видно, где реальная очередь, а где просто диск занят полезной работой.
👍1 ❤️1 🔥1 😄 🤔
Ответить
← Предыдущая глава
Диагностика в контейнерах: cgroups, лимиты, Docker и Kubernetes

Все главы курса «Диагностика и производительность Linux: логи, strace, perf и eBPF»

Поделиться темой: ✈ Telegram VK
Похожие запросы: с чего начать диагностику linux когда сервер тормозит

Вернуться в «Диагностика и производительность Linux: логи, strace, perf и eBPF»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость