Непрерывный мониторинг: sar, node_exporter, Grafana, Zabbix

Рейтинг: 62.1% · 15 голосов
Подробный курс по диагностике и производительности Linux для админов и DevOps: с чего начать, методология USE, логи (journalctl, dmesg), процессы, CPU, память и OOM, диск и IO (iostat), сеть (ss, tcpdump), системные вызовы и strace, ltrace, perf, флеймграфы, ftrace, eBPF и bpftrace, lsof, мониторинг. Разбор каждого инструмента с чтением вывода.
Ответить
Аватара пользователя
Dmitry_SRE
Сообщения: 47
Зарегистрирован: 11 май 2026, 05:31

Непрерывный мониторинг: sar, node_exporter, Grafana, Zabbix

Сообщение Dmitry_SRE »

Оглавление курса (47)
  1. С чего начать диагностику Linux: методология вместо паники
  2. Первые 60 секунд: экспресс-диагностика нагруженного сервера
  3. Методологии диагностики: USE, RED и здравый смысл
  4. Логи systemd через journalctl: где искать причину
  5. Где лежат логи Linux: /var/log, dmesg и rsyslog
  6. Источники правды: load average, /proc и /sys
  7. Процессы Linux: ps, pstree и состояния процессов
  8. Интерактивный мониторинг: top и htop
  9. Метрики процессов во времени: pidstat
  10. Приоритеты и ограничения: nice, ionice, cgroups
  11. Сигналы и зависшие процессы: kill, и что делать с D-state
  12. Загрузка CPU: user, system, iowait, steal и контекст-свитчи
  13. Диагностика CPU по ядрам: vmstat и mpstat
  14. Профилирование CPU: perf top и поиск пожирателя
  15. Частоты, троттлинг и NUMA: turbostat и numastat
  16. Память Linux: RSS, VSZ, page cache и миф о нехватке памяти
  17. Сколько памяти занято: free, /proc/meminfo и vmstat
  18. Поиск утечек и пожирателей памяти: smem, pmap, smaps
  19. Swap и подкачка: swapon, swappiness, когда своп - это боль
  20. OOM killer: кто и за что убил процесс
  21. Память ядра и slab: slabtop и куда уходит RAM
  22. Подсистема ввода-вывода: путь запроса от приложения до диска
  23. Диагностика диска: iostat и чтение await, %util
  24. Кто грузит диск: iotop и атрибуция io процессам
  25. Файловые системы: df, du, иноды и куда делось место
  26. Глубокая диагностика блочного слоя: blktrace и biolatency
  27. Кеш страниц и грязные данные: dirty pages, fsync, drop_caches
  28. Сетевой стек Linux: путь пакета и где возникают задержки
  29. Сокеты и соединения: ss и netstat
  30. Захват трафика: tcpdump для диагностики сети
  31. Задержки и потери в сети: ping, mtr, диагностика латентности
  32. Сеть как источник проблем: nftables, conntrack, дропы
  33. Что такое системный вызов и зачем его трассировать
  34. strace: трассировка системных вызовов на практике
  35. strace в бою: почему программа висит, падает или тормозит
  36. ltrace: трассировка вызовов библиотек
  37. Накладные расходы трассировки и безопасные альтернативы
  38. perf: универсальный профайлер Linux
  39. Флеймграфы: визуализация профиля производительности
  40. Трассировка ядра: ftrace и trace-cmd
  41. eBPF: революция в наблюдаемости Linux
  42. Инструменты eBPF на практике: BCC и bpftrace
  43. lsof: открытые файлы, дескрипторы, кто держит файл и порт
  44. Разбор кейса: приложение тормозит - пошаговая диагностика
  45. Непрерывный мониторинг: sar, node_exporter, Grafana, Zabbix (вы здесь)
  46. Диагностика в контейнерах: cgroups, лимиты, Docker и Kubernetes
  47. Карта инструментов и сквозной разбор инцидента производительности
