Хороший мониторинг сервера — это не набор красивых графиков, а предсказуемые алерты, которые помогают реагировать до инцидента. Для большинства инфраструктур достаточно базового набора метрик: CPU, оперативная память и дисковое пространство (плюс несколько уточнений вроде инодов и I/O). Дальше вы настраиваете правила с порогами и логикой срабатывания, подключаете уведомления и доводите всё до стабильной эксплуатации.

Ниже разберём практический подход: как выбрать метрики, задать разумные пороги для алертов по CPU, RAM и диску, уменьшить ложные срабатывания и организовать процесс реакции.

Архитектура мониторинга: метрики, сбор, алертинг и уведомления

Для настройки мониторинга сервера обычно используют связку из четырёх частей: сбор метрик, хранение/визуализация, правила алертинга и система уведомлений. Конкретный стек может быть разным, но логика одна.

Типовая схема выглядит так:

  • Агент или exporter на хосте собирает метрики (CPU, RAM, диски).
  • Сервер сбора (например, Prometheus) периодически запрашивает метрики или принимает их (Push).
  • Хранилище и дашборды (часто Grafana) показывают динамику.
  • Алертинг вычисляет правила и отправляет события в диспетчер уведомлений (например, Alertmanager) или напрямую в каналы связи.

Если у вас уже есть готовая платформа, например Zabbix, Nagios или cloud-мониторинг (CloudWatch, Azure Monitor), вы всё равно пройдёте те же этапы: определить метрики, выставить пороги, выбрать длительность подтверждения и настроить маршрутизацию алертов.

Ключевой момент: алерт — это не просто “если метрика выше X”. Почти всегда нужна логика устойчивости к шуму, иначе система быстро превращается в поток ложных сигналов.

Какие метрики нужны для алертов по CPU, RAM и диску

Дальше важно не “всё подряд”, а набор метрик, которые реально коррелируют с проблемами на уровне приложения и ОС. Ниже — базовая опорная карта, от которой удобно отталкиваться.

CPU: что собирать для корректных алертов

Для CPU чаще всего используют:

  • Доля использования CPU (например, user/system/idle или общая загрузка).
  • Load average (load1/load5/load15) — полезно, но требует осторожности: он зависит от числа ядер и может меняться иначе, чем “процент CPU”.
  • Метрики по ожиданиям и задержкам: iowait (в процентах), либо косвенно через latency диска.
  • Для контейнеров: throttling и лимиты CPU (если используете cgroups/Kubernetes). Это помогает отличать реальную перегрузку от ограничения лимитом.

Если вы настраиваете алерты по CPU без учёта ожиданий I/O, можно получить ситуацию “CPU не высокий, но сервис тормозит”. Тогда проблема может быть не в вычислениях, а в диске или сети.

RAM: что собирать для алертов по памяти

Для оперативной памяти минимум нужен:

  • Доступная память или свободная память (mem_available или аналог).
  • Использование swap (swapused, swapin/out).
  • События и счётчики о проблемах памяти: OOM killer (для Linux), либо эквивалентные события для вашей ОС.

Особенно полезна идея “memory pressure”: когда доступная память падает, система начинает активно использовать swap, а затем возможны падения процессов. Поэтому алерт по RAM обычно эффективнее делать не только по “проценту заполнения”, но и по swap/событиям.

Диск: что собирать для алертов по диску

Для диска ориентируются на две группы проблем: место заканчивается и диск начинает работать хуже.

  • Использование файловой системы: freebytes/usedpercent по каждому важному mount point.
  • Проекция скорости заполнения: насколько быстро растёт used (или изменение свободного места за интервал).
  • Иное “скрытое” ограничение: иноды (inode usage). На некоторых системах иноды исчерпываются раньше места.
  • I/O показатели: latency чтения/записи и/или iowait, а также ошибки устройства.

Важно отдельно мониторить mount points, где живут данные приложения, логи, временные файлы. Алерт “диск почти полный” на /var/log полезен, но если у вас всё важное лежит в /data, он не заменяет мониторинг /data.

