Start typing to search across invoices, services, domains, tickets, and more...
Когда сайт тормозит, SSH подвисает или трафик внезапно растёт, сначала нужно найти узкое место. В статье собран практичный набор для мониторинга Linux-сервера: top/htop для CPU и процессов, free для памяти, iostat и iotop для дискового I/O, iftop, nload и vnstat для загрузки канала, ss для поиска источников соединений и небольшой cron-скрипт для оповещений. Подходит для VPS и выделенных серверов на Debian/Ubuntu и Rocky Linux/AlmaLinux.
top, free и ss есть в системе, остальное нужно установить; на Rocky/AlmaLinux сначала подключите EPEL. В примерах интерфейс называется eth0 — уточните реальное имя командой ip -br addr.
# Debian / Ubuntu
apt install -y htop sysstat iotop iftop nload vnstat nethogs
# Rocky Linux / AlmaLinux (most tools are in EPEL)
dnf install -y epel-release
dnf install -y htop sysstat iotop iftop nload vnstat nethogs
ip -br addr # find your network interface name (eth0, ens3, ...)
Три числа load average — средняя нагрузка за 1, 5 и 15 минут; если они долго выше числа ядер, сервер не справляется. В top смотрите на три поля: высокий us — CPU расходуют сами приложения; высокий wa — процессор ждёт диск, переходите к I/O; постоянно высокий st (steal) на VPS говорит о конкуренции за ресурсы хоста — создайте тикет, и мы проверим.
nproc # number of CPU cores
uptime # load average for 1, 5 and 15 minutes
top # 1 = per-core view, P = sort by CPU, M = sort by memory, q = quit
htop # F6 to choose the sort column, F9 to send a signal
ps aux --sort=-%cpu | head -n 10
Нехватку памяти оценивайте по столбцу available в free -h, а не по free: Linux занимает свободную память под кэш, и маленькое значение free — норма. Если si/so в vmstat постоянно больше нуля, система активно свопится. Если процессы пропадают без следа, ищите в dmesg записи OOM Killer. При нехватке памяти добавьте swap (см. статью про Swap) или увеличьте тариф.
free -h
vmstat 1 5 # si/so > 0 continuously = swapping
ps aux --sort=-%mem | head -n 10
dmesg -T | grep -iE "out of memory|killed process"
journalctl -k --since "1 day ago" | grep -i oom
Если в iostat %util около 100 % и растёт await, диск перегружен. Затем iotop покажет, какой процесс больше всего читает или пишет — обычно это база данных, запись логов или бэкап. После включения sysstat данные пишутся каждые 10 минут, и sar покажет, что происходило раньше. Про нехватку места — в статье о заполненном диске.
iostat -xz 1 5 # watch %util, r_await / w_await, rkB/s and wkB/s
iotop -oPa # only processes doing I/O, accumulated totals
df -h # space usage
df -i # inode usage
# Keep history with sysstat, then read it with sar
systemctl enable --now sysstat
sar -u # CPU today
sar -d -p # disks today
nload показывает входящую и исходящую скорость интерфейса в реальном времени; iftop выводит трафик по удалённым IP, так что сразу видно, кто активно качает; nethogs разбивает трафик по процессам. vnstat в фоне копит суточную и месячную статистику — удобно для контроля канала и объёма трафика. Необъяснимый исходящий трафик может означать, что сервер взломан и атакует других.
ip -s link show eth0 # total RX/TX bytes since boot
nload eth0 # live in/out graph
iftop -i eth0 -nNP # live traffic per remote host and port
nethogs eth0 # live traffic per process
systemctl enable --now vnstat
vnstat -i eth0 -l # live rate
vnstat -d # daily totals
vnstat -m # monthly totals
ss — быстрая замена netstat. Команда ниже считает установленные соединения по каждому удалённому IP и быстро выявляет агрессивных ботов или источники HTTP-флуда, которых затем можно заблокировать файрволом или Fail2ban.
ss -s # connection summary
ss -tunp | head -n 30 # connections with process names
ss -lntup # listening ports
# Top 10 remote IPs by number of established TCP connections
ss -Htn state established | awk '{sub(/:[0-9]+$/,"",$4); print $4}' \
| sort | uniq -c | sort -rn | head -n 10
# Connections to your web server only
ss -Htn state established '( sport = :443 )' | wc -l
Пока нет Zabbix или Prometheus, небольшой скрипт может каждые пять минут проверять нагрузку, доступную память и заполненность дисков, записывать превышения в лог и отправлять их в webhook — Telegram-бот, Slack или Discord (формат JSON подстройте под сервис).
cat > /usr/local/bin/check-health.sh <<'EOF'
#!/bin/bash
LOAD_MAX=$(nproc) # alert when 1-min load > number of cores
MEM_MIN_MB=200 # alert when available memory < 200 MB
DISK_MAX=90 # alert when a filesystem is >= 90 % full
WEBHOOK="https://hooks.example.com/your-webhook"
HOST=$(hostname)
MSG=""
LOAD=$(cut -d' ' -f1 /proc/loadavg)
if awk -v l="$LOAD" -v m="$LOAD_MAX" 'BEGIN{exit !(l>m)}'; then
MSG+="load $LOAD > $LOAD_MAX; "
fi
AVAIL=$(free -m | awk '/^Mem:/{print $7}')
if [ "$AVAIL" -lt "$MEM_MIN_MB" ]; then MSG+="available memory ${AVAIL}MB; "; fi
while read -r USE MNT; do
if [ "${USE%\%}" -ge "$DISK_MAX" ]; then MSG+="disk $MNT at $USE; "; fi
done < <(df -P -x tmpfs -x devtmpfs | awk 'NR>1{print $5, $6}')
if [ -n "$MSG" ]; then
echo "$(date '+%F %T') $HOST $MSG" >> /var/log/health-alert.log
curl -s -m 10 -H 'Content-Type: application/json' \
-d "{\"text\":\"[$HOST] $MSG\"}" "$WEBHOOK" > /dev/null
fi
EOF
chmod +x /usr/local/bin/check-health.sh
/usr/local/bin/check-health.sh; tail /var/log/health-alert.log
# Run every 5 minutes: crontab -e
*/5 * * * * /usr/local/bin/check-health.sh
В нагрузку входят и процессы, ожидающие дискового I/O (состояние D). Посмотрите на wa и iostat — обычно виноват занятый диск или медленное сетевое хранилище.
Сразу после установки данных ещё нет — подождите несколько минут при запущенной службе. Также проверьте, что нужный интерфейс есть в vnstat --iflist.
Запустите nethogs eth0, чтобы увидеть трафик по процессам, затем ss -tunp — куда подключается этот процесс, и решите, легитимен ли он.
Если проблема не решена, создайте тикет — техническая поддержка IMIDC работает 24/7. Укажите IP сервера, версию ОС, выполненные команды и полный текст ошибки, чтобы мы быстрее нашли причину.