2

Установка и насторйка плагина boost для cacti

В этой заметке расскажу как я ставил boost плагин для cacti.
Плагин позволяет уменьшить нагрузку на cacti, обрабатывающий большое количечтво графиков.

Подготовка

Before enabling boost, please consider very carefully how you plan to use it long term.
Carefull thought should be given to how often you update RRD’s at what point you need to either increase your MySQL max heap table size,
or increase your update frequency. You should also consider carefully how much memory to allocate to PHP when retrieving records during major updates.

Что примерно означает следующее:
Прежде чем включать этот плагин, пожалуйста очень внимательно подумайте над тем, как вы будете использовать его в долгосрочной перспективе.
Особое внимание обратите на то, как часто вы обновляете RRD файлы, чтобы в какой-то момент увеличить max heap table size в MySQL или увеличить интервал обновления RRD файлов.
Вам нужно внимательно следить за тем, сколько памяти используется PHP при получении записей во время больших обновлений.

Предупредили, ок.

Для начала надо определить как много памяти нужно для таблицы типа MEMORY, которая будет создана при установке плагина boost.
Для этого понадобится знать:
— количество строк Data Source в poller cache и их планируемое количество в будущем
— максимальный размер таблицы poller_output, которое может быть использовано при обновлении
— текущее значение параметра max_heap_table_size в MySQL

Это поможет рассчитать количество записей, которое будет в таблице poller_output_boost.

Посмотреть количество строк в poller cache можно так:
— http://cacti.examle.com/utilities.php?action=view_poller_cache
— в БД cacti выполнить «select count(*) from poller_item;»
— посмотреть в логах — tail -n 1000 /var/log/cacti/cacti.log | grep DataSources

mysql> select count(\*) from poller_item;
+----------+
| count(\*) |
+----------+
|   134756 |
+----------+
1 row in set (0.00 sec)

Принимаю количество строк равным 200k.

В официальном описании плагина написано:

Let’s say, for example, that your poller cache contains 200k rows, and the maximum length of any row is 20 bytes, about the size of a 64bit counter. If you are running scripts, ones that return very long results, like the MySQL statistics plugin, you should consider carefully the next step.
In this case, we will assume that even though the largest value returned is 20 bytes, we will elect to maintain a maximum output column width of 50 bytes.

Здесь предполагается, что максимальный размер строки poller_output составляет 20 байт, если говорить про 64битные счетчики. Я не поленился проверить.
Написал следующий запрос в файл query.sql:

select sum(
  ifnull(char_length(local_data_id), 0) +
  ifnull(char_length(rrd_name), 0) +
  ifnull(char_length(time), 0) +
  ifnull(char_length(output), 0)
)
from poller_output;

select count(\*) from poller_output;

и в момент работы poller несколько раз его выполнил (# echo query.sql | mysql --user=cacti --password='cactipwd' cacti) и полученное значение в байтах первой части запроса делил на результат второй части запроса. В итоге у меня получилось, что в среднем одна строка «весит» около 40 байт. Однако, если речь идет лишь о поле output, а не о все строке, то у меня получается около 15 байт. Не совсем понятно, что тут имеется ввиду. Если судить по тому, что надо сделать далее, то речь именно про поле output таблицы poller_output.

Установка и настройка

Устанавливаю сам плагин через «Plugin Manager» в web интерфейса cacti.

Далее выполняю в консоли mysql:
mysql> alter table poller_output modify column output varchar(50) not null default ”” engine=memory;
mysql> alter table poller_output_boost modify column output varchar(50) not null default ””;

Смысл в том, чтобы оптимизировать потребление памяти, т.к. по умолчанию тип поля varchar содержит 255 символов, а я устанавливаю ограничение в 50, исходя из того, что максимальное значение поля output таблицы poller_output составляет в моем случае 15 знаков(байт). При таком раскладе имеется трехкратный запас.

Далее по документации:

Now, you need to determine how many polling cycles will fit into your poller_output_boost table. In this case, when sizing the poller_output_boost table, you take the output column width and add 34 bytes per record. So, in this case, each data source result to be stored in the poller_output_boost table would take 84bytes.
Then, with the Maximum Heap Table size in hand, and let’s say the default is 16MBytes for the largest table (the MySQL default), you can calculate the number of poller intervals that you can store without running out of MySQL memory. So, let’s take our example:
200k Cache Entries x 84 Bytes Per Poller Cache Row = 1,680,000 Bytes per Poll

Тут говорится о том, что для определения количества байт одной строки таблицы poller_output_boost нужно сложить 50 и 34 байт, где 50 — это заданный ранее размер поля output, а 34 — остальные фиксированные поля. В сумме 84байта. Таким образом 200k строк будут «весить» 16Mb. (Обратите внимание, что в документации ошиблись на разряд)

This means that your poller_output_boost can handle 10 Cacti polls, or roughly 4/5 of an hour of poller data before it must be cleared by the system.

Я так и не понял откуда взялось, что на один poll требуется 1,68Mb, а на 10 циклов поллинга соответственно 16Mb, о чем указано выше.
Речь о том, что при параметре по умолчанию в MySQL max_heap_table_size=16Mb в таблице poller_output_boost будет содержаться информации примерно 4/5 от часа.

Для того, что бы хранить там 4 часа + 2 часа запаса нужно установить max_heap_table_size=132Mb, после чего перезапусить mysql.

Включение

В локументации пишут, что перед включением надо убедится, что у пользователя, из под которого работает apache есть доступ на запись RRD. У меня это директория /usr/share/cacti/rra/.
Как вариант, можно запустить Boost Server. Как это сделать хорошо описано в README файле плагина.

Затем перехожу в настройки boost:
http://cacti.example.com/settings.php?tab=boost

Enable On Demand RRD Updating — включаю boost плагин.
How Often Should Boost Update All RRD’s — как часто обновлять RRD файлы, если они не запрашиваются пользователем — я поставил 30 мин.
Maximum Data Source Items Per Pass — максимальное количество Data Sources, которые должны быть обработаны за один проход — у меня 200k
Memory Limit for Boost and Poller — сколько максимум оперативной памяти будет использовать poller и boost — 1Gbytes

Остальные настройки оставил без изменения.

После проверяю, что все графики рисуются. Статичтику ииспользования плагина можно посмотреть:
http://cacti.example.com/utilities.php?action=view_boost_status

В результате нагрузка на дисковую подсистему заметно снизилась:
cacti-boost

Заключение

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

Ссылки

Документация по плагину

Alexey Egorychev

Alexey Egorychev

FreeBSD and Linux sysadmin. Know many systems like mailsystems, DB, WWW stack. Automation with salt, ansible. Monitoring with nagios, zabbix.

  • THUND3R

    Огромное спасибо, за подробные объяснения!
    Можно еще немножко уточнить, как Вы настраивали Cacti и MySQL для нагрузки
    в 200k. Kакие значения у Вас стоят в:
    max_connections в my.cnf (если можно и другие параметры)
    max_heap_table_size

    Poller Interval
    Maximum Concurrent Poller Processes
    Maximum Threads per Process
    и как Вы их считали…

    • Добрый день!

      mysql настраивалась исходя из доступной памяти никаких специфичных для cacti настроек нет.

      Статья довольно старая значения могли измениться (и скорее всего изменились). Поэтому трудно сказать сколько было на тот момент datasources.

      Poller Interval
      Maximum Concurrent Poller Processes
      Maximum Threads per Process

      Эти параметры подбирал эмпирическим путем. =)
      Кроме PollerInterval. Он установлен в 5 мин. Главное, что бы между интервалами успевали опрашиваться все устройства.