
https://db-benchmarks.com tiene como objetivo hacer puntos de referencia de la base de datos y los motores de búsqueda:
⚖️ justo y transparente : debe ser claro en qué condiciones o aquella base de datos / motor de búsqueda le da este o aquel rendimiento
Alta calidad : el control sobre el coeficiente de variación permite la producción de resultados que siguen siendo los mismos si ejecuta una consulta hoy, mañana o la próxima semana
? Fácilmente reproducible : cualquiera puede reproducir cualquier prueba en su propio hardware
Fácil de entender : los gráficos son muy simples
➕ Extendible : la arquitectura conectable permite agregar más bases de datos para probar
¡Y manténlo todo 100% de código abierto!
Este repositorio proporciona un marco de prueba que hace el trabajo.
Muchos puntos de referencia de bases de datos no son objetivos. Otros no hacen lo suficiente para garantizar la precisión y la estabilidad de los resultados, lo que en algunos casos rompe la idea de los puntos de referencia. Algunos ejemplos:
https://imply.io/blog/druid-nails-cost-eficiency-challenge-gainst-clickhouse-and-rockset/:
En realidad, queríamos hacer el punto de referencia en el mismo hardware, un M5.8xLarge, pero la única configuración preconsada que tenemos para M5.8xLarge es en realidad el M5D.8XLarge ... en cambio, ejecutamos en una instancia C5.9xLarge
Malas noticias, muchachos: cuando ejecutan puntos de referencia en diferentes hardware, al menos no se puede decir que algo es "106.76%" y "103.13%" de otra cosa. Incluso cuando prueba en el mismo servidor de metal desnudo, es bastante difícil obtener un coeficiente de variación inferior al 5%. Es muy probable que se pueda ignorar una diferencia del 3% en diferentes servidores. Dado todo eso, ¿cómo se puede asegurar que la conclusión final sea cierta?
https://tech.marksblogg.com/benchmarks.html
Mark hizo un gran trabajo haciendo la prueba del taxi en tantas bases de datos y motores de búsqueda diferentes. Pero dado que las pruebas se realizan en diferentes hardware, los números en la tabla resultante no son realmente comparables. Siempre debe tener esto en cuenta al evaluar los resultados en la tabla.
https://clickhouse.com/benchmark/dbms/
Cuando ejecuta cada consulta solo 3 veces, lo más probable es que obtenga coeficientes de variación muy altos para cada uno de ellos. Lo que significa que si ejecuta la prueba un minuto después, puede obtener una variación del 20%. ¿Y cómo se reproduce una prueba en el propio hardware? Desafortunadamente, no puedo encontrar cómo se puede hacerlo.
Nuestra creencia es que un punto de referencia de base de datos justo debe seguir algunos principios clave:
✅ Pruebe diferentes bases de datos en exactamente el mismo hardware
De lo contrario, debe reconocer un margen de error cuando hay pequeñas diferencias.
✅ Pruebe con la caché del sistema operativo completo purgado antes de cada prueba
De lo contrario, no puede probar consultas frías.
✅ La base de datos que se está probando debe tener todos sus cachés internos deshabilitados
De lo contrario, medirá el rendimiento de la memoria caché.
Best también si mides una carrera en frío también. Es especialmente importante para consultas analíticas donde las consultas frías pueden ocurrir a menudo
De lo contrario, oculta completamente cómo la base de datos puede manejar la E/S.
✅ Nada más debería estar ejecutándose durante las pruebas
De lo contrario, los resultados de su prueba pueden ser muy inestables.
✅ Debe reiniciar la base de datos antes de cada consulta
De lo contrario, las consultas anteriores aún pueden afectar el tiempo de respuesta de la consulta actual, a pesar de la limpieza de cachés internos.
✅ Debe esperar hasta que la base de datos se caliente por completo después de que comience
De lo contrario, puede terminar compitiendo con el proceso de calentamiento de la base de datos para E/S, lo que puede estropear severamente los resultados de su prueba.
Best
El coeficiente de variación es una muy buena métrica que muestra cuán estables son los resultados de su prueba. Si es más alto que n%, no puede decir que una base de datos es n% más rápida que otra.
✅ Lo mejor es que prueba con una frecuencia de CPU fija
De lo contrario, si está utilizando el gobernador de la CPU "bajo demanda" (que normalmente es un valor predeterminado) puede convertir fácilmente su tiempo de respuesta de 500 ms en más de 1000 ms.
✅ Mejor si prueba en SSD/NVME en lugar de HDD
De lo contrario, dependiendo de dónde estén ubicados sus archivos en HDD, puede obtener hasta 2 veces un rendimiento de E/S más bajo/mayor (probamos), lo que puede hacer que al menos sus consultas fríos sean incorrectas.
El marco de prueba que se utiliza en el backend de https://db-benchmarks.com es de código abierto (licencia AGPLV3) y se puede encontrar en https://github.com/db-benchmarks/db-benchmarks. Esto es lo que hace:
--limited )--test guarda los resultados de las pruebas para archivar--save guarda los resultados de las pruebas de los archivos a una base de datos remota (ninguno de los que se han probado)select count(*) y select * limit 1 para asegurarse de que las colecciones de datos sean similares en diferentes bases de datoscpuset y mem ).Antes de implementar el marco de prueba, asegúrese de tener lo siguiente:
PHP 8 y:curlmysqlidockerdocker-composesensors para controlar la temperatura de la CPU para evitar que se acelerendstatcgroups v2Para instalar:
git clone [email protected]:db-benchmarks/db-benchmarks.git
cd db-benchmarks.env.example a .envmem y cpuset en .env con el valor predeterminado de la memoria (en megabytes) y las CPU, el marco de prueba puede usar para tareas secundarias (carga de datos, obtener información sobre bases de datos)ES_JAVA_OPTS para sus pruebas. Por lo general, es el tamaño de la memoria asignada para Docker Machine Primero necesitas preparar una prueba:
Vaya a un directorio de prueba en particular (todas las pruebas deben estar en el directorio ./tests ), por ejemplo "hn_small":
cd tests/hn_smallEjecute el script init:
./initEsto lo hará:
Luego ejecute ../../test (está en la carpeta de la raíz del proyecto) para ver las opciones:
To run a particular test with specified engines, memory constraints and number of attempts and save the results locally:
/perf/test_engines/test
--test=test_name
--engines={engine1:type,...,engineN}
--memory=1024,2048,...,1048576 - memory constraints to test with, MB
[--times = N] - max number of times to test each query, 100 by default
[--dir = path] - if path is omitted - save to directory ' results ' in the same dir where this file is located
[--probe_timeout = N] - how long to wait for an initial connection, 30 seconds by default
[--start_timeout = N] - how long to wait for a db/engine to start, 120 seconds by default
[--warmup_timeout = N] - how long to wait for a db/engine to warmup after start, 300 seconds by default
[--query_timeout = N] - max time a query can run, 900 seconds by default
[--info_timeout = N] - how long to wait for getting info from a db/engine
[--limited] - emulate one physical CPU core
[--queries = /path/to/queries] - queries to test, ./tests/ < test name > /test_queries by default
To save to db all results it finds by path
/perf/test_engines/test
--save=path/to/file/or/dir, all files in the dir recursively will be saved
--host=HOSTNAME
--port=PORT
--username=USERNAME
--password=PASSWORD
--rm - remove after successful saving to database
--skip_calm - avoid waiting until discs become calm
----------------------
Environment variables:
All the options can be specified as environment variables, but you can ' t use the same option as an environment variables and as a command line argument at the same time.Y ejecuta la prueba:
../../test --test=hn_small --engines=elasticsearch,clickhouse --memory=16384 Si ejecuta sus pruebas en modo local (desarrollo) y no les importa la inexactitud de las pruebas, puede evitar la calma de los discos y las verificaciones de CPU estableciendo el parámetro --skip_inaccuracy
../../test --test=hn_small --engines=elasticsearch,clickhouse --memory=16384 --skip_inaccuracy Ahora tiene resultados de prueba en ./results/ (en la raíz del repositorio), por ejemplo:
# ls results/
220401_054753Ahora puede cargar los resultados en la base de datos para una visualización adicional. La herramienta de visualización, que se utiliza en https://db-benchmarks.com/, también es de código abierto y se puede encontrar en https://github.com/db-benchmarks/ui.
Así es como puede guardar los resultados:
username=login password=pass host=db.db-benchmarks.com port=443 save=./results ./testo
./test --username=login --password=pass --host=db.db-benchmarks.com --port=443 --save=./results
Estamos ansiosos por ver los resultados de su prueba. Si cree que deben agregarse a https://db-benchmarks.com, haga una solicitud de extracción de sus resultados a este repositorio.
Tenga lo siguiente en mente:
./results .Entonces:
.
|-core <- Core directory, contains base files required for tests.
| |-engine.php <- Abstract class Engine. Manages test execution, result saving, and parsing of test attributes.
| |-helpers.php <- Helper file with logging functions, attribute parsing, exit functions, etc.
|-misc <- Miscellaneous directory, intended for storing files useful during the initialization step.
| |-func.sh <- Meilisearch initialization helper script.
|-plugins <- Plugins directory: if you want to extend the framework by adding another database or search engine for testing, place it here.
| |-elasticsearch.php <- Elasticsearch plugin.
| |-manticoresearch.php <- Manticore Search plugin.
| |-clickhouse.php <- ClickHouse plugin.
| |-mysql.php <- MySQL plugin.
| |-meilisearch.php <- Meilisearch plugin.
| |-mysql_percona.php <- MySQL (Percona) plugin.
| |-postgres.php <- Postgres plugin.
| |-typesense.php <- Typesense plugin.
|-results <- Test results directory. The results shown on https://db-benchmarks.com/ are found here. You can also use `./test --save` to visualize them locally.
|-tests <- Directory containing test suites.
| |-hn <- Hackernews test suite.
| | |-clickhouse <- Directory for "Hackernews test -> ClickHouse".
| | | |-inflate_hook <- Engine initialization script. Handles data ingestion into the database.
| | | |-post_hook <- Engine verification script. Ensures the correct number of documents have been ingested and verifies data consistency.
| | | |-pre_hook <- Engine pre-check script. Determines if tables need to be rebuilt, starts the engine, and ensures availability.
| | |-data <- Prepared data collection for the tests.
| | |-elasticsearch <- Directory for "Hackernews test -> Elasticsearch".
| | | |-logstash_tuned <- Logstash configuration directory for the "tuned" type.
| | | | |-logstash.conf
| | | | |-template.json
| | | |-elasticsearch_tuned.yml
| | | |-inflate_hook <- Engine initialization script for data ingestion.
| | | |-post_hook <- Verifies document count and data consistency.
| | | |-pre_hook <- Pre-check script for table rebuilding and engine initialization.
| | |-manticoresearch <- Directory for testing Manticore Search in the Hackernews test suite.
| | | |-generate_manticore_config.php <- Script for dynamically generating Manticore Search configuration.
| | | |-inflate_hook <- Data ingestion script.
| | | |-post_hook <- Verifies document count and consistency.
| | | |-pre_hook <- Pre-check for table rebuilds and engine availability.
| | |-meilisearch <- Directory for "Hackernews test -> Meilisearch".
| | | |-inflate_hook <- Data ingestion script.
| | | |-post_hook <- Ensures correct document count and data consistency.
| | | |-pre_hook <- Pre-check for table rebuilds and engine start.
| | |-mysql <- Directory for "Hackernews test -> MySQL".
| | | |-inflate_hook <- Data ingestion script.
| | | |-post_hook <- Ensures document count and consistency.
| | | |-pre_hook <- Pre-check for table rebuilds and engine start.
| | |-postgres <- Directory for "Hackernews test -> Postgres".
| | | |-inflate_hook <- Data ingestion script.
| | | |-post_hook <- Verifies document count and data consistency.
| | | |-pre_hook <- Pre-check for table rebuilds and engine availability.
| | |-prepare_csv <- Prepares the data collection, handled in `./tests/hn/init`.
| | |-description <- Test description, included in test results and used during result visualization.
| | |-init <- Main initialization script for the test.
| | |-test_info_queries <- Contains queries to retrieve information about the data collection.
| | |-test_queries <- Contains all test queries for the current test.
| |-taxi <- Taxi rides test suite, with a similar structure.
| |-hn_small <- Test for a smaller, non-multiplied Hackernews dataset, similar structure.
| |-logs10m <- Test for Nginx logs, similar structure.
|-.env.example <- Example environment file. Update the "mem" and "cpuset" values as needed.
|-LICENSE <- License file.
|-NOTICE <- Notice file.
|-README.md <- You're reading this file.
|-docker-compose.yml <- Docker Compose configuration for starting and stopping databases and search engines.
|-important_tests.sh
|-init <- Initialization script. Handles data ingestion and tracks the time taken.
|-logo.svg <- Logo file.
|-test <- The executable file to run and save test results.
test=logs10m cpuset= " 0,1 " mem=32768 suffix=_tuned docker-compose up elasticsearchvoluntad:
suffix=_tuned : maps ./tests/logs10m/es/data/idx_tuned como directorio de datosmem=32768 limita la RAM a 32GB, si no se especifica, el valor predeterminado se usará desde el archivo .envcpuset="0,1" : el contenedor de Elasticsearch se ejecutará solo en los núcleos de CPU 0 y 1 (que puede ser la primera CPU física completa) Para detenerse, solo CTRL-C .
¿Quieres participar en el proyecto? Así es como puedes contribuir:
¡Todos están esperando su contribución!