До этого мы чинили проблемы руками: пришла жалоба, ты лезешь на сервер с top, strace, perf и ловишь беду в моменте. Но беда не ждёт, пока ты залогинишься. Сервер тормозил ночью, к утру отпустило - а ты сидишь и гадаешь, что это было. Или хуже: о проблеме ты узнаёшь не от графиков, а от злого клиента в чате. Этот урок про то, как перейти от разовой диагностики к постоянному наблюдению. Цель непрерывного мониторинга системы Linux простая: видеть деградацию ДО жалоб и всегда иметь историю - что творилось вчера в 03:40, когда всё легло. Разберём два слоя: историю из коробки на одном хосте (sar) и полноценный мониторинг парка серверов (Prometheus, Zabbix, netdata) с акцентом на то, что именно мерить, чтобы не утонуть в графиках.

sar: машина времени из коробки для мониторинга системы Linux

Начнём с инструмента, который, скорее всего, уже стоит у тебя в системе и про который многие забывают. Пакет sysstat и его утилита sar - это исторические метрики прямо из коробки, без всякого облака и агентов. Фишка в том, что фоновый сборщик sadc по расписанию пишет бинарные снимки состояния системы. В современных дистрибутивах сбор запускает таймер systemd (sysstat-collect.timer), который по умолчанию срабатывает раз в 10 минут, плюс суточный sysstat-summary. Старые системы делали то же через cron. Важная деталь на 2026: путь к данным зависит от семейства дистрибутива. В Debian/Ubuntu/Astra Linux файлы лежат в /var/log/sysstat/ и называются saYYYYMMDD (или saDD), в RHEL/Fedora/RED OS - в /var/log/sa/ с именем saDD, где DD это день месяца. Запомни этот нюанс, иначе будешь искать файл не там.

Сначала поставь и включи сбор, если ещё не:

Код: Выделить всё

sudo apt install sysstat        # Debian/Ubuntu/Astra Linux
sudo dnf install sysstat        # RHEL/Fedora/RED OS
# включить периодический сбор (Debian-семейство)
sudo sed -i 's/ENABLED="false"/ENABLED="true"/' /etc/default/sysstat
sudo systemctl enable --now sysstat
# проверить, что таймер тикает
systemctl list-timers | grep sysstat
По умолчанию sadc хранит данные за 10-28 дней (параметр HISTORY в /etc/sysstat/sysstat). Если нужна история длиннее - увеличь это число, но помни, что бинарные sa-файлы не переносятся между разными версиями sysstat.

Теперь смотрим, что было. Загрузка процессора за сегодня:

Код: Выделить всё

$ sar -u
12:00:01     CPU   %user   %nice  %system  %iowait  %steal   %idle
12:10:01     all    8.12    0.00     3.40    12.55    0.00    75.93
12:20:01     all    7.80    0.00     3.21    41.02    0.00    47.97
Как читать по колонкам. %user - время на пользовательские процессы, %nice - на процессы с пониженным приоритетом, %system - на ядро (системные вызовы и обработка прерываний). %idle - сколько CPU простаивал; чем больше, тем свободнее машина. Но самое важное поле для новичка тут - %iowait. Это доля времени, когда CPU ничего не делал, потому что ЖДАЛ диск или сеть. В первой строке 12% - терпимо, во второй 41% - тревога: процессор простаивает, упираясь в дисковый ввод-вывод. Важная ловушка восприятия: высокий %iowait не значит, что диск сломан - он значит, что задачам нечем заняться, кроме ожидания диска. На загруженном многоядерном сервере %iowait может быть низким при реальной проблеме с диском, потому что другие ядра заняты работой. Поэтому iowait смотрят в связке с -d (загрузка дисков). И %steal: если он не ноль на виртуалке - сосед по гипервизору ворует твои такты, жалуйся хостеру или меняй тариф.

Память и обмен с диском - флаг -r, дисковый ввод-вывод поблочно - -b, по устройствам с очередью и временем отклика - -d, а для мониторинга сети Linux пригодится -n DEV:

Код: Выделить всё

$ sar -n DEV
12:10:01   IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   %ifutil
12:10:01    eth0   1850.4    1602.1    980.55    1420.33     11.50
Здесь rxkB/s и txkB/s - принято и отправлено килобайт в секунду, а %ifutil (в свежих версиях sysstat) сразу показывает процент использования полосы интерфейса. Если %ifutil близко к 100 или txkB/s упёрся в потолок канала - вот и причина тормозов. Дополнительно sar -n EDEV показывает ошибки и дропы на интерфейсе (rxerr/s, txdrop/s) - это уже про насыщение и сбои сети.

