Методологии диагностики: USE, RED и здравый смысл

Рейтинг: 60.1% · 14 голосов
Подробный курс по диагностике и производительности 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

Методологии диагностики: USE, RED и здравый смысл

Сообщение 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. Карта инструментов и сквозной разбор инцидента производительности
Знакомая картина: сервер тормозит, в чате паника, и ты начинаешь лихорадочно открывать top, потом htop, потом смотришь логи, потом перезапускаешь сервис "на всякий случай", потом гуглишь "linux тормозит что делать". Через час ты устал, проблема не ушла, а в голове каша из десятка метрик, которые ты не связал между собой. Это не диагностика. Это паническое тыканье.

В прошлом уроке мы говорили про логи и первый взгляд на систему. Сегодня - про то, как вообще НЕ паниковать. Методология - это просто заранее заготовленный маршрут, по которому ты идёшь, когда всё горит. Чтобы анализ производительности Linux был не лотереей, а предсказуемой процедурой: пришёл, проверил по списку, нашёл узкое место. Хороший метод экономит не минуты, а часы - потому что не даёт тебе застрять в первом попавшемся подозрении.

Разберём два рабочих подхода - USE и RED, посмотрим на их связь с "золотыми сигналами" Google, и научимся не наступать на классические грабли. Всё актуально на 2026 год.

Метод USE: как смотреть на железо и ресурсы

USE придумал Brendan Gregg, инженер по производительности (бывший Netflix, до этого Sun/Joyent). Идея гениально простая. Для КАЖДОГО ресурса системы проверь три вещи:
  • U - Utilization (загрузка): какую долю времени ресурс был занят работой. Диск был занят обслуживанием запросов 90% времени - утилизация 90%.
  • S - Saturation (насыщение): сколько работы стоит в очереди и НЕ может быть обслужено прямо сейчас. Это длина очереди. Ресурс может быть загружен на 100%, но если очереди нет - он справляется. А вот очередь - это уже боль.
  • E - Errors (ошибки): счётчики ошибок. Сбойные пакеты, ошибки диска, отброшенные соединения, события OOM.
Сам Gregg описывает USE как "аварийный чек-лист": как в авиационном руководстве - простой, полный и быстрый. Цель - проверить здоровье "большой четвёрки" ресурсов (CPU, память, диск, сеть), ничего не пропустив. Ты буквально берёшь список физических ресурсов сервера и проходишь по нему. Метод хорош именно тем, что не даёт зациклиться на CPU, забыв проверить диск.

Вот таблица USE для основных ресурсов - её стоит держать перед глазами, пока не выучишь:

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

Ресурс   | Utilization        | Saturation                | Errors
---------+--------------------+---------------------------+-------------------------
CPU      | %usr+%sys (mpstat) | r в vmstat > числа vCPU    | редко (MCE в dmesg)
Память   | used/total (free)  | si/so в vmstat, swap, PSI  | OOM-killer в dmesg/journal
Диск     | %util в iostat     | aqu-sz, await в iostat,PSI | errors в smartctl, dmesg
Сеть     | RX/TX bytes (sar)  | дропы, overruns, backlog   | errors в ip -s link
PSI (Pressure Stall Information) в таблице - это современная (с ядра 4.20, на 2026 уже везде) метрика из /proc/pressure/{cpu,memory,io}. Она прямо отвечает на вопрос USE про насыщение: показывает, сколько процентов времени задачи стояли в ожидании ресурса. Про неё ниже.

Главная мысль, которую новичок часто упускает: загрузка и насыщение - РАЗНЫЕ вещи. 100% загрузки CPU - это нормально, если работа делается и очередь пустая. А вот очередь из 8 процессов на 4 ядрах - это уже тревога, даже если "процент" выглядит не так страшно.

Изображение

Практика: читаем USE-метрики по полям

Хватит теории. Берём vmstat - первый инструмент диагностики Linux, который показывает USE сразу по CPU и памяти. Запускаем с интервалом 1 секунда (первая строка - средние с момента загрузки, её игнорируй, смотри на последующие):

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

