С чего начать диагностику Linux: методология вместо паники

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

С чего начать диагностику Linux: методология вместо паники

Сообщение 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, потом зачем-то перезагружаешь nginx. Знакомо? Это самый дорогой способ чинить - тыкать наугад. Так можно случайно сделать хуже, потерять время и в итоге так и не понять, что вообще произошло. А самое обидное - проблема вернётся, потому что причину ты не нашёл, просто перетряхнул систему и она временно затихла.

Этот урок - вводный для всего курса. Здесь не будет глубокого разбора флагов strace, perf или bpftrace - это всё дальше, по отдельным урокам. Сейчас важнее другое: научиться подступаться к проблеме. Когда у тебя в голове есть метод, диагностика linux перестаёт быть гаданием и превращается в нормальную инженерную работу - от симптома к причине, шаг за шагом. Новичок, который знает метод, обгонит "опытного", который просто помнит десять команд наизусть, но не понимает, что они меряют.

Почему linux тормозит: учимся не паниковать, а локализовать

Первое, что нужно принять: "linux тормозит" - это не диагноз, а жалоба. Точно так же, как "у меня болит" - это ещё не то, с чем врач может работать. Врач первым делом уточняет: где болит, когда началось, при каких движениях, постоянно или приступами. Мы делаем ровно то же самое. Прежде чем лезть в команды, сформулируй симптом конкретно: "ответ API вырос с 50 мс до 2 секунд начиная с 14:00" - это рабочая формулировка, а "всё лагает" - нет.

Любая проблема производительности в итоге упирается в одну из пяти подсистем:
  • CPU - процессор не успевает считать, задачи стоят в очереди на выполнение (runqueue).
  • Память (RAM) - не хватает оперативки, начинается swap или прилетает OOM killer и убивает процесс.
  • Диск (I/O) - приложение ждёт чтения/записи, диск или сетевое хранилище - узкое место.
  • Сеть - потери пакетов, ретрансмиты, упёрлись в полосу или в лимиты соединений/conntrack.
  • Само приложение - блокировки, кривой код, нехватка воркеров, медленные запросы в БД, ожидание внешнего сервиса.
Вся диагностика сервера linux - это, по сути, ответ на один вопрос: какая из этих пяти подсистем сейчас узкое место? Пока ты этого не знаешь, любые действия - это пальцем в небо. Когда знаешь - круг подозреваемых сужается с "вообще всё" до одной области, и дальше уже понятно, какие инструменты доставать. Важный нюанс: подсистемы связаны. Нехватка памяти выдавливает кэш страниц, и система начинает чаще читать с диска - симптом будет "диск", а корень "память". Поэтому метод нужен, чтобы не остановиться на первом же красном индикаторе, а дойти до настоящей причины.

Изображение

Узкое место и насыщение: главная идея производительности linux

Два слова, которые надо понять раз и навсегда: узкое место (bottleneck) и насыщение (saturation).

Представь трассу с платным пунктом оплаты. Сколько бы полос ни было до и после, скорость всего потока определяет самый узкий участок - шлагбаумы. Это и есть bottleneck. В системе так же: можно иметь 64 ядра и кучу памяти, но если все упёрлись в один медленный диск - тормозить будет всё, и апгрейд процессора не поможет ни на грамм. Поэтому бессмысленно "оптимизировать" то, что не является узким местом: ускорять CPU, когда система ждёт диск, - выкинутые деньги.

Утилизация (utilization) - насколько ресурс занят, в процентах. Диск был занят 90% времени - высокая утилизация.

Насыщение (saturation) - сколько работы стоит в очереди и ждёт, потому что ресурс не справляется. Вот это - самый честный признак боли. Процессор может показывать 100%, но если очередь на выполнение пустая - он просто эффективно работает, это нормально. А если очередь растёт - всё, началось насыщение, задачи ждут, и пользователь это чувствует как лаги. Запомни правило: высокая утилизация - это не всегда проблема, насыщение - почти всегда проблема.

На этой идее построен метод USE Брендана Грегга (Brendan Gregg) - инженера из Netflix, чьи материалы по производительности linux считаются классикой. USE расшифровывается как Utilization, Saturation, Errors. Для каждого ресурса задаём три вопроса:
  • Utilization - насколько занят? (CPU в процентах, диск %util, память занято/свободно)
  • Saturation - есть ли очередь, ждёт ли кто-то? (длина runqueue, очередь к диску, swap)
  • Errors - есть ли ошибки? (в dmesg, в логах диска - bad sectors, дропы пакетов, ECC-ошибки памяти)