Алгоритм настройки алертов: порог, длительность, уровни и логика подавления

Чтобы алерты по CPU, RAM и диску работали в реальной эксплуатации, используйте простой алгоритм.

  1. Определите, что именно должно считаться проблемой

Для CPU это может быть “постоянная нагрузка”, для RAM — “память уходит в swap” или “низкий запас доступной памяти”, для диска — “опасное заполнение” или “растущая деградация I/O”.

  1. Выберите тип правила

Чаще всего используют:

  • Статический порог: метрика выше/ниже значения.
  • Порог по динамике: скорость заполнения диска или рост latency.
  • Композиции: например, низкая доступная память плюс рост swap.
  1. Добавьте длительность подтверждения

Алерт должен срабатывать, когда проблема держится. Практический подход:

  • делайте условия “выше порога дольше N минут” (для кратких пиков это отключит лишние сигналы);
  • для критических сценариев длительность можно уменьшать, для предупреждений — увеличивать.
  1. Разведите уровни severity

Обычно полезны как минимум два уровня:

  • warning: “скоро будет проблема, проверьте и подготовьтесь”;
  • critical: “вмешательство нужно сейчас”.
  1. Учтите ситуации, где алерт не должен срабатывать

Примеры подавления:

  • диск, который намеренно заполняется загрузкой (и вы знаете периодичность);
  • узлы на обслуживание;
  • хосты, где метрики временно отсутствуют (в зависимости от логики платформы это лучше трактовать как “невозможно оценить”, а не как “проблема”).
  1. Снабдите алерт действием (runbook)

Алерт без подсказки “что делать” теряет ценность. В runbook достаточно указать: где смотреть детали, какие команды/дашборды открыть, и какие типовые действия предпринять.

Алерты по CPU: настраиваем пороги и избегаем ложных сигналов

Алерты по CPU часто настраивают слишком грубо: берут один процент “загрузка выше 90” и получают срабатывания на пиках. Правильный вариант зависит от характера нагрузки: бывает, что пиковая загрузка допустима, а проблема начинается только при длительном удержании.

CPU usage vs load average

CPU usage говорит, сколько вычислительных ресурсов занято. Load average показывает общее число задач в очереди и на исполнение. На многопроцессорных системах load может быть выше 1 просто из-за того, что ядер несколько, и этот показатель нужно интерпретировать аккуратно.

Практика настройки:

  • Для алертов “высокая загрузка” обычно выбирают CPU usage.
  • Load average используют как вспомогательную метрику, чтобы понять, что очередь растёт.

Пороговые уровни для CPU: ориентиры без догм

Если у вас нет исторической базы, стартуйте с ориентиров и обязательно откорректируйте после наблюдения:

  • warning: устойчиво высокая загрузка на горизонте нескольких минут;
  • critical: длительное удержание очень высокого процента загрузки или резкий переход в режим постоянной перегрузки.

Конкретные цифры зависят от количества CPU, типа задач и того, есть ли лимиты (например, в контейнерах). Поэтому корректнее задавать пороги как “уровни относительно нормального поведения” вашего сервиса, а не как универсальные значения.

Для контейнеров и cgroups отдельно учитывайте throttling

В Kubernetes и подобных средах CPU может быть ограничен. Тогда вы можете видеть ситуацию:

  • CPU usage не такой высокий, как ожидали,
  • но процесс постоянно простаивает из-за throttling.

Если ваша среда поддерживает метрики cgroup throttling, алерт по throttling обычно более точный, чем “просто процент CPU”.

Проверяйте контекст: CPU высокий или это I/O-ожидания

Когда CPU повышается, иногда причина — не вычисления, а ожидания и обработка. Наличие iowait и рост latency диска помогают понять взаимосвязь. Если вы видите рост iowait вместе с CPU, имеет смысл держать в голове, что “узкое место” часто в диске.

Типичная ошибка: настроить только CPU алерт и пропустить деградацию I/O. В результате команда начинает искать баги в коде, хотя проблема в файловой системе или устройстве.