$ vmstat 1
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 9  0      0 124680  43120 980240    0    0     2     6  140  220 71 14 14  1  0
Разбираем по колонкам - это и есть USE глазами:
  • r - число процессов в очереди на CPU (готовы бежать прямо сейчас, ждут ядро). Это САТУРАЦИЯ процессора. Здесь r=9. Если у тебя 4 vCPU, а r стабильно 9 - процессор перегружен, задачи стоят в очереди. Важно: на 2026 в современных ядрах r НЕ включает процессы в непрерывном сне (D-state) - они идут в b. Это исправили давно, но старые статьи всё ещё путают.
  • b - процессы, заблокированные в ожидании (обычно ввод-вывод, uninterruptible sleep). Если b большое, а CPU простаивает - проблема не в процессоре, а в диске или сети.
  • si/so - swap in/out, килобайты в секунду. Это насыщение памяти. На здоровой системе тут НОЛИ. Любые ненулевые si/so под нагрузкой - сигнал, что памяти не хватает и система своппит. Заметь: используемый объём swap (колонка swpd) сам по себе не страшен - тревожен именно поток si/so прямо сейчас.
  • us/sy/id/wa/st - проценты CPU: пользовательский код / ядро / простой / ожидание ввода-вывода / steal (украдено гипервизором). us=71 sy=14 id=14 - процессор реально работает. Если бы id был 80, а тормозило - искать надо не тут. Высокий wa - упёрлись в диск. Высокий st на виртуалке (выше 5-10%) - сосед по гипервизору ест твоё время, и это не лечится изнутри VM.
Теперь диск. iostat показывает утилизацию и насыщение по устройствам (флаг -x - расширенная статистика, -z прячет нулевые устройства):

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

$ iostat -xz 1
Device   r/s   w/s   rkB/s   wkB/s  r_await  w_await  aqu-sz  %util
nvme0n1  12.0  340.0  192.0  44800.0   0.42    8.10     2.85   98.7
Ключевые поля (имена даны по sysstat 12.x, актуально на 2026):
  • %util - доля времени, когда к устройству шли запросы (утилизация полосы). 98.7% - устройство почти всегда занято. ВНИМАНИЕ, классическая ловушка: для HDD близкое к 100% значит насыщение, а вот для NVMe/SSD и RAID-массивов %util НЕ отражает реальный предел - они обслуживают запросы параллельно. NVMe может показывать 99% util и при этом иметь огромный запас. Поэтому на флеше смотри не на %util, а на aqu-sz и await.
  • aqu-sz - средняя длина очереди запросов (в старых версиях называлась avgqu-sz). Это САТУРАЦИЯ диска. Считается как сумма очереди планировщика и запросов "в полёте" в устройстве. 2.85 - в среднем почти 3 запроса в очереди. Растёт - диск не успевает.
  • r_await / w_await - среднее время обслуживания запроса чтения/записи в миллисекундах, ВКЛЮЧАЯ ожидание в очереди. w_await=8.10 мс для NVMe многовато (нормальный NVMe отвечает за доли мс - единицы мс), для HDD это норма. Это и есть latency, задержка, до которой мы ещё дойдём в курсе.
Сеть и ошибки - смотрим счётчики интерфейса:

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

$ ip -s link show eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 ...
    RX:  bytes packets errors dropped  missed   mcast
    8123456   45012      0      127       0       3
    TX:  bytes packets errors dropped carrier collsns
    6712345   38900      0       0       0       0
Колонки errors и dropped - это буква E в USE. errors=0 - хорошо. А вот dropped=127 на приёме - пакеты отброшены (часто из-за переполнения сокетных или кольцевых буферов, то есть насыщения). Это повод копать в сетевой стек: посмотреть ss -s, nstat, очереди драйвера через ethtool -S.

Современная альтернатива - PSI, единый взгляд на насыщение по всем ресурсам сразу:

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

$ cat /proc/pressure/io
some avg10=12.34 avg60=8.01 avg300=3.20 total=...
full avg10=4.10  avg60=2.50 avg300=1.05 total=...
$ cat /proc/pressure/cpu
some avg10=0.50  avg60=0.30 avg300=0.10 total=...
avg10=12.34 для io означает: за последние 10 секунд задачи в среднем 12.34% времени стояли в ожидании диска. Ноль - идеал, устойчивый рост - насыщение. PSI - это, по сути, метрика Saturation из USE, отдаваемая ядром напрямую. На 2026 её собирают cgroup v2 (по умолчанию во всех свежих дистрибутивах) и современные мониторинги.

Метод RED: когда смотрим на сервис, а не на железо

