Привет, Хабр! Меня зовут Алексей Маренин, и я представляю компанию «Синимекс». В IT я почти 6 лет, сейчас — ведущий инженер, занимаюсь системной интеграцией. В этой статье мы сравним бенчмарки VictoriaMetrics и Prometheus (спойлер: все не так очевидно).
Дело в том, что в какой-то момент, выбирая между Викторией и Прометеусом, я прочитал несколько статей на Хабре. В них речь шла о плюсах Виктории — о том, что она лучше сжимает и хранит данные. Тогда я поверил, однако во время эксплуатации у меня возник ряд вопросов, и я решил провести собственное исследование.
Предыдущие бенчмарки
Заоснову я брал вот эту статью (далее я буду ссылаться только на нее, назовём ее «первая статья») и вот этот перевод. Именно результаты этих исследований в своё время сподвигли меня использовать и продвигать Викторию в массы.
Методика
Сначала я определил методику. Нужно было выделить 4 одинаковых ВМ, установить на них разные конфигурации систем мониторинга и как‑то сгенерировать метрики. Я решил не использовать node‑exporter — вместо него нашёл специальный экспортер, способный генерировать любые метрики в любых количествах.
Я быстро поднял несколько экземпляров в докере, и результат меня вполне устроил. Конфигурации приведены ниже (см. Листинг 1).
# docker-compose.yml
version: '3.8'
services:
dummy_exporter0:
image: kobtea/dummy_exporter
container_name: dummy_exporter0
ports:
- "9510:9510"
volumes:
- /opt/dummy/config.yml:/etc/dummy_exporter.yml
dummy_exporter1:
image: kobtea/dummy_exporter
container_name: dummy_exporter1
ports:
- "9511:9510"
volumes:
- /opt/dummy/config.yml:/etc/dummy_exporter.yml
# И так далее
```
```yaml
config.yml
metrics:
- name: foo
type: counter
size: 1000
- name: bar
type: gauge
size: 4000
- name: baz
type: counter
size: 5000
Листинг 1. Конфигурации для сравнения VictoriaMetriсs и Prometheus с использованием Docker
Далее я настроил 4 разных системы мониторинга, их конфигурации приведены в таблице 1. (Да, использовать кластерную Викторию на одном хосте — не лучшая идея, но мне было интересно.)
Сервер |
Конфигурация |
Временных рядов |
Конфигурация |
Период |
Версия Пакетов |
monitoring-1 |
Один Прометеус |
562,837 |
4 cpu,8Gb RAM |
7 дней |
|
monitoring-2 |
Прометеус + агенты |
580,724 |
4 cpu,8Gb RAM |
7 дней |
|
monitoring-3 |
Сингл Виктория + агенты |
583,212 |
4 cpu,8Gb RAM |
7 дней |
|
monitoring-4 |
Кластерная Виктория + агенты |
581,895 |
4 cpu,8Gb RAM |
7 дней |
|
Таблица 1. Конфигурации систем мониторинга (первая итерация)
Кроме того, на каждом сервере был установлен vmagent
из пакета victoria-metrics-cluster-utils.x86_64 1.111.0-1.red80
. Естественно, отдельно я поднял еще один Прометеус, чтобы снимать метрики с тестовых серверов, но его судьба не так интересна.
План был такой: неделю данные набираются в базу, затем неделю я наблюдаю, анализирую и радостно пишу эту статью. Однако результаты меня удивили.
Первая итерация
На стадии роста Прометеус проигрывал Виктории, не в 7 раз, но заметно. Однако на второй неделе я заметил странности (см. Рисунок 1).

На графике видно, что обычно Прометеус занимает больше места, чем Виктория, однако у Виктории наблюдаются пики потребления места. Они обусловлены внутренними принципами работы с данными, подробнее об этом можно почитать тут.
Далее я решил посмотреть, сколько места системы занимают в среднем и максимально за неделю (см. Рисунок 2).

После первой итерации у меня возник вопрос: «Как так? Почему у меня не получилась эта самая разница в 7 раз?» Изучение release notes Прометеуса подсказало, что ребята просто оптимизировали хранение (см. Таблицу 2).
Версия |
Изменение |
2.30 |
Введение нативных гистограмм и улучшения TSDB |
2.35–2.40 |
Оптимизация compaction и retention |
2.46+ |
Дополнительные улучшения сжатия и хранения |
Таблица 2. Оптимизация хранения метрик в Prometheus
Поэтому я решил посмотреть, как будет работать версия Прометеуса, использованная в первой статье.
Вторая итерация
Во второй итерации я заменил кластерную Викторию на Прометеус версии 2.22, взятый с Github Prometheus. В итоге мой лабораторный сетап выглядел так:
Сервер |
Конфигурация |
Временных рядов |
Конфигурация |
Период |
Версия Пакетов |
monitoring-1 |
Один Прометеус |
562,837 |
4 cpu,8Gb RAM |
7 дней |
|
monitoring-2 |
Прометеус + агенты |
580,724 |
4 cpu,8Gb RAM |
7 дней |
|
monitoring-3 |
Сингл Виктория + агенты |
583,212 |
4 cpu,8Gb RAM |
7 дней |
|
monitoring-4 |
Один Прометеус |
560,110 |
4 cpu,8Gb RAM |
7 дней |
Таблица 3. Конфигурации систем мониторинга (вторая итерация)
Результаты не заставили себя ждать (см. Рисунок 3).

