Comparativa de alto rendimiento de TSDB: VictoriaMetrics vs TimescaleDB vs InfluxDB

VictoriaMetrics, TimescaleDB e InfluxDB se compararon en artículo anterior un conjunto de datos con mil millones de puntos de datos pertenecientes a 40K series temporales únicas.

Hace unos años, existía la era de Zabbix. Cada servidor bare metal tenía no más de unos pocos indicadores: uso de CPU, uso de memoria, uso de disco y uso de red. Así, las métricas de miles de servidores podían caber en 40 mil series temporales únicas, y Zabbix podía usar MySQL como backend para esos datos 🙂

Actualmente, un node_exporter con configuraciones por defecto proporciona más de 500 métricas en un host promedio. Hay numerosos exportadores para diversas bases de datos, servidores web, sistemas de hardware, etc. Todos ellos proporcionan una gran cantidad de métricas útiles. Cada vez más aplicaciones comienzan a exponer diversas métricas sobre sí mismas. Está Kubernetes con clústeres y pods que revelan múltiples métricas. Esto lleva a que los servidores expongan miles de métricas únicas en el host. Por lo tanto, una serie temporal única de 40K ya no es un gran desafío. Se convierte en algo común que debe ser fácilmente manejado por cualquier TSDB moderna en un solo servidor.

¿Qué significa tener una gran cantidad de series temporales únicas en este momento? ¿Quizás 400K o 4M? ¿O 40M? Vamos a comparar las TSDB modernas con estas cifras.

Establecer un punto de referencia

TSBS es una excelente herramienta de benchmarking para las TSDB. Permite generar una cantidad arbitraria de métricas al pasar el número necesario de series temporales, dividido por 10 — el flag -scale (anteriormente -scale-var). 10 es el número de dimensiones (métricas) generadas en cada host, servidor. Los siguientes conjuntos de datos fueron creados con TSBS para el benchmarking:

  • 400K series temporales únicas, intervalo de 60 segundos entre puntos de datos, los datos abarcan un total de 3 días, ~1.7B total de puntos de datos.
  • 4M series temporales únicas, intervalo de 600 segundos, los datos abarcan un total de 3 días, ~1.7B total de puntos de datos.
  • 40M series temporales únicas, intervalo de 1 hora, los datos abarcan un total de 3 días, ~2.8B total de puntos de datos.

El cliente y el servidor se ejecutaron en instancias dedicadas n1-standard-16 en la nube de Google. Estas instancias tenían las siguientes configuraciones:

  • vCPUs: 16
  • RAM: 60 GB
  • Almacenamiento: disco duro estándar de 1 TB. Proporciona un ancho de banda de lectura/escritura de 120 Mbit/s, 750 lecturas por segundo y 1,5K escrituras por segundo.

Los TSDB fueron extraídos de imágenes oficiales de docker y ejecutados en docker con las siguientes configuraciones:

  • VictoriaMetrics:

    docker run -it --rm -v /mnt/disks/storage/vmetrics-data:/victoria-metrics-data -p 8080:8080 valyala/victoria-metrics

  • Los valores de InfluxDB (-e son necesarios para mantener un alto rendimiento. Para más detalles, consulte la documentación):

    docker run -it --rm -p 8086:8086 
    -e INFLUXDB_DATA_MAX_VALUES_PER_TAG=4000000 
    -e INFLUXDB_DATA_CACHE_MAX_MEMORY_SIZE=100g 
    -e INFLUXDB_DATA_MAX_SERIES_PER_DATABASE=0 
    -v /mnt/disks/storage/influx-data:/var/lib/influxdb influxdb

  • TimescaleDB (la configuración fue tomada de esto el archivo):