А теперь главный трюк sar в Linux - чтение вчерашнего файла для разбора ночного инцидента. Допустим, упало в районе трёх ночи 12-го числа (Debian-путь):

Код: Выделить всё

$ sar -u -f /var/log/sysstat/sa12 -s 03:00:00 -e 04:00:00
# на RHEL/RED OS файл лежит в /var/log/sa/sa12
Флаг -f указывает файл за нужный день, -s и -e задают окно времени. Ты буквально отматываешь назад и смотришь CPU, память и диск именно в момент аварии. Это бесценно, когда инцидент уже закончился, а понять причину надо. Можно собрать сразу всё за окно: sar -urd -f ... - CPU, память и диски в одном проходе.

Изображение

Современный стек: Prometheus, node_exporter и Grafana

sar хорош, но он живёт на одном хосте и показывает текст. Когда серверов больше одного и хочется видеть весь парк в одном месте с графиками и алертами - приходит связка Prometheus + node_exporter + Grafana. Это де-факто стандарт на 2026. Разделим роли, чтобы не путаться.
  • node_exporter - маленький агент от команды Prometheus (актуальная версия линейки 1.11.x на 2026). Ставишь на хост, он слушает порт 9100 и на /metrics отдаёт несколько сотен метрик про железо и ОС: CPU, память, диски, сеть, файловые системы. Сам ничего не хранит - только отдаёт срез здесь и сейчас.
  • Prometheus - сервер, который по расписанию опрашивает (scrape) эти /metrics со всех хостов и складывает в свою time-series базу (TSDB). Это хранилище истории.
  • Grafana - рисовалка. Берёт данные из Prometheus и строит дашборды. Готовый дашборд Node Exporter Full (id 1860) импортируется за минуту и закрывает 90% потребностей.
Актуальная альтернатива агенту на 2026: Grafana Alloy - это дистрибутив OpenTelemetry Collector от Grafana, который пришёл на смену Grafana Agent (тот достиг End-of-Life в ноябре 2025). Внутри Alloy есть компонент prometheus.exporter.unix - это тот же node_exporter, встроенный в коллектор. Если ты строишь систему с нуля и хочешь одним агентом собирать и метрики, и логи (Promtail тоже EOL с марта 2026) - смотри в сторону Alloy. Если нужен только сбор хостовых метрик - классический node_exporter остаётся простым и рабочим выбором.

Проверить агента после установки можно просто curl-ом:

Код: Выделить всё

$ curl -s localhost:9100/metrics | grep node_cpu_seconds_total
node_cpu_seconds_total{cpu="0",mode="idle"} 184320.5
node_cpu_seconds_total{cpu="0",mode="user"} 4210.8
node_cpu_seconds_total{cpu="0",mode="iowait"} 980.3
Важный момент, который ломает мозг новичкам: суффикс _total (а также _seconds_total) означает, что это счётчик (counter) - число всё время только растёт с момента загрузки. Само по себе значение 184320 бесполезно. Смысл появляется, когда берёшь СКОРОСТЬ роста через функцию rate() в языке запросов PromQL. Грубо: загрузка CPU в процентах - это насколько быстро растёт счётчик не-idle режимов. В Grafana ты пишешь выражение, а не смотришь на голую цифру. Классический пример загрузки CPU в процентах:

Код: Выделить всё

100 * (1 - avg by(instance)(rate(node_cpu_seconds_total{mode="idle"}[5m])))
Метрики без _total - это gauge (мгновенное значение, может расти и падать): node_memory_MemAvailable_bytes (сколько памяти реально доступно приложениям - смотри именно его, а не MemFree), node_filesystem_avail_bytes (свободно на ФС). Отдельно отмечу node_filesystem_readonly - если он равен 1, файловая система перешла в read-only, это почти всегда симптом сбоя диска, и хорошие алерт-правила его проверяют.

Что вообще собирать, чтобы не утонуть? Держись методики USE для каждого ресурса (CPU, память, диск, сеть):
  • Utilization - насколько ресурс занят (загрузка CPU, заполненность диска, использование полосы сети).
  • Saturation - есть ли очередь, насыщение (load average, длина очереди к диску, использование свопа, PSI - pressure stall information из /proc/pressure, которую node_exporter тоже отдаёт).
  • Errors - счётчики ошибок (дропы пакетов, ошибки диска, OOM-килы).
