Оптимизация Graphite за счёт замены carbon-cache на go-carbon

High CPU load in Icinga and acceleration of Graphite by replacing carbon-cache with go-carbonВ ходе рассмотрения первого развёртывания системы мониторинга Icinga 2 мы затрагивали тему с базовой настройкой подсистемы сбора метрических данных и отображения графиков – Graphite. При этом в качестве составной компоненты Graphite для приёмки и первичной обработки метрических данных у нас использовался предлагаемый по умолчанию Carbon. Описанная конфигурация до определённого момента вполне успешно выполняла свои задачи, но по мере роста нагрузки на сервер мониторинга мы стали замечать тревожную тенденцию к существенному росту процессорной нагрузки.

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

High CPU load in Icinga with increasing number of perfdata metrics coming into Graphite

Было очевидно, что рост количества собираемых метрик и хостов прямо сопоставим с ростом процессорной нагрузки. При этом к мониторингу были подключены ещё далеко не все хосты и задействованы ещё не все интересующие нас метрики.

Increasing committed points in Graphite

При подключении всё больших объектов стало очевидно, что очень скоро мы придём к полной утилизации процессорного ресурса. Увеличение количества ядер на ситуацию каким-то кардинальным образом не повлияло и стало понятно, что нужно искать способы оптимизации. На глаза попались две старые, но от этого не потерявшие для нас актуальности, довольно интересные статьи от автора Alexander Bulimov: "Заметка о Graphite" и "Замена carbon-cache на go-carbon = Счастье". Решили попробовать рецепт с заменой carbon-cache на go-carbon и, практически, это действительно очень помогло и ощутимо поправило нашу ситуацию.

Далее кратко о том, что было сделано и какого результата удалось достичь. Обратите внимание на то, что в представленном далее примере используется не самая актуальная версия go-carbon, так как черновик этой записи делался давно. Поэтому применительно к более новым версиям go-carbon могут присутствовать свои нюансы, которые в нашим примере не учтены.

Так как carbon-cache и go-carbon - это два разных инструмента, которые выполняют одни и те же задачи с одними и теми же метриками, то вместе они работать не смогут. Нам потребуется в конфигурации Graphite деактивировать carbon-cache и запустить go-carbon.

Отключаем carbon-cache:

# systemctl stop carbon-cache
# systemctl disable carbon-cache

В файле /etc/default/graphite-carbon комментируем строку включения автозагрузки carbon-cache:

# Change to true, to enable carbon-cache on boot
#CARBON_CACHE_ENABLED=true

Скачиваем и устанавливаем go-carbon (заменить ссылку и имя пакета на актуальную версию):

# mkdir ~/packages
# cd ~/packages
# wget https://github.com/lomik/go-carbon/releases/download/v0.14.0/go-carbon_0.14.0_amd64.deb
# dpkg -i ~/packages/go-carbon_0.14.0_amd64.deb

Настраиваем конфигурацию go-carbon.conf:

# nano /etc/go-carbon/go-carbon.conf

На какие параметры конфигурации стоит обратить внимание:

[common]
# Run as user. Works only in daemon mode
#user = "carbon"
user = "_graphite"
...
# Increase for configuration with multi persister workers
max-cpu = 4

[whisper]
data-dir = "/var/lib/graphite/whisper"
...

[cache]
...
# Capacity of queue between receivers and cache
# Strategy to persist metrics. Values: "max","sorted","noop"
#   "max" - write metrics with most unwritten datapoints first
#   "sorted" - sort by timestamp of first unwritten datapoint.
#   "noop" - pick metrics to write in unspecified order,
#            requires least CPU and improves cache responsiveness
#write-strategy = "max"
write-strategy = "noop"
...

[udp]
listen = ":2003"
#enabled = true
enabled = false
...

[tcp]
#listen = ":2003"
listen = "127.0.0.1:2003"
enabled = true
...

Настраиваем storage-schemas.conf по аналогии с ранее настроенным /etc/carbon/storage-schemas.conf

# mv /etc/go-carbon/storage-schemas.conf /etc/go-carbon/storage-schemas_default.conf
# cp /etc/carbon/storage-schemas.conf /etc/go-carbon/

Настраиваем storage-aggregation.conf по аналогии с ранее настроенным /etc/carbon/storage-aggregation.conf

# mv /etc/go-carbon/storage-aggregation.conf /etc/go-carbon/storage-aggregation_default.conf
# cp /etc/carbon/storage-aggregation.conf /etc/go-carbon/

Добавляем в sysctl.conf модификации в соответствии с рекомендацией разработчиков:

# nano /etc/sysctl.conf
# Go-Carbon recommendations
#
# percentage of your RAM which can be left unwritten to disk. MUST be much more than
# your write rate, which is usually one FS block size (4KB) per metric.

vm.dirty_ratio=80

# percentage of yout RAM when background writer have to kick in and
# start writes to disk. Make it way above the value you see in `/proc/meminfo|grep Dirty`
# so that it doesn't interefere with dirty_expire_centisecs explained below

vm.dirty_background_ratio=50

# allow page to be left dirty no longer than 10 mins
# if unwritten page stays longer than time set here,
# kernel starts writing it out

vm.dirty_expire_centisecs=60000

Заставляем систему перечитать настройки sysctl.conf:

# sysctl -p

vm.dirty_ratio = 80
vm.dirty_background_ratio = 50
vm.dirty_expire_centisecs = 60000

Включаем автозагрузку службы go-carbon, запускаем службу и проверяем её статус:

# systemctl enable go-carbon
# systemctl start go-carbon
# systemctl status go-carbon

 go-carbon.service - Golang implementation of Graphite/Carbon server.
Loaded: loaded (/lib/systemd/system/go-carbon.service; enabled; vendor preset: enabled)
Active: active (running) since Thu 2019-11-28 17:00:46 MSK; 31s ago
Docs: https://github.com/lomik/go-carbon
Main PID: 50404 (go-carbon)
CGroup: /system.slice/go-carbon.service
└─50404 /usr/bin/go-carbon -config /etc/go-carbon/go-carbon.conf -pidfile /var/run/go-carbon.pid -daemon
Nov 28 17:00:46 KOM-MON20 systemd[1]: Starting Golang implementation of Graphite/Carbon server....
Nov 28 17:00:46 KOM-MON20 systemd[1]: Started Golang implementation of Graphite/Carbon server..

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

Optimizing Graphite by replacing carbon-cache with go-carbon - reducing processor load and increasing the number of committed points

Добавить комментарий