Знаменитый чеклист "первые 60 секунд" придумал Брендан Грегг, перформанс-инженер из Netflix. Идея простая: есть набор из примерно десяти стандартных команд, которые есть почти на любом сервере. Прогоняешь их по очереди - и получаешь грубую, но честную картину: где узкое место. Это не глубокая диагностика, а скорее сортировка в приёмном покое. Задача - не вылечить, а быстро понять, в какую сторону бежать. Когда у тебя нагрузка на сервер Linux растёт, а причина неясна, этот чеклист экономит уйму нервов. Чеклисту уже больше десяти лет, но он держится: команды стабильны, а в 2026 к ним добавился свежий и очень мощный сигнал - PSI (о нём в конце практики).
С чего начать: load average и первые секунды
Первое, что делаешь после подключения, - смотришь на нагрузку. В диагностике Linux первые секунды почти всегда начинаются с одной команды:
Код: Выделить всё
uptime
14:21:03 up 42 days, 3:11, 2 users, load average: 9.41, 4.18, 1.92Как читать? Сравнивай число с количеством ядер. Если у тебя 8 ядер, то load average около 8 - это полная, но здоровая загрузка. Load 9.41 на 8 ядрах - небольшой перегруз. А вот load 40 на 8 ядрах - это уже SOS. Сколько у тебя ядер (логических, с учётом hyper-threading), подскажет
Код: Выделить всё
nprocСразу следом - проверка, не ругалось ли ядро:
Код: Выделить всё
sudo dmesg -T | tail
[Sun Jun 14 14:19:55 2026] Out of memory: Killed process 30812 (php-fpm) total-vm:4519064kB, anon-rss:4399216kB
[Sun Jun 14 14:19:55 2026] oom-reaper: reaped process 30812 (php-fpm)Код: Выделить всё
-TКод: Выделить всё
journalctl -k -p err -b --no-pager
Куда уходит время: CPU, своп и io-wait
Теперь крутим динамику. Команда
Код: Выделить всё
vmstat 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
12 0 131072 198400 44210 884512 0 0 8 62 5310 9921 88 9 1 2 0
14 1 131072 191020 44210 884600 0 0 0 1240 6102 11233 90 8 0 2 0- r - сколько процессов хотят CPU прямо сейчас (на ядрах + в очереди). Если r стабильно больше числа ядер - процессор узкое место. Тут r=12-14, и если ядер 8, то CPU явно затык.
- b - процессы, застрявшие в непрерываемом ожидании (обычно диск). Растёт b - подозревай диск или сетевую ФС.
- si / so - свопинг: страницы памяти читаются с диска (si) и выгружаются на диск (so). Любые ненулевые значения здесь, которые держатся, - тревога. Памяти не хватает, система свопит, и всё дико тормозит. Разовый всплеск so при старте тяжёлого процесса - терпимо, постоянный поток - беда.
- us / sy - время CPU в пользовательском коде и в ядре. Высокий us - грузит твоё приложение. Высокий sy (скажем, за 30%) - много системных вызовов, копай в сторону ядра/IO/сети/частых fork.
- wa - io-wait, доля времени, когда CPU простаивал в ожидании диска (и больше делать было нечего). wa под 30-50% - диск тормозит всю систему. Но помни: wa=0 при загруженном диске тоже бывает, если CPU есть чем заняться помимо ожидания.
- id - простой. id=0 значит процессор выжат досуха.
- st - steal time: время, украденное гипервизором у виртуалки. На облачном VPS ненулевой и растущий st - тебе не дают обещанный CPU, виноват сосед по гипервизору, а не твой код. На 2026 это частая причина "загадочных" тормозов в облаке.
- cs - переключения контекста в секунду. Аномально высокий cs (десятки-сотни тысяч) при низком полезном выходе - признак thread thrashing или слишком агрессивного планирования.
Дальше - баланс по ядрам. Общий процент может врать: вдруг одно ядро в полке, а семь спят?
Код: Выделить всё
mpstat -P ALL 1
07:42:01 PM CPU %usr %nice %sys %iowait %irq %soft %idle
07:42:02 PM all 41.20 0.00 3.10 0.25 0.00 0.50 54.95
07:42:02 PM 0 99.00 0.00 1.00 0.00 0.00 0.00 0.00
07:42:02 PM 1 2.00 0.00 1.00 0.00 0.00 0.00 97.00Кто виноват: процессы, диск, память и сеть
Поняли, что ресурс жрут, - найдём пожирателя.
Код: Выделить всё
pidstat 1Код: Выделить всё
pidstat 1
07:45:12 PM UID PID %usr %system %guest %CPU CPU Command
07:45:13 PM 1000 30877 98.00 2.00 0.00 100.00 0 php-fpm
07:45:13 PM 999 1442 5.00 1.00 0.00 6.00 3 mysqldКод: Выделить всё
pidstat -d 1Код: Выделить всё
pidstat -w 1Теперь диск.
Код: Выделить всё
iostat -xz 1Код: Выделить всё
iostat -xz 1
Device r/s w/s rkB/s wkB/s r_await w_await aqu-sz %util
nvme0n1 12.0 430.0 192.0 84320.0 0.30 18.50 7.90 99.20- r/s, w/s - операций чтения и записи в секунду (это и есть IOPS). Тут активная запись (w/s=430).
- r_await, w_await - среднее время обслуживания запроса в миллисекундах (ожидание в очереди + сам обмен). Для NVMe доли мс - норма, для SATA SSD несколько мс - норма, для HDD 10-20 мс - норма. 50-100+ мс на любом устройстве - беда. Здесь w_await=18.5 мс для NVMe - запись явно подтормаживает (очередь забита).
- aqu-sz - средняя длина очереди к устройству (в новых sysstat поле так и называется aqu-sz, в старых - avgqu-sz). Стабильно больше 1-2 на HDD - диск не успевает; для NVMe нормальная очередь может быть и десятки, тут смотри в связке с await.
- %util - доля времени, когда устройству был отправлен хотя бы один запрос. ВАЖНО и актуально на 2026: начиная с ядер 4.17+ %util в iostat считается иначе и для SSD/NVMe откровенно обманывает - эти устройства обрабатывают много запросов параллельно, и 100% util НЕ значит "конец" и насыщение. На NVMe ориентируйся в первую очередь на await и на достигнутые IOPS/пропускную способность относительно паспорта диска, а %util используй только как грубый индикатор "диск вообще работает".
Код: Выделить всё
free -mКод: Выделить всё
free -hКод: Выделить всё
free -m
total used free shared buff/cache available
Mem: 15884 12030 410 302 3444 3210
Swap: 2047 1850 8Код: Выделить всё
freeКод: Выделить всё
systemctl status имя.serviceКод: Выделить всё
journalctl -u имя.serviceПод конец - сеть.
Код: Выделить всё
sar -n DEV 1Код: Выделить всё
sar -n DEV 1
07:50:01 PM IFACE rxpck/s txpck/s rxkB/s txkB/s %ifutil
07:50:02 PM eth0 48200.0 51100.0 41200.0 58300.0 58.20Код: Выделить всё
sar -n TCP,ETCP 1И только теперь имеет смысл открыть
Код: Выделить всё
topКод: Выделить всё
htopФинальный аккорд 2026 - PSI. Pressure Stall Information появилась в ядре 4.20 и сегодня есть на любом современном сервере. Это самый честный ответ на вопрос "из-за какого ресурса реально тормозят задачи":
Код: Выделить всё
cat /proc/pressure/cpu /proc/pressure/io /proc/pressure/memory
some avg10=12.30 avg60=8.10 avg300=3.40 total=...
full avg10=0.00 avg60=0.00 avg300=0.00 total=... (для io/memory full бывает >0)Типичные грабли и заблуждения
- "Высокий load = перегружен процессор". Нет. В Linux load учитывает ещё и непрерываемый сон (ожидание диска). Высокий load при низком %CPU и большом wa - это диск, а не процессор.
- "Мало free памяти - надо срочно чистить". Нет, buff/cache отдаётся приложениям мгновенно при нужде. Смотри available, а не free. Чистить кеш через drop_caches на проде - почти всегда вредный карго-культ.
- Первую строку vmstat/iostat/mpstat принимать всерьёз. Она усреднена с момента загрузки и почти всегда врёт про "сейчас". Бери вторую и дальше.
- %util=100% на NVMe - паника. Для параллельных накопителей и на ядрах 4.17+ это не предел и не показатель насыщения. Доверяй await и достигнутым IOPS относительно паспорта диска.
- Забыть про steal и cgroup-лимиты. На облачном VPS тормоза часто это st в vmstat (украл гипервизор), а в контейнере - упёртый cpu.max/memory.max cgroup, при том что хост-метрики чистые.
- Команд может не быть из коробки. mpstat, pidstat, iostat, sar лежат в пакете sysstat - поставь (Debian/Ubuntu/Astra) или
Код: Выделить всё
sudo apt install sysstat(RHEL/Fedora/RED OS). Для непрерывного sar-сбора включиКод: Выделить всё
sudo dnf install sysstat. На Astra Linux и RED OS набор тот же, имена пакетов совпадают.Код: Выделить всё
sudo systemctl enable --now sysstat
- Узнай число ядер: . Запиши.
Код: Выделить всё
nproc - Прогони весь чеклист по порядку на своей машине: ,
Код: Выделить всё
uptime,Код: Выделить всё
journalctl -k -p err -b --no-pager | tail(Ctrl+C через пять строк),Код: Выделить всё
vmstat 1,Код: Выделить всё
mpstat -P ALL 1,Код: Выделить всё
pidstat 1,Код: Выделить всё
iostat -xz 1,Код: Выделить всё
free -h,Код: Выделить всё
sar -n DEV 1,Код: Выделить всё
sar -n TCP,ETCP 1.Код: Выделить всё
top - Создай искусственную нагрузку на CPU: (потом не забудь
Код: Выделить всё
yes > /dev/null &). Снова глянь uptime и mpstat - увидь, как одно ядро уходит в полку, а load average медленно ползёт вверх.Код: Выделить всё
kill %1 - Посмотри живой PSI под нагрузкой: до запуска yes и через минуту после - сравни avg10 в строке some.
Код: Выделить всё
cat /proc/pressure/cpu - Сравни load average с числом ядер и сделай вывод: перегруз или норма.
- На сервере 4 ядра, load average 12.0. Это перегруз или нет, и во сколько раз очередь длиннее ёмкости?
- В выводе vmstat колонки si и so показывают ненулевые значения, которые держатся. О чём это говорит и почему это плохо?
- iostat показывает %util=100% на NVMe-диске. Можно ли сразу делать вывод о насыщении? На какое поле смотреть вместо этого?
- free -h показывает free всего 200 МБ, но available 6000 МБ. Стоит ли паниковать из-за нехватки памяти и почему?
- vmstat на облачном VPS показывает st=25 при низком us. Что это значит и кто виноват - твой код или нет?
Чеклист первых 60 секунд - это не магия, а дисциплина. Десяток команд по порядку дают грубую карту: uptime и dmesg/journalctl -k говорят "всё ли горит", vmstat и mpstat - "процессор, ожидание или украденное гипервизором время", pidstat - "кто виноват", iostat - "диск ли это", free - "хватает ли памяти", sar - "что с сетью и есть ли ретрансмиты", а PSI из /proc/pressure - прямой ответ "из-за какого ресурса реально стоят задачи". Главное - не вываливать команды, а читать их вывод: сравнивать load с числом ядер, помнить про io-wait и steal, не путать кеш с занятой памятью, держать в уме cgroup-лимиты и не верить %util на NVMe. Эта минута не лечит, но точно показывает, в какую сторону копать дальше. А копать глубже - strace, perf и eBPF (bpftrace, bcc-инструменты вроде biolatency и execsnoop) - мы будем в следующих уроках.