Привет, Хабр! Меня зовут Алексей Маренин, и я представляю компанию «Синимекс». В 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 при написании экспортеров.
На этом у меня все. Надеюсь, статья оказалась для вас полезной. Не забывайте подписываться на хаб «Синимекса», чтобы не пропускать новые обзоры и кейсы от разработчиков.
 
           
 
hagen1778
Разница в сжатии с первым бенчмарком у вас потому, что чем данные больше случайны (больше энтропия), тем хуже они сжимаются. Это справедливо для любого алгоритма сжатия.
А в используемом вами экспортером данные как раз случайные - см. https://github.com/kobtea/dummy_exporter/blob/78633c5129b473d8fce899a7e44a3d968cff3ddd/dummy_exporter.go#L96-L97
Советую почитать https://victoriametrics.com/blog/benchmark-100m/#why-data-matters
Именно из-за этого во всех бенчмарках используется node-exporter, который хоть как-то похож на production-like данные, а не генераторы случайных чисел. А еще лучше будет, если в бенчмарке вы будете использовать метрики из своего продакшена - тогда и результат будет максимально релевантным.
Дополнительно, VM не соблюдает строго retention меньше 30д. Она будет пытаться, но может получится что будет хранить 6д при retentionPeriod=3d. Это архитектурное ограничение системы, поэтому лучше сравнивать на более длинных дистанциях пока retentionPeriod еще не наступил.
salvaxedor Автор
Спасибо за комментарий. В целом брал
dummy-exporterпотому что хотел именно случайных данных, чтобы усложнить задачу. Это решение в тот момент казалось проще и интереснее. Согласен что логичнее использовать продовые данные, в целом пришёл к этому, возможно реализую однажды для себя. Этот бенч получается эдакий краевой случай, которым закрыл для себя ряд вопросов.Выбрал 7 дней специально, как период, который относительно часто встречается (в небольших инсталляциях или даже в ПРОД, когда места мало). Ну и не хотелось ждать дольше 2х недель для получения результата. Было еще одно ограничение конечно, это ресурсы.