Прошёлся этим чек-листом по CPU, памяти, диску, сети - и у тебя есть карта, где горит, а где нет. Это просто список из трёх пунктов на каждый ресурс, его не надо держать в голове как озарение. Как чек-лист пилота перед взлётом: скучно, зато ничего не забудешь в стрессе. Ошибки (E) новички часто пропускают, а зря - дисковая ошибка или дроп пакетов объясняют проблему мгновенно, и искать там больше нечего.

Актуально на 2026: раньше насыщение приходилось вычислять косвенно (по load average, по очереди в iostat). Теперь в ядре есть прямой и честный измеритель насыщения - PSI (Pressure Stall Information). Это файлы /proc/pressure/cpu, /proc/pressure/memory, /proc/pressure/io. Они показывают, какой процент времени задачи реально стояли и ждали ресурс. Поскольку современные дистрибутивы (свежие Ubuntu, Debian, RHEL/RED OS, Astra Linux на современных ядрах) перешли на cgroup v2 по умолчанию, PSI доступен и по системе целиком, и по каждому cgroup/контейнеру (файлы cpu.pressure, memory.pressure, io.pressure внутри cgroupfs). Глянем общесистемную память:

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

$ cat /proc/pressure/memory
some avg10=0.00 avg60=0.00 avg300=0.00 total=0
full avg10=0.00 avg60=0.00 avg300=0.00 total=0
Читается так: some - доля времени, когда хотя бы одна задача стояла в ожидании ресурса; full - доля времени, когда стояли вообще все (никакой полезной работы не делалось). avg10/avg60/avg300 - усреднение за 10, 60, 300 секунд. Все нули - давления нет, система здорова. Если some по памяти держится, скажем, на 20-30, а full ненулевой - память реально давит, начинается реклейм и своп, до OOM недалеко. PSI - это USE-сашинение "из коробки", очень советую завести привычку в него заглядывать.

Карта инструментов: чем делать диагностику сервера linux

У Брендана Грегга есть знаменитая "карта инструментов" (Linux Performance Observability Tools) - картинка, где поверх схемы ядра Linux подписано, какая утилита что измеряет. Её реально стоит распечатать и повесить на стену. Идея простая: каждый инструмент смотрит в свою подсистему. Вот грубая привязка, которую держим в голове:
  • Обзор всего - top, htop, btop, uptime, vmstat, /proc/pressure
  • CPU - mpstat, pidstat, потом глубже perf, profile (bcc)
  • Память - free, vmstat, /proc/meminfo, smem
  • Диск - iostat, потом biolatency и biosnoop (bcc/bpftrace)
  • Сеть - ss (вместо устаревшего netstat), sar -n DEV, потом tcpdump, conntrack, tcplife/tcpretrans
  • Приложение - логи (journalctl), strace для разовой отладки, дальше eBPF: bpftrace, execsnoop, opensnoop
Пара важных замечаний на 2026. Сетевую связку давно считаем через ss, а не netstat - ss быстрее и показывает больше (состояния сокетов, очереди, RTT). А там, где раньше тянулись к strace и долго парсили вывод, сейчас зрелый стек eBPF (инструменты bcc и язык bpftrace). eBPF почти не тормозит наблюдаемый процесс, тогда как strace через ptrace останавливает процесс на каждом системном вызове и легко роняет производительность в разы - на проде это опасно. Для большинства готовых eBPF-инструментов нужно ядро 5.4+ с BTF (на современных дистрибутивах это давно норма). strace остаётся удобен для разовой отладки одного процесса на стенде, но как инструмент для прода его постепенно вытеснил eBPF. Подробно это всё - в дальнейших уроках; сейчас просто запомни, куда что относится.

Сейчас не нужно знать их флаги. Нужно знать, куда смотреть в первую очередь. У того же Грегга есть рецепт "первые 60 секунд": десяток стандартных команд, которые за минуту дают общую картину. Тебе пока хватит вот этих:

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

uptime              # средняя нагрузка (load average) за 1, 5, 15 минут
dmesg -T | tail     # свежие ошибки ядра: OOM, сбои диска, паники (-T = человекочитаемое время)
vmstat 1            # общая динамика: CPU, память, swap, io - раз в секунду
free -h             # сколько реально свободной памяти
df -h               # не забит ли диск под завязку (частая причина падений)
df -i               # не кончились ли inode (диск вроде есть, а файл не создаётся)
Разберём вывод uptime, потому что новички читают его неправильно чаще всего:

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

$ uptime
 14:23:07 up 42 days,  3:15,  2 users,  load average: 0.52, 1.20, 4.85
