Диагностика нагрузки сервера (CPU, RAM, диск, сеть)
Базовые команды, чтобы понять, почему сервер тормозит или не отвечает, и что делать в каждом случае.
На этой странице
Когда сервер начинает тормозить или перестаёт отвечать, причина чаще всего в том, что не хватает одного из четырёх ресурсов: процессора (CPU), памяти (RAM), диска или сети. В этом руководстве — команды, которые находят виновника, и что делать в каждом случае. Команды выполняются на сервере по SSH от имени root. Как менялась нагрузка со временем, видно в панели app.blackbox.md на странице «Мониторинг» (app.blackbox.md/monitoring, боковое меню → «Инфраструктура» → «Мониторинг»).
Доступно: всем, у кого есть root-доступ по SSH к серверу BLACKBOX с Ubuntu, Debian, AlmaLinux или CentOS Stream. Графики в панели — владельцу сервера, для серверов с активной дополнительной услугой «Мониторинг».
Сервер тормозит или не отвечает: что делать по порядку
Подключитесь по SSH (Подключение к серверу по SSH (Windows, macOS, Linux)):
ssh root@IP_СЕРВЕРАЕсли подключиться удалось, пусть даже медленно, не перезагружайте сервер сразу: перезагрузка сотрёт следы проблемы. Выполните команды из разделов ниже, начиная с «Быстрый осмотр».
Если SSH не отвечает (истекает время ожидания или сессия зависает): в панели откройте «Мои серверы», нажмите «Перезагрузить» на карточке сервера и подтвердите «Перезагрузить {name}?». Подождите 30–60 секунд и подключитесь снова. Если панель показывает
power_action_failed, сервер, возможно, выключен: нажмите «Запустить». Подробнее: Перезагрузка, остановка и запуск сервера.Если сервер так и не ответил через несколько минут, напишите в поддержку (Как связаться с поддержкой BLACKBOX). Укажите IP-адрес сервера, номер заказа (
BBX-…), дату и время, когда началась проблема. Если вопрос срочный и сейчас рабочее время, также позвоните по номеру +373 78 003948 (пн–пт, 09:00–18:00 по времени Молдовы).Когда сервер снова заработает, выясните причину: см. вопрос «Сервер упал, а после перезагрузки работает. Как узнать причину?» в конце статьи.
Если SSH отвечает Permission denied, сервер работает, а проблема в авторизации: Не удаётся подключиться по SSH.
Примечание У клиентов нет веб-консоли и VNC, а в панели нет кнопки принудительной перезагрузки (hard reset). Если «Перезагрузить» не помогает, вмешаться может только команда BLACKBOX.
Быстрый осмотр: процессор, память, процессы
uptime: средняя нагрузка
uptime
nproc 10:42:01 up 12 days, 3:05, 1 user, load average: 3.85, 2.10, 1.20
2Три числа после load average — средняя нагрузка за последнюю минуту, за 5 и за 15 минут. Сравнивайте их с числом vCPU сервера: его выводит nproc, а ещё оно указано на карточке сервера в разделе «Мои серверы», в строке «Конфигурация» (например, «2 vCPU · 4 GB · 40 GB»).
| Средняя нагрузка | Что это значит |
|---|---|
| меньше числа vCPU | у процессора есть запас |
| равна числу vCPU | сервер работает на пределе |
| постоянно больше числа vCPU | процессы стоят в очереди: сервер перегружен |
В примере 3,85 при 2 vCPU — это перегрузка, а первое число, намного большее третьего, показывает, что нагрузка выросла за последние минуты. В Linux в нагрузку входят и процессы, которые ждут диск: высокая нагрузка при почти свободном процессоре указывает на диск (столбец wa ниже).
top или htop: какой процесс нагружает
topВверху top показывает строку %Cpu(s) (её столбцы описаны в разделе про vmstat) и память, ниже — процессы, самые активные сверху. Полезные клавиши: P — сортировка по CPU, M — по памяти, 1 — каждый vCPU отдельно, q — выход.
htop показывает то же самое, но в цвете и нагляднее. В Ubuntu и Debian установите его так:
apt update
apt install -y htopВ AlmaLinux и CentOS Stream пакет берётся из репозитория EPEL:
dnf install -y epel-release
dnf install -y htopСписок процессов, отсортированный по CPU и по памяти, который удобно скопировать в тикет:
ps aux --sort=-%cpu | head -n 15
ps aux --sort=-%mem | head -n 15free -h: память
free -h total used free shared buff/cache available
Mem: 3.8Gi 3.2Gi 118Mi 24Mi 512Mi 356Mi
Swap: 0B 0B 0BСмотрите на столбец available, а не на free: Linux занимает свободную память под кеш (buff/cache) и отдаёт её, когда она нужна приложениям. Память закончилась, если available близок к нулю, а swap, если он есть, заполнен. Swap: 0B означает, что на сервере нет swap.
vmstat 1 5: картина за несколько секунд
vmstat 1 5Команда выводит 5 строк с интервалом в секунду. Первая строка — среднее значение с момента загрузки сервера, поэтому смотрите на следующие.
| Столбец | Что показывает | Признак проблемы |
|---|---|---|
r |
процессы, которые ждут процессор | постоянно больше числа vCPU |
b |
заблокированные процессы, обычно ждут диск | постоянно больше 0 |
si, so |
чтение из swap / запись в swap | постоянно больше 0: оперативной памяти не хватает |
us, sy |
доля CPU, занятая приложениями / системой | вместе около 100 |
wa |
доля CPU в ожидании диска | высокие значения: узкое место — диск |
st |
«украденное» время (steal): сколько виртуальный процессор ждал физический сервер | постоянно высокое: см. ниже |
Значение st бывает только на виртуальных серверах, и несколько процентов время от времени — это нормально. Если st остаётся высоким несколько минут подряд, хотя ваши приложения почти не нагружают процессор, напишите в поддержку и приложите вывод команды vmstat 1 5.
Диск: место и скорость
df -h
df -idf -h показывает занятое место на каждом разделе: смотрите столбец Use% для /. df -i показывает иноды (количество файлов): при IUse% 100% новые файлы создать нельзя, даже если место ещё есть. Заполненный диск останавливает базы данных и сайты. Как найти, что занимает место, и освободить его: Диск сервера заполнен.
Нагрузку на диск измеряет iostat из пакета sysstat. Установите его в Ubuntu и Debian:
apt update
apt install -y sysstatВ AlmaLinux и CentOS Stream:
dnf install -y sysstatЗатем выполните:
iostat -x 1 3Команда выводит 3 отчёта с интервалом в секунду; первый — среднее значение с момента загрузки. Для основного диска (обычно vda или sda) смотрите:
| Столбец | Что показывает | Признак проблемы |
|---|---|---|
r/s, w/s |
операций чтения / записи в секунду | сумма держится около предела диска |
r_await, w_await |
среднее время одного чтения / записи в миллисекундах | десятки или сотни миллисекунд |
%util |
какую долю времени диск был занят | постоянно около 100 |
Процесс, который больше всех читает или пишет, покажет pidstat из того же пакета (столбцы kB_rd/s и kB_wr/s):
pidstat -d 1 5На странице тарифов у семейства Basic указан диск на 300 IOPS, у семейств Стандарт и CPU — на 3000 IOPS. Если r/s и w/s в сумме держатся около этого значения, сервер упирается в скорость диска. Апгрейд в панели возможен только в пределах того же семейства тарифов; если нужен другой тип диска, напишите нам.
Сеть и службы
Какие программы слушают порты
ss -tulpnКаждая строка — открытый порт и программа, которая его слушает, например 0.0.0.0:80 с users:(("nginx",…)). 0.0.0.0 или * — все адреса, 127.0.0.1 — только сам сервер. Если сайт не отвечает и портов 80 и 443 в списке нет, веб-сервер не запущен. Какие порты доступны из интернета: Файрвол: сетевая фильтрация и ufw/firewalld на сервере.
Трафик и соединения
sar -n DEV 1 5
ss -ssar (тоже из sysstat) каждую секунду показывает входящий и исходящий трафик на каждом интерфейсе — столбцы rxkB/s и txkB/s. ss -s подсчитывает открытые соединения. Адреса с наибольшим числом соединений:
ss -tn state established | awk 'NR>1 {print $4}' | sed 's/:[0-9]*$//' | sort | uniq -c | sort -rn | headПопытки подбора пароля к SSH
В Ubuntu и Debian:
journalctl -u ssh --since "1 hour ago" | grep -ciE "failed password|invalid user"В AlmaLinux и CentOS Stream:
journalctl -u sshd --since "1 hour ago" | grep -ciE "failed password|invalid user"Результат — число неудачных попыток входа за последний час. Сотни или тысячи означают, что боты подбирают пароли к серверу. Установите SSH-ключ, затем отключите вход по паролю в панели кнопкой «Отключить вход по паролю» (Включение и отключение входа по паролю по SSH) и установите fail2ban (Защита от подбора паролей с помощью fail2ban). Если на сервер идёт много трафика с множества адресов и сеть перегружена, напишите в поддержку.
Упавшие службы и ошибки в журнале
systemctl --failed
journalctl -p err -bsystemctl --failed выводит службы, завершившиеся с ошибкой; 0 loaded units listed. означает, что таких нет. journalctl -p err -b показывает ошибки с момента последней загрузки (выход — q). Для службы из списка посмотрите состояние и последние сообщения, затем перезапустите её:
systemctl status ИМЯ_СЛУЖБЫ
journalctl -u ИМЯ_СЛУЖБЫ -n 50 --no-pager
systemctl restart ИМЯ_СЛУЖБЫНехватка памяти (OOM)
Когда заканчиваются оперативная память и swap, ядро Linux принудительно завершает один из процессов, как правило тот, который занимает больше всего памяти (OOM killer). Обычно это база данных или приложение: сайт внезапно падает без ошибки в самом приложении. Проверьте:
journalctl -k | grep -i "out of memory"
dmesg -T | grep -iE "out of memory|killed process"Такая строка подтверждает причину:
Out of memory: Killed process 1234 (mysqld) total-vm:2457600kB, anon-rss:1503232kB, …Что делать:
- Снова запустите остановленную службу командой
systemctl restart(см. раздел выше). - Добавьте swap как запас на короткие пики: Добавление файла подкачки (swap).
- Уменьшите потребление памяти приложением: меньше процессов PHP-FPM (
pm.max_children), меньший буфер MariaDB/MySQL (innodb_buffer_pool_size), лимиты памяти для Docker-контейнеров. - Если приложению постоянно нужно больше памяти, перейдите на больший тариф: Апгрейд сервера: переход на больший тариф.
Частые причины
| Что вы видите | Вероятная причина | Что делать |
|---|---|---|
| Один процесс долго держит процессор на 100% | процесс вышел из-под контроля: зациклился, завис скрипт, наложились задачи cron | перезапустите службу или завершите процесс (команды ниже) |
available около 0, сообщения «Out of memory» |
закончилась память | раздел «Нехватка памяти (OOM)» |
Use% 100% для /, ошибка «No space left on device» |
диск заполнен | Диск сервера заполнен |
Высокий wa, %util около 100 |
диск перегружен | найдите процесс через pidstat -d; проверьте предел IOPS тарифа |
| Сотни неудачных попыток входа по SSH, много соединений с одних и тех же адресов | подбор паролей или боты | SSH-ключи и Защита от подбора паролей с помощью fail2ban |
| Нагрузка постоянно выше числа vCPU при обычной работе приложения | тариф мал для приложения | Апгрейд сервера: переход на больший тариф |
st высокий несколько минут подряд |
физический сервер загружен | напишите в поддержку, приложите вывод vmstat 1 5 |
Если процесс относится к службе (nginx, php-fpm, mariadb и т. п.), перезапустите службу:
systemctl restart ИМЯ_СЛУЖБЫИначе попросите процесс завершиться (PID — число из первого столбца top):
kill PIDИ только если через несколько секунд процесс всё ещё работает, завершите его принудительно:
kill -9 PIDВнимание Прежде чем завершать процесс, выясните, что это за процесс:
ps -fp PIDилиsystemctl status PID. Не останавливайте службуssh(sshdв AlmaLinux и CentOS Stream): потеряете доступ. Процессalloy— агент услуги «Мониторинг»; без него графики в панели перестанут обновляться. Неизвестный процесс, который загружает процессор, может быть признаком взлома: Сервер взломан или атакован: что делать.
Графики в панели
Команды показывают, что происходит сейчас. Чтобы увидеть, когда началась проблема, откройте страницу «Мониторинг» в панели. Для серверов с активной услугой «Мониторинг» блок «Динамика» показывает графики «Загрузка CPU (%)», «Использование ОЗУ (%)», «Использование диска (%)», «Сеть (байт/с)», «Средняя нагрузка (1м)» и «Процессы» за период от «1 ч» до «90 дней». Метрики хранятся примерно 15 дней. На той же странице блок «Оповещения» показывает оповещения по вашим серверам и может присылать их на email.
- Что показывает страница: Страница «Мониторинг».
- Оповещения и письма: Оповещения и уведомления по email.
- Как подключить услугу: Услуга «Мониторинг»: агент на сервере.
Без услуги «Мониторинг» данных о сервере на странице нет — диагностируйте командами из этого руководства.
Что отправить в поддержку
Если причину найти не удалось, создайте тикет: «Личный кабинет» → «Помощь и поддержка» → «Новый тикет» (Создание тикета в поддержку). В поле «Сервер (необязательно)» укажите IP-адрес сервера. В поле «Опишите проблему» напишите, когда началась проблема и что вы уже пробовали, и вставьте вывод этих команд:
uptime
free -h
df -h
vmstat 1 5
ps aux --sort=-%cpu | head -n 15Поле вмещает не больше 10 000 символов, более длинный текст обрезается без предупреждения. Не отправляйте пароли, закрытые ключи и API-токены.
Частые вопросы
Средняя нагрузка — 4, а у сервера 2 vCPU. Это плохо?
Процессы стоят в очереди. Если это ненадолго (резервное копирование, обновление), ничего страшного. Если нагрузка держится и сайт отвечает медленно, найдите процесс через top; если это обычная нагрузка вашего приложения, нужен тариф побольше.
free -h показывает почти 0 в столбце free. Память заканчивается?
Не обязательно. Важен столбец available: память из buff/cache освобождается, когда она нужна приложениям.
Сервер упал, а после перезагрузки работает. Как узнать причину? Посмотрите ошибки предыдущей загрузки и возможные завершения процессов из-за нехватки памяти:
journalctl --list-boots
journalctl -b -1 -p err
journalctl -k -b -1 | grep -i "out of memory"Если journalctl --list-boots показывает только одну загрузку, журнал после перезагрузки не сохраняется. Тогда ищите сообщения в /var/log/syslog (Ubuntu, Debian) или /var/log/messages (AlmaLinux, CentOS Stream), если такой файл есть, и на графиках страницы «Мониторинг», если у сервера есть услуга «Мониторинг». Чтобы журнал сохранялся и дальше, создайте для него постоянный каталог:
mkdir -p /var/log/journal
systemctl restart systemd-journaldНет команды iostat, pidstat, sar или htop.
Установите пакет sysstat (для первых трёх) или htop командами из разделов выше.
Можно ли посмотреть нагрузку без SSH? В панели — только на странице «Мониторинг», для серверов с услугой «Мониторинг». Панель не показывает даже, включён сервер или выключен. Команды из этого руководства может выполнить за вас и AI-ассистент, подключённый к аккаунту: Выполнение команд на сервере через AI.