Четыре-пять панелей на хост по USE дают больше, чем сто разноцветных графиков, в которых не разберёшься.

Zabbix, netdata и алерты: что выбрать для мониторинга

Prometheus - не единственный путь. Zabbix - классика мониторинга серверов в наших краях, особенно в энтерпрайзе и госсекторе (и на Astra Linux он ставится штатно из репозиториев; на 2026 актуальны LTS-ветки 7.0 и выше). Архитектура другая: на хост ставится zabbix-agent2 (порт 10050), а центральный zabbix-server сам ходит к агентам и кладёт всё в SQL-базу. Из коробки идёт веб-интерфейс, готовые шаблоны Linux by Zabbix agent, встроенные триггеры и оповещения. Если нужен мониторинг Linux вместе с сетевым оборудованием по SNMP, инвентаризацией, low-level discovery и правами доступа в одной коробке - Zabbix силён. Prometheus же берёт гибкостью PromQL и pull-моделью под динамические среды (Kubernetes, автоскейлинг).

Когда нужен дашборд прямо сейчас и без возни - бери netdata. Одна команда, и через минуту на порту 19999 крутится живой дашборд с секундным разрешением, причём netdata уже умеет eBPF-плагин и сам подсвечивает аномалии:

Код: Выделить всё

$ sudo apt install netdata   # или официальный установщик kickstart.sh
# открой http://IP-сервера:19999
Это идеально для быстрой диагностики одного сервера. Для долгой истории и парка машин это уже Prometheus или Zabbix. netdata тоже умеет экспортировать метрики в Prometheus, так что одно другому не мешает.

И самое важное - алерты. Графики, на которые никто не смотрит, бесполезны. Настрой оповещения именно на насыщение и ошибки, а не на каждый чих. Базовый набор, который реально будит по делу: диск заполнен больше 90% (а лучше алертить по прогнозу - predict_linear в PromQL предскажет, что место кончится через 4 часа), node_filesystem_readonly стал 1, %iowait стабильно высокий, load average выше числа ядер, своп активно используется, растут дропы и ошибки на сетевом интерфейсе, был OOM-кил. В Prometheus за маршрутизацию, группировку и подавление дублей отвечает Alertmanager (он шлёт в Telegram, почту, PagerDuty), сами правила пишутся как PromQL-выражения с порогом. В Zabbix это триггеры и actions. Правило простое: алерт должен означать иди чини, иначе на него перестанут реагировать - это называется alert fatigue.

Типичные грабли
  • Смотреть на counter как на готовое значение. node_cpu_seconds_total надо оборачивать в rate() (или irate для коротких всплесков), иначе видишь бессмысленные растущие числа.
  • Думать, что node_exporter что-то хранит. Нет - он только отдаёт срез здесь и сейчас. Историю держит Prometheus.
  • Путать MemFree и MemAvailable. MemFree почти всегда мал, потому что Linux занимает свободную память под кэш. Реальный показатель свободы - node_memory_MemAvailable_bytes.
  • Забыть включить сбор sysstat и обнаружить пустой /var/log/sysstat именно тогда, когда история нужнее всего. И искать sa-файлы не в том каталоге (Debian против RHEL).
  • Алертить на загрузку (utilization), а не на насыщение. 100% CPU при пустой очереди - это нормальная полезная работа, а вот растущая очередь (load average, PSI) - уже боль.
  • Открыть node_exporter и zabbix-agent наружу в интернет без файрвола. Порты 9100 и 10050 закрывай, отдавай только своему серверу мониторинга (bind на внутренний адрес или правило nftables/iptables).
Мини-лаба
  • Поставь sysstat, включи сбор, проверь systemctl list-timers | grep sysstat, подожди и выполни sar -u, sar -r, sar -n DEV. Найди в выводе %iowait и rxkB/s.
  • Прочитай файл за вчера: sar -u -f /var/log/sysstat/sa$(date -d yesterday +%d) -s 03:00:00 -e 04:00:00 (на RHEL/RED OS путь /var/log/sa). Поймёшь, как разбирать прошлый инцидент.
  • Установи netdata, открой :19999 и понаблюдай метрики в реальном времени, пока в другом терминале гонишь нагрузку: dd if=/dev/zero of=/tmp/big bs=1M count=4096 oflag=direct - смотри, как взлетает iowait.
  • Поставь node_exporter, проверь curl -s localhost:9100/metrics, найди node_memory_MemAvailable_bytes, node_filesystem_avail_bytes и node_filesystem_readonly. Сравни MemFree и MemAvailable - почувствуй разницу.