Три числа в конце - это load average за 1, 5 и 15 минут. Это не проценты. Это среднее число задач, которые либо выполняются на CPU, либо ждут CPU в очереди, а в Linux ещё и те, что застряли в непрерываемом ожидании диска (состояние D). Как читать: дели на число ядер. Если ядер 4, то load 4.0 - это примерно 100% загрузки, без запаса; load 8.0 на 4 ядрах - двукратная перегрузка, половина задач постоянно ждёт. Ключевое - смотри на динамику слева направо: 0.52 (минуту назад) против 4.85 (15 минут назад) значит, что нагрузка падает, пик уже прошёл, тушить пожар поздно и не нужно. Если бы было наоборот - 4.85, 1.20, 0.52 - значит шторм нарастает прямо сейчас, и это повод действовать немедленно. Оговорка: сам по себе load average - грубый индикатор (он смешивает CPU и диск), поэтому для точного "что именно ждёт" иди в PSI и vmstat.

Теперь vmstat - одна из самых полезных команд для старта. Первая строка вывода - средние с момента загрузки, её игнорируй, смотри со второй:

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

$ 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
 2  0      0 198432  45120 890244    0    0     5    12  220  410 12  3 84  1  0
 8  1      0 120100  45120 870100    0    0   240  5800 1500 3200 25 10  5 60  0
Что тут важно для новичка:
  • r - сколько процессов выполняется или ждёт CPU. Если r стабильно больше числа ядер - процессор узкое место, очередь не рассасывается.
  • b - сколько в непрерываемом сне (uninterruptible sleep, состояние D), почти всегда ждут диск. Ненулевой b вместе с высоким wa - однозначно I/O.
  • si/so - swap in/out в КБ/с. Любые стабильно ненулевые значения здесь - тревога: системе не хватает памяти, она тасует страницы через диск, и это убивает производительность. Разовый одиночный so может быть безобидным, важна именно постоянная активность.
  • bi/bo - блоки, прочитанные с диска и записанные на диск. Резкий рост bo при тормозах - идём смотреть, кто столько пишет.
  • cs - context switches в секунду. Аномально высокий cs (десятки-сотни тысяч) при невысоком полезном us часто значит борьбу за блокировки или слишком много потоков.
  • wa (группа cpu) - процент времени, что CPU простаивал в ожидании диска. В примере во второй строке wa=60 - процессор не считает, он ждёт диск. Классический признак: узкое место - I/O, а не CPU.
  • us/sy/id - user/system/idle. Высокий us - грузит код приложения, высокий sy - грузит ядро (часто шквал системных вызовов или сетевой нагрузки).
  • st - steal time. Критично для виртуалок и облака: это процент времени, когда твоя VM была готова считать, но гипервизор не дал ей CPU (его забрал сосед по железу). Ненулевой st на 2026 - очень частая причина "необъяснимых" тормозов в облаке, а внутри гостя все остальные метрики при этом могут выглядеть нормально.
Видишь, как одна команда сразу разворачивает тебя в нужную сторону? wa высокий - идём к диску (iostat). r высокий, wa низкий - идём к CPU (mpstat, pidstat). so стабильно ненулевой - идём к памяти (free, кто её ест). st ненулевой - проблема не в твоей системе, а на стороне гипервизора/соседей. Это и есть движение от общего к частному.

Типичные грабли и заблуждения новичка
  • Менять десять вещей сразу. Покрутил sysctl, перезапустил сервис, поправил конфиг, увеличил лимиты - и оно "заработало". А что именно помогло? Неизвестно. Завтра сломается снова, и ты не воспроизведёшь. Меняй по одному и проверяй эффект.
  • Не фиксировать действия. Заведи привычку писать в тикет или блокнот: время, симптом, что увидел, что поменял, что стало. Это не бюрократия - это спасает, когда через час ты уже не помнишь, что трогал, и когда нужно откатить.
  • ["100% CPU = беда".] Не обязательно. Если задача и должна молотить процессор, а очередь (r) маленькая и PSI по cpu около нуля - всё нормально, ресурс просто работает. Беда - это насыщение и рост очереди.
  • Путать load average с загрузкой CPU. В Linux load включает и процессы в ожидании диска (состояние D). Высокий load при низком потреблении CPU и пустой runqueue - почти наверняка дисковая проблема, а не процессорная.
  • Игнорировать steal time в облаке. В виртуалке смотри на st в vmstat и %steal в top. Внутри гость может казаться здоровым, а тормоза идут от соседей по гипервизору.
  • Сразу лезть в strace/perf/bpftrace. Это мощные инструменты, но если ты не локализовал подсистему, они только утопят тебя в данных. Сначала общая картина (60 секунд + PSI), потом прицельное погружение.
  • Забыть про df -h и df -i. Огромная доля "падений приложения" - это банально забитый под 100% диск или закончившиеся inode (файлов мало по объёму, но их много). Проверяй это в первую очередь, это 10 секунд.
