Сервер Linux грузит CPU или память: как найти причину
Практика4 минРедакция Innovialabs
Коротко
Начните с top или htop, чтобы увидеть виновника, затем через vmstat и iostat отделите нагрузку CPU от ожидания диска, а free и dmesg покажут, хватает ли памяти и не срабатывал ли OOM killer.
Короткий ответ
Порядок диагностики:
topилиhtop— кто именно потребляет CPU и память прямо сейчас.vmstat 1— что ограничивает систему: процессор, память или ввод-вывод.iostat -x 1— не упирается ли всё в диск.free -hиdmesg— сколько реально свободной памяти и не убивал ли ядро процессы.ps— история и детали конкретного процесса.
vmstat и iostat обычно входят в пакеты procps и sysstat.
Как читать load average
В выводе top или uptime есть три числа — средняя нагрузка за 1, 5 и 15 минут. Это количество процессов, которые выполняются или ждут выполнения. В Linux сюда же входят процессы, ожидающие диска (состояние D).
- Сравнивайте load average с числом ядер (
nproc). На 4 ядрах значение около 4 означает полную загрузку, заметно выше — очередь. - Если load высокий, а CPU почти свободен — ищите проблему в диске или сети, а не в процессоре.
- Рост первого числа при спокойных остальных — свежий всплеск, а не хроническая проблема.
Шаг 1. top и htop
В top нажмите P, чтобы сортировать по CPU, и M — по памяти. В htop то же делается кликом по столбцу или клавишей F6.
Смотрите на строку %Cpu(s):
| Поле | Что значит высокое значение |
|---|---|
us | код приложений: тяжёлые вычисления, бесконечный цикл |
sy | ядро: много системных вызовов, сетевой трафик |
wa | ожидание ввода-вывода: медленный или перегруженный диск |
st | steal: соседи по гипервизору забирают процессор у вашего VPS |
Высокий st на виртуалке не лечится внутри системы — это вопрос к хостингу или тарифу.
Шаг 2. vmstat и iostat
vmstat 1 5
- Столбец
r— очередь на процессор. Стабильно больше числа ядер — CPU не хватает. b— процессы, заблокированные на вводе-выводе.siиso— подкачка из swap и в swap. Постоянные ненулевые значения — памяти мало.
iostat -x 1 5
Высокий %util и большой await у диска означают, что он не успевает. Тогда ищите, кто пишет: iotop покажет процессы по объёму ввода-вывода.
Шаг 3. Память: free, swap и OOM killer
free -h
Главное — столбец available, а не free. Linux занимает свободную память под кэш файлов (buff/cache) и отдаёт её приложениям по требованию, поэтому маленький free — норма.
Swap — запасная память на диске. Немного занятого swap не страшно. Плохо, когда идёт постоянный обмен (si/so в vmstat): система начинает тормозить.
Когда память и swap заканчиваются, ядро запускает OOM killer и убивает процесс с наибольшим «весом». Проверьте:
dmesg -T | grep -i -E "killed process|out of memory"
journalctl -k | grep -i oom
Если приложение «само перезапускается» без ошибок в своих логах — часто это именно OOM killer.
Шаг 4. ps: детали процесса
ps aux --sort=-%cpu | head -n 10
ps aux --sort=-rss | head -n 10
ps -o pid,etime,rss,cmd -p 1234
RSS — реальная занимаемая память, etime — сколько процесс уже работает. Если RSS одного процесса со временем только растёт, это признак утечки.
Что делать с процессом-беглецом
- Определите, что это:
ps -fp PID,ls -l /proc/PID/exe, к какому сервису относится (systemctl status PID). - Соберите данные до перезапуска: логи приложения,
journalctl -u сервис, время начала проблемы. После рестарта улики пропадут. - Снизьте приоритет, если процесс нужен, но мешает:
renice +10 -p PID. - Остановите корректно: сначала
kill PID(SIGTERM), и только если не помогает —kill -9 PID. - Если это cron-задача или неизвестный процесс — проверьте, откуда он запущен. Неожиданный процесс с высоким CPU может оказаться майнером после взлома.
Утечка памяти: пошагово
- Подтвердите рост: записывайте RSS процесса с интервалом (
psв цикле или мониторинг). - Свяжите рост с событиями: деплой, конкретный маршрут, фоновая задача.
- Ограничьте ущерб: лимит памяти через systemd (
MemoryMax=) или Docker (mem_limit), чтобы падал только этот сервис, а не весь сервер. - Как временная мера — плановый перезапуск, но это не решение.
- Ищите причину профилировщиком вашего языка: растущие кэши без лимита, незакрытые соединения, подписчики событий, которые никто не удаляет.