USE отлично работает для ресурсов. Но он почти ничего не говорит про то, ЧТО чувствует пользователь твоего API. Здесь нужен RED, его сформулировал Tom Wilkie (на тот момент Weaveworks, ныне Grafana Labs) по мотивам "четырёх золотых сигналов" Google SRE. RED смотрит не на ресурс, а на сервис - на HTTP-эндпоинт, на очередь, на gRPC-метод:
  • R - Rate: сколько запросов в секунду обрабатывает сервис (RPS).
  • E - Errors: сколько из них завершились ошибкой (5xx, таймауты, ненулевой gRPC-код).
  • D - Duration: распределение времени ответа. Не среднее! Среднее врёт. Смотри перцентили: p50, p95, p99.
Откуда "золотые сигналы"? Google в SRE-практике выделяет четыре: latency, traffic, errors, saturation. RED - это их адаптация под request-driven сервисы (Wilkie взял latency/traffic/errors, переименовав в Duration/Rate/Errors, и осознанно выкинул saturation - его закрывает USE на уровне ресурсов). Так что USE и RED не конкуренты, а две половины одной картины.

Связь простая. USE отвечает на вопрос "ПОЧЕМУ медленно" (упёрлись в диск, кончилась память). RED отвечает на "НАСКОЛЬКО плохо пользователю" (95% запросов отвечают за 2 секунды вместо 200 мс). На практике их используют вместе: RED показал, что у сервиса вырос p99 и полезли 503-и - идёшь по USE и находишь, что диск в насыщении. RED - симптом, USE - причина.

Почему перцентили, а не среднее? Представь: 99 запросов по 10 мс и один за 5 секунд. Среднее - около 60 мс, выглядит отлично. Но один реальный пользователь ждал 5 секунд и ушёл. p99 эту боль покажет, а среднее её спрячет. И ещё тонкость: p99 одного запроса в цепочке из 10 микросервисов превращается в почти гарантированную медленноту хотя бы где-то - "хвосты" складываются. Запомни это намертво.

Антиметодологии: как НЕ надо (и почему мы все так делаем)

Прежде чем хвалить методы, признаем грехи. Brendan Gregg описал несколько "антиметодологий" - способов тратить время впустую:
  • Метод уличного фонаря (street light). Анекдот: пьяный ищет ключи под фонарём не потому, что там их потерял, а потому что там светло. Так и мы: запускаем top, потому что умеем top, а не потому что проблема в CPU. Смотрим туда, где привычно, а не туда, где проблема.
  • Случайное изменение (random change). Меняем параметр наугад ("а давай увеличим воркеров"), смотрим, не полегчало ли, откатываем, меняем следующий. Иногда срабатывает случайно - и это худшее, что может быть, потому что причину ты не понял, и она вернётся.
  • Метод обвинения соседа (blame-someone-else). "Это сеть", "это база", "это не мой код" - и тикет улетает в чужую команду без единого доказательства.
USE и RED лечат именно это: они заставляют идти по полному списку ресурсов и сервисов, а не по тому, что первым пришло в голову. Это и есть здравый смысл, оформленный в чек-лист.

Когда какой метод и куда он ведёт дальше

Простое правило выбора. Жалоба от пользователя или алерт по SLO ("API тормозит", "ошибки выросли") - заходи через RED, он на языке сервиса. Тревога от инфраструктуры или "весь хост колом" - заходи через USE, он на языке железа. В реальном инциденте маршрут обычно такой: RED ловит симптом -> USE локализует ресурс-виновник -> дальше идут инструменты глубокого анализа.

И вот тут важная актуализация на 2026. Раньше после USE сразу шли в strace и perf. Сегодня связка другая:
  • strace всё ещё полезен для одного процесса, но он тормозит цель (каждый syscall - ловушка). Для системного трейсинга его вытесняет eBPF.
  • eBPF дозрел: минимальное требование - ядро 5.4+ с включённым BTF, что на современных дистрибутивах (и 6.x в целом) есть из коробки. bpftrace для однострочников, BCC-инструменты для сложных утилит.
  • Готовые bcc/bpftrace-инструменты ложатся прямо на USE: biolatency и biosnoop (задержки диска вместо гадания по iostat), execsnoop (кто и что запускает), tcplife и tcpretrans (сетевые соединения и ретрансмиты), runqlat (та самая сатурация CPU - сколько задачи ждут в очереди планировщика), oomkill. По сути это USE с точностью до отдельного события.
perf никуда не делся - он по-прежнему лучший для CPU-профилирования и flame graphs. Просто теперь у тебя есть выбор инструмента под слой. USE/RED дают карту, eBPF и perf - лупу. Этим инструментам посвящены следующие уроки.

Мини-лаба: пройди USE руками прямо сейчас

