Авторские статьи

Мои заметки об пропуске одинаковых значений (throttling) в Zabbix


Данные, которые поступают в базу Zabbix, изменяются с течением времени по-разному. Какие-то значения динамичны по природе своей, какие-то тяготеют к постоянству и только периодически меняют значения. С версии Zabbix 4.2 доступна для каждого элемента данных (item) во вкладке Предобработка (Preprocessing) возможность выставить Троттлинг (пропуск одинаковых значений). Данный функционал по логике своей старается не заполнять базу данных чередой одинаковых значений и экономит дисковое пространство. Круто? Круто! Но у всего есть цена.

Общая информация о троттлинге

Пропускать одинаковое можно двумя альтернативными на выбор вариантами:

  • Отбрасывать не изменившееся (Discard unchanged) - Отбросить значение, если оно не изменилось.
  • Отбрасывать не изменившееся с периодическим контролем (Discard unchanged with heartbeat) - Отбросить значение, если оно не изменилось в течение заданного периода (в секундах). Поддерживаются положительные целые значения для секунд (минимально - 1 секунда). В этом поле можно использовать суффиксы времени (такие как 30s, 1m, 2h, 1d).

Этапы, которые проходит конкретное значение, от сбора до попадания в базу данных.

Поступление, предобработка, обработка и сохранение данных в Zabbix

Триггера

В документации проекта есть главные слова о первом минусе троттлинга, несказанные явно.

Если значение отбрасывается, оно не сохраняется в базе данных и Zabbix сервер не будет знать, что это значение было получено. Выражения триггеров не будут пересчитываться, в результате не будут созданы/закрыты проблемы по связанным триггерам. Функции триггеров будут работать только на основе данных, которые фактически сохраняются в базе данных.

Для примера, возьмём шаблон Network Generic Device SNMP и в нём конкретный элемент ICMP ping (icmpping). Интервал обновления (опроса) по умолчанию 1 минута.

Если у вас оборудование не выключается по окончании рабочего дня и работает 24/7, то бо́льшую часть времени в базу данных по данному элементу данного конкретного работоспособного устройства постоянно будут идти в базу данных одни единички (1 - успешный пинг по ICMP). Если оборудование работает условные 8 часов, сути дела не меняет - 8 часов единички, оставшиеся в сутках 16 часов - в базу идут нолики когда устройство штатно выключено.

За сутки будет 1440 значений с каждого устройства. Если сетевых устройств много, то умножаем их количество на 1440 и получаем количество записей в базе данных только за 1 сутки, а потом недели превратятся в месяцы, а те в годы. Схожих с icmpping элементов обычно много. Может прийти в голову гениальная идея применить к ним троттлинг, чтобы сократить нагрузку на базу данных и занятое ею место.

Как неправильное и бездумное использование троттлинга может привести к отрицательному результату?

Продолжаем пример. Для элемента данных icmpping есть триггер, который после трёх неудачных попыток пропинговать устройство, сообщает об недоступности устройства (Unavailable by ICMP ping). Код триггера - max(/Network Generic Device SNMP/icmpping,#3)=0

По логике автора шаблона Network Generic Device SNMP три попытки (#3) через каждую минуту и вот не позднее трёх минут вы в курсе проблемы. Если применить троттлинг и выставить "Отбрасывать не изменившееся с периодическим контролем (Discard unchanged with heartbeat)" в 1h, то минутные значения не попадают в базу данных. Триггер получит второе значение только через 1 час, а три попытки приведут к информированию вас через 3 часа. Если устройство снова станет доступно в пределах трёх часов, то вместо ноликов снова пойдут единички и выражение триггера не приведёт вас к информированию, что была какая-то проблема с недоступностью устройства по ICMP.

А применение "Отбрасывать не изменившееся (Discard unchanged)" вообще делает триггер нефункциональным.

Графики

В терминах Zabbix есть различные виды графиков и первый из них - График классический (Graph classic) → Простой График (Simple graphs). Раз в базе по каждому элементу есть дата-время и значение, то Простой График строится средствами Zabbix, откладывая дата-время по оси X, а значение по оси Y. При троттлинге часть дата-время-значение отсутствует и это визуально портит Простые Графики, делая их рваными.

Рваные простые графики в Zabbix

Частично можно выкрутиться, отказавшись от Простых Графиков и используя Графики (Graph). В окне создания Графика будет доступен компенсирующий функционал Соединение (Connected) для Отсутствующих данных (Missing Data).

Создание графика в Zabbix

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

Гладкий график в Zabbix

Выводы

  • В шаблонах часто через механизм низкоуровневого обнаружения (Low-level discovery, LLD) через прототип элемента данных может порождаться большое количество элементов данных. Например, в сетевом оборудовании с 48 портами - на каждый порт может быть создан и не один элемент данных. С большим количеством оборудования растёт и количество всех собираемых данных. Троттлинг не серебряная пуля, решающая все вопросы. Отключайте те элементы, которые вам реально не нужны. Они не будут опрашиваться и нагружать базу значениями.
  • Старайтесь не использовать бездумно троттлинг и будьте предельно аккуратны с элементами данных, имеющие триггера. Тщательно анализируйте код триггера и не применяйте троттлинг, если вы не до конца понимаете что делаете.
  • Если вы хотите применить троттлинг к конкретному элементу данных, то, возможно, стоит задуматься - а не будет ли лучше увеличить интервал опроса? Возможно, вам не нужна такая скорость реагирования на инциденты. Вместо 1 минуты выставленные 5 минут и вот уже сотня другая элементов намного реже сохраняется в базу.
  • Вместо троттлинга для борьбы с ростом базы данных, можно и нужно использовать Пользовательские интервалы (Custom intervals) По расписанию (Scheduling). Указываете нужное вам с помощью документации проекта и данные опрашиваются только в нужный период времени. Магическое wd1-5h9-18 и вот у вас только рабочие дни и время.
  • Если база данных Zabbix у вас в MySQL, то запросом

    SELECT name, count(name) as cname
    FROM items
    GROUP BY name
    ORDER BY cname DESC

    узнайте ТОП повторяющихся элементов. Их анализ в приоритете - вдумчивое решение по интервалам опроса и/или применение троттлинга принесёт наибольший эффект. Будьте придельны аккуратны - стандартные шаблоны создают профессионалы. Для того чтобы менять дефолтные значения, требуется грамотная аргументация и понимание ситуации.

  • Разительно сократить дисковый I/O и размер базы поможет ZFS со сжатием. Готовим ZFS для MySQL под нагрузки типа Zabbix.

Zabbix Server | Установка и настройка

Дополнительные материалы:
Шаблон Operating System Identification для Zabbix.
Zabbix и Ubuntu Snappy Core.

Дата последней правки: 2024-01-31 13:54:43

RSS vasilisc.com   


Разделы

Главная
Новости
Ворох бумаг
Видео Linux
Игры в Linux
Безопасность
Статьи об Astra Linux
Статьи о FreeBSD
Статьи об Ubuntu
Статьи о Snappy
Статьи об Ubuntu Phone
Статьи о Kubuntu
Статьи о Xubuntu
Статьи о Lubuntu
Статьи об Open Source
Карта сайта