Прометеус версии 2.22 ведет себя так же, как новая версия. Забавно, что Прометеус 1 почему‑то стал потреблять больше места. Пусть это останется загадкой (по крайней мере, в рамках этой статьи).
Что ж, ответа на вопрос «Почему я не вижу разницы в 7 раз?» я так и не получил и стал думать дальше. В голову пришли следующие гипотезы:
сборки из репозитория RedOS работают некорректно;
метрики типа
counter
иgauge
хранятся и сжимаются по разному, в результате аффектит различие в соотношении этих метрик (примерное соотношениеg/c
уnode_exporter
равно 1.5, в моем же эксперименте - 0,6);всемирный заговор.
Для начала я решил посмотреть, какой инструмент использовался в подобных бенчмарках. Оказалось, что есть специальный бенчмарк от разработчика VictoriaMetrics. Я для себя поставил галочку рядом с третьим пунктом, но отложил до одной из следующих итераций. Сначала решил проверить работоспособность самых новых релизов Прометеуса и Виктории.
Третья итерация
Лабораторный сетап третьей итерации выглядел так:
Сервер |
Конфигурация |
Временных рядов |
Конфигурация |
Период |
Версия Пакетов |
monitoring-1 |
- |
- |
4 cpu,8Gb RAM |
- |
|
monitoring-2 |
Прометеус + агенты |
573,660 |
4 cpu,8Gb RAM |
7 дней |
|
monitoring-3 |
Сингл Виктория + агенты |
574,799 |
4 cpu,8Gb RAM |
7 дней |
|
monitoring-4 |
- |
- |
4 cpu,8Gb RAM |
- |
|
Таблица 4. Конфигурации систем мониторинга (третья итерация)
Как ни странно, результат почти полностью совпадал с предыдущими (см. Рисунок 4-5):


Из этого я сделал вывод, что версия приложения абсолютно не влияет на результаты.
Напоследок решил-таки проверить теорию с разными типами метрик, возведя это дело в абсолют.
Четвертая итерация
В таблице 5 представлен лабораторный сетап четвертой итерации:
Сервер |
Конфигурация |
Временных рядов |
Конфигурация |
Период |
Версия Пакетов |
Комментарий |
monitoring-1 |
Прометеус + агенты |
141,540 |
4 cpu,8Gb RAM |
3 дня |
|
|
monitoring-2 |
Прометеус + агенты |
141,604 |
4 cpu,8Gb RAM |
3 дня |
|
|
monitoring-3 |
Сингл Виктория + агенты |
141,710 |
4 cpu,8Gb RAM |
3 дня |
|
|
monitoring-4 |
Сингл виктория + агенты |
141,732 |
4 cpu,8Gb RAM |
3 дня |
|
Таблица 5. Конфигурации систем мониторинга (четвертая итерация)
Получились следующие результаты (см. Рисунок 6):

В этой же итерации я решил получить еще и объем директории через du
:
Сервер |
Конфигурация |
Занимаемое место |
monitoring-1 |
Прометеус + агенты |
20G |
monitoring-2 |
Прометеус + агенты |
4.2G |
monitoring-3 |
Сингл Виктория + агенты |
33G |
monitoring-4 |
Сингл Виктория + агенты |
152M |
Таблица 6. Объемы директорий в системах мониторинга
Учитывая, что в предыдущих исследованиях использовался node-exporter
, в котором больше именно метрик counter
, становится понятно, откуда появилась разница в 7 раз.
Некие выводы
Как Викторию, так и Прометеуса можно комфортно использовать с агентами. Однако отмечу, что в Прометеусе возрастает утилизация CPU. Кроме того, я не проверял нагрузку на сеть.
При большом количестве метрик
gauge
Виктория справляется хуже, чем Прометеус.При большом количестве метрик
counter
Виктория справляется в разы лучше Прометеуса.
Из этого следует, что на этапе планирования вы можете выбрать более подходящий инструмент, если знаете, какие у вас будут типы метрик. Если же вы разработчик, то, на мой взгляд, лучше обратить внимание на метрики типа counter при написании экспортеров.
На этом у меня все. Надеюсь, статья оказалась для вас полезной. Не забывайте подписываться на хаб «Синимекса», чтобы не пропускать новые обзоры и кейсы от разработчиков.