ESC

Start typing to search across invoices, services, domains, tickets, and more...

Search... Ctrl+K
Linux-сервер

Мониторинг Linux-сервера: загрузка CPU, память, дисковый I/O и трафик (top, iostat, iftop, vnstat)

7 шагов 15 мин чтения 2 просмотров 0
Содержание

Когда сайт тормозит, SSH подвисает или трафик внезапно растёт, сначала нужно найти узкое место. В статье собран практичный набор для мониторинга Linux-сервера: top/htop для CPU и процессов, free для памяти, iostat и iotop для дискового I/O, iftop, nload и vnstat для загрузки канала, ss для поиска источников соединений и небольшой cron-скрипт для оповещений. Подходит для VPS и выделенных серверов на Debian/Ubuntu и Rocky Linux/AlmaLinux.

Шаг 1: Установите инструменты мониторинга

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, ...)

Шаг 2: Загрузка CPU и load average (top, htop)

Три числа 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

Шаг 3: Использование памяти и OOM

Нехватку памяти оценивайте по столбцу 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

Шаг 4: Поиск проблем с дисковым I/O и местом

Если в 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

Шаг 5: Текущая загрузка канала и статистика трафика

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

Шаг 6: Источники соединений и трафика через ss

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

Шаг 7: Простые оповещения скриптом в cron

Пока нет 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
Скрипт — лишь страховка. Для нагруженных серверов разверните Netdata, Zabbix или Prometheus с Grafana и добавьте внешнюю проверку доступности с другого сервера, чтобы получить уведомление, даже если машина полностью недоступна.

Частые вопросы

CPU в top почти не загружен, а load average высокий?

В нагрузку входят и процессы, ожидающие дискового I/O (состояние D). Посмотрите на wa и iostat — обычно виноват занятый диск или медленное сетевое хранилище.

vnstat пишет «no data available»?

Сразу после установки данных ещё нет — подождите несколько минут при запущенной службе. Также проверьте, что нужный интерфейс есть в vnstat --iflist.

Как найти процесс, который съедает канал?

Запустите nethogs eth0, чтобы увидеть трафик по процессам, затем ss -tunp — куда подключается этот процесс, и решите, легитимен ли он.

Если проблема не решена, создайте тикет — техническая поддержка IMIDC работает 24/7. Укажите IP сервера, версию ОС, выполненные команды и полный текст ошибки, чтобы мы быстрее нашли причину.

Помог ли вам данный ответ?

Похожие руководства