Открой терминал на любой Linux-машине (можно на своей рабочей) и сделай полный проход USE по CPU, памяти и диску:
  • Запусти vmstat 1, дай поработать 10 секунд. Найди колонки r, b, si, so, wa. Запиши: процессор насыщен (r > числа vCPU)? Память своппит (si/so > 0)?
  • Узнай число ядер: nproc. Сравни с колонкой r.
  • Запусти iostat -xz 1 (если нет - sudo apt install sysstat или sudo dnf install sysstat). Найди %util, aqu-sz и w_await по своему диску.
  • Глянь насыщение через ядро: cat /proc/pressure/io и cat /proc/pressure/cpu. Запомни значения avg10 в покое.
  • Посмотри ошибки сети: ip -s link. Есть ненулевые errors или dropped?
  • Создай нагрузку и смотри, как метрики меняются. В одном окне stress-ng --cpu 4 --timeout 20s (или просто yes > /dev/null и потом Ctrl+C), в другом следи за vmstat. Увидишь, как растёт r, падает id, а в /proc/pressure/cpu подскакивает avg10.
  • Бонус, если есть eBPF: sudo runqlat (из bcc-tools) во время нагрузки CPU - увидишь гистограмму времени ожидания в очереди планировщика. Это та самая сатурация из USE, но в микросекундах.
Заметка для отечественных дистрибутивов: на Astra Linux и RED OS всё это работает один в один, пакет sysstat ставится штатно. PSI и cgroup v2 на их актуальных ядрах присутствуют. dmesg и доступ к eBPF могут требовать sudo и зависят от настроек безопасности - на Astra с включённым мандатным контролем доступа тем более.

Контрольные вопросы
  • Чем утилизация (Utilization) отличается от насыщения (Saturation)? Почему 100% загрузки CPU - это не всегда проблема?
  • Почему на NVMe-диске нельзя ориентироваться на %util как на признак перегрузки, и на какие поля iostat смотреть вместо него?
  • Какая колонка vmstat показывает насыщение CPU, а какая - насыщение памяти? Что считать тревожным значением?
  • Почему для метрики Duration в RED берут перцентили (p95, p99), а не среднее время ответа? Откуда RED заимствовал свои сигналы?
Что запомнить

USE - для ресурсов: по каждому (CPU, память, диск, сеть) проверь Utilization, Saturation, Errors. RED - для сервисов: Rate, Errors, Duration по перцентилям; оба растут из "четырёх золотых сигналов" Google. USE говорит почему медленно, RED - насколько больно пользователю. Загрузка и насыщение - не одно и то же: смотри на очереди (r в vmstat, aqu-sz в iostat) и на PSI в /proc/pressure, а не только на проценты; на флеше %util вообще обманчив. И главное - не ищи ключи под фонарём. Заведи чек-лист и иди по нему. На 2026 карту дают USE и RED, а лупу - eBPF (bpftrace/BCC) и perf, которые мы разберём в следующих уроках, чтобы анализ производительности Linux перестал быть лотереей.
👍7 ❤️1 🔥1 😄 🤔
Аватара пользователя
matt1102
Сообщения: 1
Зарегистрирован: 18 май 2026, 19:25

Re: Методологии диагностики: USE, RED и здравый смысл

Сообщение matt1102 »

Спасибо, наконец дошло чем загрузка отличается от насыщения. Всегда смотрел только на проценты в top и не понимал почему при 100% cpu иногда норм, а иногда всё лежит. Колонка r в vmstat и /proc/pressure прям открытие.
👍1 ❤️ 🔥 😄 🤔1
Аватара пользователя
tor_pilot
Сообщения: 1
Зарегистрирован: 13 май 2026, 07:12

Re: Методологии диагностики: USE, RED и здравый смысл

Сообщение tor_pilot »

Про %util на nvme это прям боль из жизни. Полгода назад чуть не заменил живой диск потому что iostat рисовал 99 процентов, а оказалось он просто параллелил запросы и запас был огромный. Теперь смотрю на aqu-sz и await.
👍1 ❤️ 🔥1 😄 🤔
Ответить
← Предыдущая глава
Первые 60 секунд: экспресс-диагностика нагруженного сервера
Следующая глава →
Логи systemd через journalctl: где искать причину

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

Поделиться темой: ✈ Telegram VK
Похожие запросы: как посмотреть сколько памяти занято в linuxss как посмотреть открытые сокеты и соединенияstrace почему программа висит и тормозитЛоги и диагностика macOSкак посмотреть процессы в linux и убить зависшийчто такое load average в linux и какое значение нормальное

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

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

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