MEM=`free -m | grep "Mem" | awk ‘{print $7}’`
let "SHARED=$MEM/4"
let "CACHE=2*$MEM/3"
let "WORK=($MEM-$SHARED)/30"
let "MAINT=$MEM/16"
let "WAL=$MEM/16"
docker run -it --rm -p 5432:5432 
--shm-size=${SHARED}MB 
-v /mnt/disks/storage/timescaledb-data:/var/lib/postgresql/data timescale/timescaledb:latest-pg10 postgres 
-cmax_wal_size=${WAL}MB 
-clog_line_prefix="%m [%p]: [%x] %u@%d" 
-clogging_collector=off 
-csynchronous_commit=off 
-cshared_buffers=${SHARED}MB 
-ceffective_cache_size=${CACHE}MB 
-cwork_mem=${WORK}MB 
-cmaintenance_work_mem=${MAINT}MB 
-cmax_files_per_process=100

El cargador de datos se ejecutó con 16 hilos en paralelo.

Este artículo contiene solo los resultados de métricas de inserción. Los resultados de la evaluación de referencia de muestreo se publicarán en un artículo separado.

400K series temporales únicas

Comencemos con los elementos simples: 400K. Resultados de la referencia:

  • VictoriaMetrics: 2,6M puntos de datos por segundo; uso de memoria: 3 GB; tamaño final de los datos en disco: 965 MB
  • InfluxDB: 1.2M puntos de datos por segundo; uso de memoria: 8.5 GB; tamaño final de los datos en disco: 1.6 GB
  • Timescale: 849K puntos de datos por segundo; uso de memoria: 2,5 GB; tamaño final de los datos en disco: 50 GB

Como se puede ver en los resultados anteriores, VictoriaMetrics gana en rendimiento de inserción y grado de compresión. Timescale gana en uso de memoria, pero utiliza mucho espacio en disco: 29 bytes por punto de datos.

A continuación se muestran gráficos de uso de CPU para cada uno de los TSDB durante la evaluación de referencia:

Comparativa de alto rendimiento de TSDB: VictoriaMetrics vs TimescaleDB vs InfluxDB

Captura de pantalla anterior: VictoriaMetrics — Carga de CPU durante la prueba de inserción para la métrica única 400K.

Comparativa de alto rendimiento de TSDB: VictoriaMetrics vs TimescaleDB vs InfluxDB

Captura de pantalla anterior: InfluxDB — Carga de CPU durante la prueba de inserción para la métrica única 400K.

Comparativa de alto rendimiento de TSDB: VictoriaMetrics vs TimescaleDB vs InfluxDB

Captura de pantalla anterior: TimescaleDB — Carga de CPU durante la prueba de inserción para la métrica única 400K.

VictoriaMetrics utiliza todos los vCPUs disponibles, mientras que InfluxDB utiliza insuficientemente aproximadamente 2 de 16 vCPUs.

Timescale utiliza solo 3-4 de 16 vCPUs. Las altas proporciones de iowait y system en el gráfico de TimescaleDB indican un cuello de botella en el subsistema de entrada/salida (I/O). Veamos los gráficos de uso de ancho de banda del disco:

Comparativa de alto rendimiento de TSDB: VictoriaMetrics vs TimescaleDB vs InfluxDB

Captura de pantalla anterior: VictoriaMetrics — Uso de ancho de banda del disco en la prueba de inserción para métricas únicas de 400K.

Comparativa de alto rendimiento de TSDB: VictoriaMetrics vs TimescaleDB vs InfluxDB

Captura de pantalla anterior: InfluxDB — Uso de ancho de banda del disco en la prueba de inserción para métricas únicas de 400K.

Comparativa de alto rendimiento de TSDB: VictoriaMetrics vs TimescaleDB vs InfluxDB

Captura de pantalla anterior: TimescaleDB — Uso de ancho de banda del disco en la prueba de inserción para métricas únicas de 400K.

VictoriaMetrics escribe datos a una velocidad de 20 Mbps con picos de hasta 45 Mbps. Los picos corresponden a grandes fusiones parciales en el árbol LSM.

InfluxDB escribe datos a una velocidad de 160 MB/s, mientras que un disco de 1 TB debe estar limitado a una capacidad de escritura de 120 MB/s.

TimescaleDB está limitada a una capacidad de escritura de 120 Mbps, pero a veces supera este límite alcanzando 220 Mbps en picos. Estos picos corresponden a caídas de carga de CPU insuficiente en el gráfico anterior.

