Сервер вдруг стал медленно отвечать, сайт открывается через раз, а графики в личном кабинете показывают процессор под потолком. Чтобы понять, что происходит, нужно посмотреть, какие программы сейчас работают и сколько ресурсов они забирают. В этой статье разберём, что означает нагрузка на сервер и как читать load average, научимся пользоваться командами top, htop и ps, найдём процесс, который нагружает систему, и завершим его. Для наглядности мы нагрузили тестовый сервер с 4 ядрами двумя процессами, каждый из которых занимал одно ядро целиком, и все скриншоты сделаны в этот момент.
Что такое процесс и как читать нагрузку
Каждая запущенная программа в Linux работает как процесс. У процесса есть номер PID, пользователь, от имени которого он запущен, и состояние. Большую часть времени почти все процессы на сервере спят. Веб-сервер ждёт новых соединений, база данных ждёт запросов, и процессор им в этот момент не нужен. Процессор занимают только процессы в состоянии R (running), которые прямо сейчас что-то вычисляют или стоят в очереди на вычисление. Именно их количество и лежит в основе самого известного показателя нагрузки.
Этот показатель называется load average и выводится тремя числами, например 2.24, 1.03, 0.50. Это средняя длина очереди процессов, которым нужен процессор, за последние 1, 5 и 15 минут. Linux добавляет к ним ещё процессы, которые ждут завершения операции с диском и не могут быть прерваны, поэтому load average растёт и при медленном диске, даже если процессор свободен. Сам по себе load average ничего не говорит, пока не сравнить его с количеством ядер. Предположим, что на сервере 4 ядра. Нагрузка 2 означает, что в среднем работали два процесса и половина ядер простаивала. Нагрузка 4 означает, что все ядра заняты полностью, а нагрузка 8 означает, что на каждое ядро приходится два желающих и процессы стоят в очереди, поэтому всё начинает отвечать медленнее. На нашем тестовом сервере два процесса, каждый из которых занимал по ядру, дали через пару минут load average 2,24 при 4 ядрах.
Три числа полезно читать вместе, потому что они показывают направление. Если первое число заметно больше третьего, нагрузка выросла недавно и, возможно, ещё растёт. Если первое меньше третьего, пик уже прошёл. Количество ядер сервера показывает команда nproc.
Кроме нагрузки, у процессора есть разбивка времени, которую показывает top. Значение us это время, потраченное на программы, sy на работу ядра системы, id это простой, wa ожидание диска. Для виртуального сервера важен ещё показатель st (steal). Он показывает долю времени, когда сервер был готов работать, но физический процессор был занят другими задачами. На нашем тестовом сервере он был равен нулю.
1. Посмотрите общую нагрузку
Самая быстрая проверка это команда uptime. Она покажет, сколько сервер работает без перезагрузки, и три числа load average.
uptime
nprocСравните первое число load average с количеством ядер из вывода nproc. Если нагрузка заметно выше, ищите, кто её создаёт.
2. Найдите процесс в top
Команда top есть на любом сервере и показывает процессы в реальном времени. Параметр -o %CPU сортирует их по загрузке процессора.
top -o %CPU
Вверху общая нагрузка, ниже процессы, самые прожорливые первыми
В верхней части видны load average, количество процессов, разбивка времени процессора и память. В таблице ниже интереснее всего несколько колонок.
- PID это номер процесса, он понадобится, чтобы его завершить.
- USER показывает, от имени какого пользователя работает процесс.
- %CPU это загрузка процессора. 100 % означает одно ядро целиком, поэтому на многоядерном сервере процесс может показывать и больше.
- RES показывает, сколько оперативной памяти процесс занимает на самом деле.
- COMMAND это имя программы.
Пока top открыт, клавиша M сортирует процессы по памяти, P снова по процессору, а q закрывает программу.
3. Установите htop
htop показывает то же самое, но нагляднее, с цветными шкалами для каждого ядра и памяти. На наших серверах с Debian 12 его по умолчанию нет, поэтому установите его.
apt install -y htop
htop
Два ядра загружены полностью, два почти свободны
В htop процессы можно выбирать стрелками. Клавиша F6 выбирает колонку для сортировки, F9 завершает выбранный процесс, F5 показывает процессы деревом, а F10 или q закрывает программу. Если работаете через Termius на телефоне, где клавиш F нет, нажимайте на подписи внизу экрана.
4. Получите список процессов командой ps
top и htop удобны для наблюдения, а для поиска и скриптов лучше подходит ps. Она один раз выводит список и завершается.
# Пять процессов, которые больше всего нагружают процессор
ps aux --sort=-%cpu | head -6
# То же по занятой памяти
ps aux --sort=-%mem | head -6
# Найти процесс по имени и показать его PID
pgrep -a nginx5. Завершите процесс
Когда виновник найден, его можно завершить по номеру PID или по имени.
# Вежливо попросить процесс завершиться
kill 225145
# Завершить все процессы с таким именем
pkill yes
Процессы найдены по имени и завершены
Команда kill без параметров отправляет процессу сигнал TERM. Получив его, программа может сохранить данные, закрыть файлы и выйти сама. Если процесс не реагирует, используйте сигнал KILL, который система выполняет принудительно, не спрашивая программу.
kill -9 225145Сначала обычный kill
kill -9 не даёт программе сохранить данные, поэтому база данных или сайт после такого завершения могут потерять последние изменения. Используйте его только тогда, когда обычный kill не помог. Службы, например Nginx или MySQL, правильнее перезапускать командой systemctl restart, а не завершать вручную.
Частые вопросы
Нагрузка высокая, а в top нет процессов с большим %CPU
Посмотрите на значение wa в строке %Cpu(s). Если оно велико, процессы ждут диск, а не процессор, и load average растёт из-за них. Узнать, какой процесс читает и пишет больше всего, поможет вкладка I/O в htop или программа iotop, её можно поставить командой apt install -y iotop.
Процесс завершился, но через минуту появился снова
Скорее всего, это служба, которую система перезапускает автоматически, или задача, которую запускает cron. Найдите, к какой службе относится процесс, командой systemctl status PID и остановите саму службу.
Что такое zombie в выводе top
Это процесс, который уже завершился, но его родитель ещё не забрал код завершения. Память и процессор zombie не занимает и обычно исчезает сам. Если таких процессов становится всё больше, проблема в программе-родителе, и помогает её перезапуск.
Сервер стабильно перегружен
Если процессор или память постоянно заняты обычной работой ваших программ, серверу не хватает ресурсов. Памяти может помочь файл подкачки, но надёжнее перейти на тариф мощнее. Как это сделать, рассказано в частых вопросах.
Наши ресурсы
Telegram-канал: https://t.me/f3cloud_news
Официальный сайт: https://f3cloud.com