Алерты по RAM: как поймать опасный сценарий до OOM

Алерты по RAM стоит настраивать так, чтобы они реагировали не на “процент использовано”, а на уменьшение доступного запаса и признаки, что система входит в режим деградации.

Метрика выбора: доступная память и swap

Для многих Linux-систем удобнее ориентироваться на доступную память (mem_available) вместо “просто используемой”. Доступная память отражает реальный запас под будущие аллокации, а “использование” может выглядеть пугающе из-за кэшей.

В связке с этим:

  • watch swap_used или активность swap-in/out;
  • watch события OOM killer (если у вас такие события собираются метриками).

Сигнал “память заканчивается” чаще выглядит как:

  • доступная память падает,
  • затем растёт swap,
  • потом возможно падение процессов или резкие задержки.

Warning и critical по памяти: логика с подтверждением

Хорошая модель:

  • warning срабатывает, когда доступная память заметно падает и сохраняет тренд;
  • critical срабатывает, когда swap включился/растёт или когда есть признаки приближения к OOM.

Почему важно “тренд” и длительность:

  • краткие провалы доступной памяти возможны при всплесках нагрузки;
  • swap может включиться на короткое время и потом стабилизироваться.

Подтверждение условия на интервале уменьшает количество лишних алертов и делает критические события реже, но точнее.

Важный нюанс: учёт кешей и поведения приложений

Разные приложения по-разному используют память. Если сервис держит большой кэш (например, файловый или свой буфер), “использование RAM” может быть стабильным и не означать проблему. Тогда ориентируйтесь на:

  • доступную память,
  • swap,
  • OOM и деградацию latency.

Типичная ошибка: выставить алерт “RAM > 90%” и годами получать сигналы от сервиса, который постоянно так работает. В итоге алерт перестаёт вызывать доверие.

Алерты по диску: пространство, иноды и скорость заполнения

Диск — один из самых “практичных” источников проблем. С ним часто всё просто: место заканчивается, и приложение перестаёт писать логи или новые данные. Но на практике есть несколько подводных камней: иноды, временные каталоги, а также деградация I/O до того, как место закончится.

Разделяйте mount points и критичные пути

Настройка алертов по диску должна быть по каждому важному файловому разделу:

  • корневой раздел,
  • раздел с данными приложения,
  • раздел с логами,
  • раздел под временные файлы (включая /tmp, если он на отдельном mount).

Если вы мониторите только один “общий диск”, вы пропустите ситуацию, когда свободное место закончилось именно на нужном mount point, а общий диск ещё “нормальный”.

Порог по свободному месту: два сценария

У диска два распространённых “сценария”:

  1. “Порог по абсолютной свободе” (сколько осталось байт/ГБ).
  2. “Порог по проценту заполнения” (сколько используется).

Оба подхода работают, но часто лучше сочетать:

  • процент помогает при разном размере разделов,
  • абсолютные байты важны, когда разделы разного масштаба, и ошибка “%” может привести к слишком позднему срабатыванию.

Если у вас есть статистика потребления, добавьте третий элемент:

  • алерт по скорости заполнения или проекциям на будущий момент.

Почему полезна скорость заполнения диска

Факт, что диск сейчас заполнен на 80%, не всегда означает срочность. Если заполнение растёт медленно, можно спокойно планировать. Если же рост быстрый, нужен алерт “скоро закончится место”.

Практическая логика:

  • используйте изменение свободного места за последние N минут;
  • если тренд устойчиво ведёт к достижению порога в обозримом будущем, повышайте severity.

Это особенно актуально для логов и временных файлов, где расход может ускоряться при сбоях в сервисах-потребителях.

Иноды: когда место ещё есть, а файловые операции уже падают

Исчерпание инодов происходит, когда файлов слишком много (мелкие файлы, временные артефакты, логи с ротацией и ошибками). Тогда приложение может начать получать ошибки записи, даже если байт “ещё хватает”.