Контрольные вопросы
  • Где sar хранит исторические данные (с поправкой на семейство дистрибутива) и как прочитать загрузку CPU за конкретный прошлый день и час?
  • Что означает суффикс _total в имени метрики node_exporter, чем counter отличается от gauge и почему counter оборачивают в rate()?
  • Чем роли node_exporter, Prometheus и Grafana отличаются друг от друга, и что такое Grafana Alloy на 2026?
  • Что по методике USE важнее ставить в алерты - utilization или saturation, и почему?
Что запомнить

Непрерывный мониторинг - это про то, чтобы знать о проблеме раньше пользователя и иметь историю для разбора. sar даёт историю из коробки на одном хосте (помни про разные пути: /var/log/sysstat в Debian/Astra и /var/log/sa в RHEL/RED OS). Prometheus + node_exporter + Grafana - стандарт для парка серверов на 2026: агент отдаёт срез, сервер хранит в TSDB, Grafana рисует; современная альтернатива агенту - Grafana Alloy на базе OpenTelemetry. Zabbix - крепкая классика с агентом и сервером, netdata - живой дашборд одной командой. Различай counter и gauge, оборачивай счётчики в rate(), смотри MemAvailable вместо MemFree. Меряй по USE, алерти на насыщение и ошибки (а не на каждую цифру) - и не утонешь в графиках.
👍1 ❤️1 🔥 😄 🤔2
✔ Лучший ответ сформирован автоматически — weyland
А подскажите, sar и node_exporter вместе на одной машине не подерутся? Хочу историю из коробки оставить, но и в Grafana всё видеть. И порт 9100 закрывать в файрволе обязательно, или хватит того что он на localhost висит? Ещё вопрос - на новых проектах сразу ставить Alloy или старый добрый node_exporter не зазорно?
Перейти к ответу →
Аватара пользователя
andy_semyon
Сообщения: 1
Зарегистрирован: 22 май 2026, 20:22

Re: Непрерывный мониторинг: sar, node_exporter, Grafana, Zabbix

Сообщение andy_semyon »

Спасибо, наконец дошло зачем rate() нужен. Я реально смотрел на node_cpu_seconds_total и не понимал почему там такие космические числа, думал сломалось что-то. А оно просто счётчик с загрузки растёт. И про MemFree vs MemAvailable отдельный плюс, у меня по этому поводу пол-команды спорило.
👍1 ❤️ 🔥1 😄 🤔
Аватара пользователя
weyland
Сообщения: 1
Зарегистрирован: 30 май 2026, 19:59

Re: Непрерывный мониторинг: sar, node_exporter, Grafana, Zabbix

Сообщение weyland »

✔ Лучший ответ — сформирован автоматически
А подскажите, sar и node_exporter вместе на одной машине не подерутся? Хочу историю из коробки оставить, но и в Grafana всё видеть. И порт 9100 закрывать в файрволе обязательно, или хватит того что он на localhost висит? Ещё вопрос - на новых проектах сразу ставить Alloy или старый добрый node_exporter не зазорно?
👍 ❤️ 🔥 😄 🤔
Ответить
← Предыдущая глава
Разбор кейса: приложение тормозит - пошаговая диагностика
Следующая глава →
Диагностика в контейнерах: cgroups, лимиты, Docker и Kubernetes

Все главы курса «Диагностика и производительность Linux: логи, strace, perf и eBPF»

Поделиться темой: ✈ Telegram VK
Похожие запросы: ss как посмотреть открытые сокеты и соединенияhtop и top как читать и в чем разницапервые шаги мониторинга сервера linux для новичкаМониторинг и метрики nginxebpf и bpftrace с чего начать в linux

Вернуться в «Диагностика и производительность Linux: логи, strace, perf и eBPF»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость