Привет, Хабр! Меня зовут Алексей Маренин, и я представляю компанию «Синимекс». В 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 дней

golang-github-prometheus.x86_64 2.49.1-1.red80

monitoring-2

Прометеус + агенты

580,724

4 cpu,8Gb RAM

7 дней

golang-github-prometheus.x86_64 2.49.1-1.red80

monitoring-3

Сингл Виктория + агенты

583,212

4 cpu,8Gb RAM

7 дней

victoria-metrics-singlenode.x86_64 1.111.0-2.red80

monitoring-4

Кластерная Виктория + агенты

581,895

4 cpu,8Gb RAM

7 дней

victoria-metrics-cluster.x86_64 1.111.0-1.red80

Таблица 1. Конфигурации систем мониторинга (первая итерация)

Кроме того, на каждом сервере был установлен vmagent из пакета victoria-metrics-cluster-utils.x86_64 1.111.0-1.red80. Естественно, отдельно я поднял еще один Прометеус, чтобы снимать метрики с тестовых серверов, но его судьба не так интересна.

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

Первая итерация

На стадии роста Прометеус проигрывал Виктории, не в 7 раз, но заметно. Однако на второй неделе я заметил странности (см. Рисунок 1).

Рисунок 1. Объем дискового пространства, занимаемый разными системами мониторинга (первая итерация)
Рисунок 1. Объем дискового пространства, занимаемый разными системами мониторинга (первая итерация)

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

Далее я решил посмотреть, сколько места системы занимают в среднем и максимально за неделю (см. Рисунок 2).

Рисунок 2. Динамика потребления пространства (среднее и максимальное значения)
Рисунок 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 дней

golang-github-prometheus.x86_64 2.49.1-1.red80

monitoring-2

Прометеус + агенты

580,724

4 cpu,8Gb RAM

7 дней

golang-github-prometheus.x86_64 2.49.1-1.red80

monitoring-3

Сингл Виктория + агенты

583,212

4 cpu,8Gb RAM

7 дней

victoria-metrics-singlenode.x86_64 1.111.0-2

monitoring-4

Один Прометеус

560,110

4 cpu,8Gb RAM

7 дней

2.22.0 / 2020-10-15

Таблица 3. Конфигурации систем мониторинга (вторая итерация)

Результаты не заставили себя ждать (см. Рисунок 3).

Рисунок 3. Потребление места на диске разными версиями Prometheus
Рисунок 3. Потребление места на диске разными версиями Prometheus

Прометеус версии 2.22 ведет себя так же, как новая версия. Забавно, что Прометеус 1 почему‑то стал потреблять больше места. Пусть это останется загадкой (по крайней мере, в рамках этой статьи).

Что ж, ответа на вопрос «Почему я не вижу разницы в 7 раз?» я так и не получил и стал думать дальше. В голову пришли следующие гипотезы:

  1. сборки из репозитория RedOS работают некорректно; 

  2. метрики типа counter и gauge хранятся и сжимаются по разному, в результате аффектит различие в соотношении этих метрик (примерное соотношение g/c у node_exporter равно 1.5, в моем же эксперименте - 0,6);

  3. всемирный заговор.

Для начала я решил посмотреть, какой инструмент использовался в подобных бенчмарках. Оказалось, что есть специальный бенчмарк от разработчика VictoriaMetrics. Я для себя поставил галочку рядом с третьим пунктом, но отложил до одной из следующих итераций. Сначала решил проверить работоспособность самых новых релизов Прометеуса и Виктории.

Третья итерация

Лабораторный сетап третьей итерации выглядел так:

Сервер

Конфигурация

Временных рядов

Конфигурация

Период

Версия Пакетов

monitoring-1

-

-

4 cpu,8Gb RAM

-

-

monitoring-2

Прометеус + агенты

573,660

4 cpu,8Gb RAM

7 дней

3.4.1 / 2025-05-31

monitoring-3

Сингл Виктория + агенты

574,799

4 cpu,8Gb RAM

7 дней

v1.120.0

monitoring-4

-

-

4 cpu,8Gb RAM

-

-

Таблица 4. Конфигурации систем мониторинга (третья итерация)

Как ни странно, результат почти полностью совпадал с предыдущими (см. Рисунок 4-5):

Рисунок 4. Объем дискового пространства, занимаемый системами мониторинга (третья итерация)
Рисунок 4. Объем дискового пространства, занимаемый системами мониторинга (третья итерация)
Рисунок 5. Динамика потребления пространства (третья итерация)
Рисунок 5. Динамика потребления пространства (третья итерация)

Из этого я сделал вывод, что версия приложения абсолютно не влияет на результаты. 

Напоследок решил-таки проверить теорию с разными типами метрик, возведя это дело в абсолют.

Четвертая итерация

В таблице 5 представлен лабораторный сетап четвертой итерации:

Сервер

Конфигурация

Временных рядов

Конфигурация

Период

Версия Пакетов

Комментарий

monitoring-1

Прометеус + агенты

141,540

4 cpu,8Gb RAM

3 дня

3.4.1 / 2025-05-31

gauge

monitoring-2

Прометеус + агенты

141,604

4 cpu,8Gb RAM

3 дня

3.4.1 / 2025-05-31

counter

monitoring-3

Сингл Виктория + агенты

141,710

4 cpu,8Gb RAM

3 дня

v1.120.0

gauge

monitoring-4

Сингл виктория + агенты

141,732

4 cpu,8Gb RAM

3 дня

v1.120.0

counter

Таблица 5. Конфигурации систем мониторинга (четвертая итерация)

Получились следующие результаты (см. Рисунок 6):

Рисунок 6. Объем занимаемого дискового пространства и динамика его потребления (четвертая итерация)
Рисунок 6. Объем занимаемого дискового пространства и динамика его потребления (четвертая итерация)

В этой же итерации я решил получить еще и объем директории через du:

Сервер

Конфигурация

Занимаемое место

monitoring-1

Прометеус + агенты

20G

monitoring-2

Прометеус + агенты

4.2G

monitoring-3

Сингл Виктория + агенты

33G

monitoring-4

Сингл Виктория + агенты

152M

Таблица 6. Объемы директорий в системах мониторинга

Учитывая, что в предыдущих исследованиях использовался node-exporter, в котором больше именно метрик counter, становится понятно, откуда появилась разница в 7 раз.

Некие выводы

  1. Как Викторию, так и Прометеуса можно комфортно использовать с агентами. Однако отмечу, что в Прометеусе возрастает утилизация CPU. Кроме того, я не проверял нагрузку на сеть.

  2. При большом количестве метрик gauge Виктория справляется хуже, чем Прометеус. 

  3. При большом количестве метрик counter Виктория справляется в разы лучше Прометеуса.

Из этого следует, что на этапе планирования вы можете выбрать более подходящий инструмент, если знаете, какие у вас будут типы метрик. Если же вы разработчик, то, на мой взгляд, лучше обратить внимание на метрики типа counter при написании экспортеров.

На этом у меня все. Надеюсь, статья оказалась для вас полезной. Не забывайте подписываться на хаб «Синимекса», чтобы не пропускать новые обзоры и кейсы от разработчиков.

Комментарии (0)