Veamos los gráficos de uso de entrada/salida (I/O):

Comparativa de alto rendimiento de TSDB: VictoriaMetrics vs TimescaleDB vs InfluxDB

Captura de pantalla anterior: VictoriaMetrics — Uso de entrada/salida en la prueba de inserción para 400K métricas únicas.

Comparativa de alto rendimiento de TSDB: VictoriaMetrics vs TimescaleDB vs InfluxDB

Captura de pantalla anterior: InfluxDB — Uso de entrada/salida en la prueba de inserción para 400K métricas únicas.

Comparativa de alto rendimiento de TSDB: VictoriaMetrics vs TimescaleDB vs InfluxDB

Captura de pantalla anterior: TimescaleDB — Uso de entrada/salida en la prueba de inserción para 400K métricas únicas.

Ahora está claro que TimescaleDB alcanza el límite de entrada/salida, por lo tanto, no puede utilizar los 12 vCPUs restantes.

4M series temporales únicas

4M series temporales parecen un poco desafiantes. Pero nuestros competidores pasan este examen con éxito. Resultados de la evaluación de rendimiento:

  • VictoriaMetrics: 2,2M puntos de datos por segundo; uso de memoria: 6 GB; tamaño final de los datos en disco: 3 GB.
  • InfluxDB: 330K puntos de datos por segundo; uso de memoria: 20,5 GB; tamaño final de los datos en disco: 18,4 GB.
  • TimescaleDB: 480K puntos de datos por segundo; uso de memoria: 2,5 GB; tamaño final de los datos en disco: 52 GB.

El rendimiento de InfluxDB ha caído de 1,2 millones de puntos de datos por segundo para 400K series temporales a 330 mil puntos de datos por segundo para 4M series temporales. Esta es una pérdida de rendimiento significativa en comparación con otros competidores. Veamos los gráficos de uso de CPU para entender la causa raíz de esta pérdida:

Comparativa de alto rendimiento de TSDB: VictoriaMetrics vs TimescaleDB vs InfluxDB

Captura de pantalla anterior: VictoriaMetrics — Uso de CPU en la prueba de inserción para una serie temporal única de 4M.

Comparativa de alto rendimiento de TSDB: VictoriaMetrics vs TimescaleDB vs InfluxDB

Captura de pantalla anterior: InfluxDB — Uso de CPU en la prueba de inserción para una serie temporal única de 4M.

Comparativa de alto rendimiento de TSDB: VictoriaMetrics vs TimescaleDB vs InfluxDB

Captura de pantalla anterior: TimescaleDB — Uso de CPU en la prueba de inserción para una serie temporal única de 4M.

VictoriaMetrics utiliza casi toda la potencia de la CPU. La caída al final corresponde a las fusiones de LSM restantes después de insertar todos los datos.

InfluxDB utiliza solo 8 de 16 vCPUs, mientras que TimescaleDB utiliza 4 de 16 vCPUs. ¿Qué tienen en común sus gráficos? Una alta proporción de iowait, lo que nuevamente indica un cuello de botella de entrada/salida.

TimescaleDB tiene una alta proporción de system. Creemos que la alta carga ha llevado a muchas llamadas al sistema o a muchos minor page faults.

Veamos los gráficos de rendimiento del disco:

Comparativa de alto rendimiento de TSDB: VictoriaMetrics vs TimescaleDB vs InfluxDB

Captura de pantalla anterior: VictoriaMetrics — Uso del ancho de banda del disco para insertar 4M métricas únicas.

Comparativa de alto rendimiento de TSDB: VictoriaMetrics vs TimescaleDB vs InfluxDB

Captura de pantalla anterior: InfluxDB — Uso del ancho de banda del disco para insertar 4M métricas únicas.

Comparativa de alto rendimiento de TSDB: VictoriaMetrics vs TimescaleDB vs InfluxDB

Captura de pantalla anterior: TimescaleDB — Uso del ancho de banda del disco para insertar 4M métricas únicas.