Поэтому алерт по инодам стоит включать на разделах, где интенсивно создаются файлы:

  • директории с логами,
  • папки с кэшем,
  • временные рабочие директории.

I/O деградация: алерт не только про место

Иногда диск начинает работать хуже: растёт latency, растёт iowait, происходят таймауты. В этом случае алерт “used_percent” может ещё не сработать, потому что место заполнено не полностью.

Для диска полезны дополнительные условия:

  • высокий iowait длительно (как индикатор ожиданий),
  • рост latency операций (если метрики доступны),
  • ошибки устройства или filesystem error events.

Смысл в том, чтобы поймать деградацию до того, как появятся симптомы на уровне приложения.

Как сделать алерты по CPU, RAM и диску устойчивыми к шуму

Даже правильно выбранные пороги могут давать “шум”, если алерт срабатывает на каждом кратковременном отклонении. Устойчивость достигается не сложной теорией, а набором инженерных приёмов.

Подтверждение условий на интервале

Самый универсальный механизм:

  • правило должно выполняться непрерывно N минут;
  • N для warning чаще больше, чем для critical.

Если ваша платформа поддерживает for/until или аналог “держать условие”, используйте его. Это снижает долю ложных срабатываний на всплесках.

Алерт не должен “дребезжать”

Дребезг — когда метрика пересекает порог туда-сюда и алерт постоянно стартует/заканчивается. Чтобы этого избежать:

  • используйте разнесение порогов для входа и выхода (hysteresis), если поддерживается;
  • либо используйте длительность подтверждения и отдельно критерии “сброса” (для некоторых систем это настраивается логикой).

Группируйте алерты и ограничивайте дубликаты

Если у вас много узлов, критично:

  • группировать события по сервису, кластера или роли;
  • ограничивать частоту уведомлений.

При отсутствии дедупликации команда может получать десятки одинаковых уведомлений при одном событии. Диспетчер алертов обычно решает это через grouping и inhibition.

Включайте “информативность” в алерт

Один алерт должен содержать контекст:

  • какой хост и какой mount point (для диска),
  • текущее значение и порог,
  • интервал, за который условие было истинным.

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

Уведомления и маршрутизация: как довести алерты до действий

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

Разнесите каналы по severity

Обычно делают так:

  • warning идёт в канал для дежурных/инженеров (или в чат с уведомлениями);
  • critical уходит в пейджинг (если есть) или в более жёсткий канал.

Это не обязательное правило, но общий принцип — минимизировать шум и при этом не терять срочные события.

Настройте правила маршрутизации в диспетчере алертов

В диспетчере логично использовать:

  • routing по меткам (environment, service, team, severity);
  • grouping, чтобы не слать пять уведомлений подряд;
  • inhibit правила, чтобы если есть критический алерт, не дублировать предупреждения от той же причины (и наоборот, в некоторых случаях предупреждение может подавляться при критике).

Если у вас есть несколько систем алертинга, держите правила согласованными, чтобы критичность не “переезжала” между платформами.

Добавьте runbook внутрь алерта

Самый практичный формат:

  • ссылка на страницу с диагностикой;
  • 3-5 пунктов “что посмотреть” и “что сделать”;
  • какие метрики проверять в первую очередь: CPU usage, mem_available, swap, свободное место, иноды, iowait.

Команда перестаёт изобретать план действий каждый раз заново.

Тестирование: как проверить, что алерты по CPU, RAM и диску работают

Без тестов вы не узнаете, сработают ли алерты в нужный момент и не будет ли “шторма” уведомлений. Тестирование можно сделать практичным и поэтапным.

Тест логикой условий (без вреда продакшену)

Сначала проверьте на тестовом стенде:

  • что правило корректно вычисляет метрику,
  • что порог и длительность соответствуют ожиданиям,
  • что алерт содержит правильные лейблы и контекст.

Если в системе есть возможность “simulate alert” или тестовые генераторы метрик, используйте их. Это быстро и безопасно.

Тест по нагрузке для CPU

Для CPU обычно делают контролируемый сценарий:

  • поднять нагрузку на сервис или воркер,
  • наблюдать, как меняются CPU и какие алерты появляются.

Важно не просто “получить сработку”, а проверить длительность: предупреждение должно появляться раньше, чем критическое, если вы так настроили.

Тест по памяти для RAM

Сценарий для RAM обычно осторожнее из-за риска OOM. Лучше проверить:

  • падение mem_available в ограниченных рамках,
  • включение swap в безопасной конфигурации,
  • реакцию на рост swap_used и отсутствие резких ложных критик.

Если вы можете тестировать в пределах staging или на отдельном узле, это предпочтительнее.

Тест диска: место, иноды и I/O

Диск тестируют как минимум в двух измерениях:

  • исчерпание места или достижение порога свободного объёма (в пределах контролируемой тестовой файловой системы);
  • рост числа файлов для инодов (на тестовом mount).

Отдельно проверьте I/O метрики: если вы добавляете алерт по latency или iowait, убедитесь, что он действительно появляется при деградации и не срабатывает “в пустоту”.

После теста проверьте качество алертов

Смотрите на три вещи:

  • точность: алерт сработал при проблеме или только при шуме;
  • удобство: в алерте достаточно данных, чтобы начать диагностику;
  • стабильность: не было дребезга и шквала уведомлений.

Распространённые ошибки при настройке алертов по CPU, RAM и диску

Ниже список типичных проблем, из-за которых мониторинг сервера перестаёт работать как инструмент.

  • Слишком короткая длительность условия

Алерты срабатывают на пиках и кратких лагов. Результат: команда начинает игнорировать всё подряд.

  • Один порог для всех сервисов и всех узлов

Нагрузка может отличаться в разы по роли узла. Если пороги одинаковые, вы либо получите шум, либо пропустите реальные инциденты.

  • Игнорирование swap и событий OOM для RAM

Ориентация только на “процент заполнения” часто даёт неверные выводы. Опасные сценарии обычно проявляются через swap и OOM.

  • Нет отдельного мониторинга mount points

Падает критичный раздел, а алерт смотрит на “средний диск”. Следствие — задержка реакции.

  • Мониторинг диска без инодов

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

  • Неправильная интерпретация CPU load average

Load average сам по себе без контекста числа ядер может вводить в заблуждение.

  • Алерт без runbook

Если в уведомлении нет “что делать прямо сейчас”, оно превращается в тикет без начала диагностики.

  • Нет маршрутизации и группировки

Команда получает десятки уведомлений на каждый инцидент и тонет в корреспонденции.

Итоговый чек-лист: настройка алертов, которые реально помогают

Если собрать всё в практический план, получится следующий “минимальный стандарт” для мониторинга сервера с алертами по CPU, RAM и диску.

  1. Определите источники метрик и проверьте, что они реально обновляются

Агент/экспортер должен отдавать метрики, а сбор — не падать молча.

  1. Для CPU настройте алерты по устойчивой загрузке и, при необходимости, throttling

Используйте подтверждение на интервале и не полагайтесь на один load average.

  1. Для RAM настройте алерты по доступной памяти и по swap

Добавьте реакцию на OOM killer или аналогичные события, если они доступны.

  1. Для диска настройте алерты по свободному месту и по росту заполнения

Отдельно включите мониторинг инодов и I/O деградации (если это значимо для ваших сервисов).

  1. Разведите warning и critical

warning — раннее предупреждение, critical — сигнал к немедленным действиям.

  1. Настройте устойчивость к шуму

Длительность подтверждения, подавление дребезга, группировка уведомлений.

  1. В каждый алерт добавьте контекст и runbook

Хост, mount point (для диска), значение/порог и куда смотреть дальше.

Если сделать эти шаги и потом 1-2 раза пересмотреть пороги по реальным данным за период, алерты по CPU, RAM и диску обычно перестают быть “шумом” и начинают работать как система раннего предупреждения. Начните с базового набора правил, подключите уведомления, протестируйте на стенде и дальше улучшайте по факту эксплуатации.