Как настроить базовые алерты при высокой загрузке или нехватке диска на VPS?

В этой статье разберём на примере Ubuntu/Debian:

  • как настроить простые алерты по высокой нагрузке (load average) на VPS;
  • как следить за нехваткой свободного места на диске;
  • как отправлять уведомления на e-mail через cron;
  • как тестировать алерты и не ловить лишний спам.

Что будем мониторить и какие пороги задать

Чтобы не устроить себе «шторма» из писем, нужно заранее определиться с порогами.

1. Высокая нагрузка (load average)

Показатель load average показывает, сколько задач одновременно ждут CPU и диск. Смотрим его, например, командой:

uptime

Для простоты будем использовать первый показатель (за 1 минуту). Базовая логика такая:

  • на 1 vCPU критично, когда load >= 2–3;

  • на 2 vCPU — когда load постоянно выше 4 и дальше растёт;

  • на 4 vCPU — когда значения держатся сильно выше 8.

В скрипте мы просто зададим свой порог, например:

MAX_LOAD=4

2. Свободное место на диске

Для диска ориентируемся по проценту занятого пространства на корневом разделе /. Смотреть можно так:

df -h /

Порог имеет смысл ставить на уровне 80–90%:

  • при 80% — «жёлтый» уровень: пора почистить логи и бэкапы;

  • при 90% и выше — «красный»: скоро начнутся ошибки записи и падения сервисов.

В скрипте будем использовать, например:

MAX_DISK_USAGE=90
Проверка load average и свободного места на диске через uptime и df -h

Важно: это базовые, «на глаз» пороги. Для своих проектов можно задать более строгие значения.

Готовим скрипт проверки нагрузки и диска

Сделаем один скрипт, который:

  • замеряет текущий load average и использование диска;

  • если порог превышен — отправляет письмо на указанный e-mail;

  • если всё хорошо — молчит.

1. Создаём файл скрипта

Открываем новый файл, например в /usr/local/bin:

sudo nano /usr/local/bin/vps-health-check.sh

Вставляем в него содержимое:

#!/usr/bin/env bash

# Порог по нагрузке (load average за 1 минуту)
MAX_LOAD=4

# Порог по заполнению диска (в процентах) для корневого раздела /
MAX_DISK_USAGE=90

# E-mail для уведомлений (подставь свой)
ALERT_EMAIL="admin@example.com"

# Имя хоста для понятного письма
HOSTNAME=$(hostname)

# Текущая нагрузка (берём целую часть load average из /proc/loadavg)
CURRENT_LOAD=$(awk '{printf "%d", $1}' /proc/loadavg)

# Заполненность диска / в процентах (без символа %)
CURRENT_DISK_USAGE=$(df -P / | awk 'NR==2 {gsub("%","",$5); print $5}')

MESSAGE=""

# Проверка нагрузки
if [ "$CURRENT_LOAD" -ge "$MAX_LOAD" ]; then
  MESSAGE+="Высокая нагрузка на сервере ${HOSTNAME}: load=${CURRENT_LOAD} (порог ${MAX_LOAD}).\n"
fi

# Проверка диска
if [ "$CURRENT_DISK_USAGE" -ge "$MAX_DISK_USAGE" ]; then
  MESSAGE+="Мало свободного места на диске / на сервере ${HOSTNAME}: занято ${CURRENT_DISK_USAGE}% (порог ${MAX_DISK_USAGE}%).\n"
fi

# Если есть что отправлять — шлём письмо
if [ -n "$MESSAGE" ]; then
  echo -e "$MESSAGE" | mail -s "VPS alert: ${HOSTNAME}" "$ALERT_EMAIL"
fi
Редактирование скрипта алертов vps-health-check.sh в nano

Сохраняем файл и выходим из редактора.

Примечание: команда mail предполагает, что у вас уже настроен локальный MTA (Postfix/Exim) или используется отдельная статья по отправке почты с сервера. Если почта не настроена — письмо просто никуда не уйдёт.

2. Делаем скрипт исполняемым

sudo chmod +x /usr/local/bin/vps-health-check.sh

3. Проверяем работу вручную

Запускаем скрипт в консоли:

sudo /usr/local/bin/vps-health-check.sh

Если пороги уже превышены — должно уйти письмо. Если всё в норме — скрипт отработает тихо и ничего не выведет.

Запуск скрипта по расписанию через cron

Теперь надо сделать так, чтобы проверки запускались автоматически, например каждые 5 минут.

Вариант 1: через crontab пользователя root

  1. Открываем crontab:

    sudo crontab -e
  2. В самый низ добавляем строку:

    */5 * * * * /usr/local/bin/vps-health-check.sh

    Это значит: запускать скрипт каждые 5 минут от имени root.

Вариант 2: отдельный файл в /etc/cron.d

Если хочется держать всё в отдельном файле, можно сделать так:

echo '*/5 * * * * root /usr/local/bin/vps-health-check.sh' | sudo tee /etc/cron.d/vps-health-check
Добавление задачи для скрипта алертов в crontab

Совет: если почта настроена правильно, можно в начале «поиграться» с порогами (поставить заведомо низкие значения), чтобы убедиться, что письма приходят, а потом поднять пороги до адекватных.

Как не утонуть в спаме от алертов

Базовый скрипт уже работает, но у любого мониторинга есть оборотная сторона — слишком частые уведомления. Несколько приёмов, которые помогают не сойти с ума.

1. Делать проверку не каждую минуту

Для нагрузки и диска чаще всего достаточно интервала в 5–10 минут. Если сделать запуск каждую минуту, при длительной перегрузке сервера почта просто забьётся.

2. Не ставить слишком низкие пороги

  • Не стоит слать алерт уже при 60–70% заполнения диска — это рабочий режим.

  • По нагрузке тоже лучше ориентироваться на «стало плохо и держится», а не на одиночные всплески.

3. Добавить простую «защиту от повторов»

Если захочется усложнить скрипт, можно хранить файл-флаг, что алерт уже отправлялся, и не дёргать почту при каждом запуске. Например, создавать и удалять файлы вида /tmp/vps_alert_highload, но это уже следующий уровень доработки.

Расширяем идею: память, отдельные разделы, Telegram

Тот же подход легко масштабируется:

  • добавить проверку свободной памяти через free -m или /proc/meminfo;

  • контролировать не только корневой раздел /, но и отдельные точки монтирования: /home, /var, раздел под бэкапы;

  • вместо e-mail отправлять уведомления в Telegram через бота (HTTP-запрос в curl внутри скрипта).

Логика везде одна и та же: что-то померили → сравнили с порогом → при выходе за пределы отправили одно понятное сообщение.

Итоги

  • Определились с простыми порогами по нагрузке и заполнению диска для VPS.

  • Собрали Bash-скрипт, который проверяет load average и свободное место и при необходимости отправляет письмо.

  • Подключили cron, чтобы проверки выполнялись автоматически по расписанию.

  • Разобрали, как избежать бесконечного спама и как расширять скрипт под свои задачи (память, другие разделы, Telegram).

Вывод: базовые алерты по нагрузке и диску можно настроить на любом VPS без сложных систем мониторинга. Один небольшой скрипт и cron уже дают минимум контроля, чтобы узнавать о проблемах до того, как сервер окончательно «ляжет».

Оставить комментарий