VictoriaMetrics alcanzó un límite de 120 MB/s en picos, mientras que la velocidad de escritura promedio fue de 40 MB/s. Probablemente, durante el pico se realizaron varias fusiones pesadas de LSM.

InfluxDB nuevamente logra una capacidad promedio de escritura de 200 MB/s con picos de hasta 340 MB/s en un disco con un límite de escritura de 120 MB/s 🙂

TimescaleDB ya no está limitado por el disco. Parece que está restringido por algo más relacionado con la alta proporción de carga sistema de CPU.

Veamos los gráficos de uso de IO:

Comparativa de alto rendimiento de TSDB: VictoriaMetrics vs TimescaleDB vs InfluxDB

Captura de pantalla anterior: VictoriaMetrics — Uso de entrada/salida durante la prueba de inserción para una serie temporal única de 4M.

Comparativa de alto rendimiento de TSDB: VictoriaMetrics vs TimescaleDB vs InfluxDB

Captura de pantalla anterior: InfluxDB — Uso de entrada/salida durante la prueba de inserción para una serie temporal única de 4M.

Comparativa de alto rendimiento de TSDB: VictoriaMetrics vs TimescaleDB vs InfluxDB

Captura de pantalla anterior: TimescaleDB — Uso de entrada/salida durante la prueba de inserción para una serie temporal única de 4M.

Los gráficos de uso de IO replican los gráficos de uso del ancho de banda del disco: InfluxDB está limitado en IO, mientras que VictoriaMetrics y TimescaleDB cuentan con recursos de entrada y salida de IO disponibles.

40M series temporales únicas

40M series temporales únicas fueron demasiado grandes para InfluxDB 🙁

Resultados de la prueba de rendimiento:

  • VictoriaMetrics: 1.7M puntos de datos por segundo; uso de memoria: 29 GB; uso de espacio en disco: 17 GB.
  • InfluxDB: no finalizó porque requirió más de 60 GB de memoria RAM.
  • TimescaleDB: 330K puntos de datos por segundo; uso de memoria: 2.5 GB; uso de espacio en disco: 84 GB.

TimescaleDB muestra un uso de memoria excepcionalmente bajo y estable: 2.5 GB, lo mismo que para métricas únicas de 4M y 400K.

VictoriaMetrics aumentaba lentamente a 100 mil puntos de datos por segundo hasta que se procesaron todos los 40M nombres de métricas con etiquetas. Luego alcanzó una velocidad de inserción estable de 1.5-2.0M puntos de datos por segundo, así que el resultado final fue de 1.7M puntos de datos por segundo.

Los gráficos para 40M series temporales únicas son similares a los gráficos para 4M series temporales únicas, así que los omitiremos.

Conclusiones

  • Los TSDB modernos pueden manejar inserciones para millones de series temporales únicas en un solo servidor. En el próximo artículo, analizaremos qué tan bien los TSDB realizan consultas sobre millones de series temporales únicas.
  • La baja carga de CPU generalmente indica un cuello de botella en la entrada y salida. Además, esto puede indicar un bloqueo demasiado grosero, donde solo unos pocos hilos pueden ejecutarse a la vez.
  • El cuello de botella de E/S realmente existe, especialmente en almacenamiento sin SSD, como dispositivos de bloque virtualizados de proveedores de nube.
  • VictoriaMetrics proporciona la mejor optimización para almacenamiento lento con bajo rendimiento de E/S. Ofrece la mejor velocidad y el mejor nivel de compresión.

Descargue la imagen de un solo servidor de VictoriaMetrics y pruébelo con sus datos. El archivo binario estático correspondiente está disponible en GitHub.

Para más información sobre VictoriaMetrics, consulte este el artículo.

Actualización: se ha publicado un artículo que compara el rendimiento de inserción de VictoriaMetrics con InfluxDB con resultados reproducibles.

Actualización #2: Lee también el artículo sobre escalabilidad vertical VictoriaMetrics vs InfluxDB vs TimescaleDB.

Actualización #3: VictoriaMetrics ahora es de código abierto!

Chat de Telegram: https://t.me/VictoriaMetrics_ru1

Fuente: habr.com

Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS 🔥 Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS | ProHoster