Мини-лаба: повтори руками прямо сейчас

Открой терминал на любой Linux-машине (рабочий сервер, домашняя VM, WSL2 - подойдёт всё; на Astra Linux и RED OS эти команды работают так же, пакет sysstat для sar/mpstat/iostat ставится из штатных репозиториев):
  • Запусти uptime. Раздели каждое из трёх чисел load average на число ядер (узнать ядра: nproc). Прикинь, нагружена машина или отдыхает, растёт нагрузка или падает.
  • Загляни в насыщение: cat /proc/pressure/cpu и cat /proc/pressure/io. Сейчас some почти наверняка около нуля - это "норма покоя". Запомни, как выглядит здоровье.
  • Запусти vmstat 1, дай поработать секунд десять, нажми Ctrl+C. Найди глазами колонки r, b, wa, si, so, st. Сейчас они почти наверняка около нуля.
  • Создай искусственную нагрузку на CPU и посмотри, как меняется картина. На число потоков по ядрам: stress-ng --cpu $(nproc) --timeout 20s (если stress-ng не установлен, грубый аналог - запустить yes > /dev/null &, потом убить его kill %1). Параллельно смотри vmstat 1, uptime и cat /proc/pressure/cpu - увидишь, как растут r, us и some в pressure.
  • Запусти free -h, df -h и df -i. Убедись, что есть свободная память, место на диске и свободные inode.
Цель лабы - не выучить команды, а почувствовать, как выглядит здоровая система и куда смотреть. Когда ты видел "норму" своими глазами, отклонение бросится в глаза мгновенно.

Контрольные вопросы
  • Назови пять подсистем, в одну из которых упирается любая проблема производительности.
  • Чем утилизация отличается от насыщения? Какой из двух признаков честнее говорит о боли и какой современный механизм ядра меряет насыщение напрямую?
  • В выводе vmstat колонка wa держится на 70, а b ненулевой. На какую подсистему это указывает и какой инструмент доставать дальше?
  • Ты в облачной VM, внутри всё выглядит спокойно, но приложение лагает. Какую колонку vmstat/top проверить и о чём говорит её ненулевое значение?
  • Почему опасно менять несколько настроек сразу, даже если "стало лучше"?
Что запомнить

Диагностика - это метод, а не набор команд. Сначала сформулируй симптом конкретно, потом локализуй подсистему (CPU, память, диск, сеть, приложение), двигайся от общего к частному. Держи в голове USE: для каждого ресурса проверь утилизацию, насыщение и ошибки. Начинай с обзора (uptime, vmstat, free, df, dmesg) плюс PSI (/proc/pressure) для честного насыщения и читай вывод осмысленно - цифры должны разворачивать тебя в сторону одной подсистемы. И железная дисциплина: меняй по одной вещи и записывай, что делаешь. Всё остальное в курсе - strace, perf, eBPF/bpftrace - это инструменты, которые ты будешь доставать уже прицельно, зная, куда смотришь.
👍3 ❤️1 🔥 😄 🤔1
Аватара пользователя
lonelysegfault
Сообщения: 1
Зарегистрирован: 11 май 2026, 20:30

Re: С чего начать диагностику Linux: методология вместо паники

Сообщение lonelysegfault »

Спасибо, наконец-то дошло, что load average это не проценты. Всю жизнь делил на 100 и пугался цифры 4, а оказывается надо делить на число ядер. Пошел распечатывать карту Грегга на стену.
👍 ❤️ 🔥 😄 🤔
Аватара пользователя
Mausel
Сообщения: 1
Зарегистрирован: 23 май 2026, 00:28

Re: С чего начать диагностику Linux: методология вместо паники

Сообщение Mausel »

Про /proc/pressure вообще не знал, проверил на своих серверах - реально удобнее load average, сразу видно ждет память или нет. А есть смысл сразу алерты на memory.pressure full вешать или это перебор?
👍2 ❤️ 🔥 😄 🤔1
Ответить
Следующая глава →
Первые 60 секунд: экспресс-диагностика нагруженного сервера

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

Поделиться темой: ✈ Telegram VK
Похожие запросы: как посмотреть сколько памяти занято в linuxlsof кто держит файл и порт в linuxss как посмотреть открытые сокеты и соединенияstrace почему программа висит и тормозитperf top как найти что грузит процессорчто такое системный вызов и зачем трассировать

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

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

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