Lanzamiento del DBMS integrado de alto rendimiento libmdbx 0.10

Después de tres meses de desarrollo, se lanzó libmdbx 0.10.0 (MDBX), que implementa una base de datos clave-valor integrada compacta y de alto rendimiento. El código libmdbx tiene la licencia pública OpenLDAP. libmdbx es una profunda reelaboración del DBMS LMDB y, según los desarrolladores, es superior a su antecesor en confiabilidad, variedad de capacidades y rendimiento. Se afirma que libmdbx es hasta un 20% más rápido que LMDB en escenarios CRUD y hasta un 30% más rápido si los controles internos están deshabilitados al construir libmdbx a un nivel comparable a LMDB.

Libmdbx ofrece ACID, serialización de cambios sólidos y lecturas sin bloqueo que escalan linealmente en los núcleos de la CPU. En libmdbx, se presta mucha atención a la calidad del código, el funcionamiento estable de la API, las pruebas y las comprobaciones automáticas. Se admiten la compactación automática, la gestión automática del tamaño de la base de datos, un formato de base de datos único para ensamblajes de 32 y 64 bits y la estimación de consultas de rango. Se proporciona una utilidad para comprobar la integridad de la estructura de la base de datos con algunas capacidades de recuperación. Desde 2016, el proyecto ha sido financiado por Positive Technologies y se utiliza en sus productos desde 2017, y las sanciones impuestas por el gobierno de EE. UU. contra Positive Technologies no tienen ningún impacto notable.

Principales innovaciones, mejoras y correcciones agregadas desde la última versión:

  • Están disponibles una encuadernación Ruby de Mahlon E. Smith y una versión de prueba de las encuadernaciones Python de Noel Kuntze, y se han actualizado las encuadernaciones GoLang de Alexey Sharov.
  • Para el modo "MDBX_WRITEMAP", cuando los datos de la base de datos se cambian directamente en la RAM, se implementa un "derrame transparente" de las páginas de la base de datos modificadas en el disco. Ahora, después de completar cada operación, dichas páginas están inmediatamente completamente listas para escribir en el disco y el kernel del sistema operativo puede vaciar de forma independiente las páginas modificadas en el disco, y realizar una transacción no requerirá su modificación. Como resultado, en escenarios ocupados con RAM insuficiente, el volumen de operaciones del disco se puede reducir hasta 2 veces.
  • Se implementó el desalojo de instantáneas no utilizadas durante mucho tiempo de páginas modificadas, con preferencia por el desalojo de páginas con valores grandes/largos, que en la gran mayoría de escenarios se modifican solo una vez por transacción. El resultado es un tráfico de disco reducido y un rendimiento mejorado en escenarios con transacciones muy grandes.
  • Se ha implementado un modo "inteligente" para separar páginas al insertar claves. Ahora, al insertar secuencias ordenadas, las páginas se llenan automáticamente por completo y, en otros casos, el árbol está equilibrado de manera más óptima. Como resultado, en promedio, las páginas de la base de datos se llenan de manera más óptima y el árbol B está más equilibrado, lo que tiene un efecto positivo en el rendimiento.
  • Se han agregado estadísticas de operaciones con páginas, lo que permite estimar con precisión el costo de modificar operaciones con la base de datos.
  • Se han solucionado más de una docena de errores y fallas, que incluyen: problemas con la compilación usando MinGW, usando `std::filesystem::path` en iOS <= 13.0, compilación dirigida a versiones anteriores de Windows, etc.
  • En total, se realizaron más de 200 cambios en 66 archivos, se agregaron ~6500 líneas y se eliminaron ~4500.

Por otra parte, me gustaría destacar la elección del proyecto Turbo-Geth (una bifurcación turbo de Go-Ethereum) libmdbx como nuevo backend de almacenamiento, y también agradecer al equipo del proyecto (especialmente a Alexey Sharov, Artyom Vorotnikov y Alexey Akhunov) por su de gran ayuda para realizar pruebas en escenarios de casos de uso extremos. En particular, se descubrió y eliminó un defecto en el control de lectura anticipada/almacenamiento en caché, lo que provocó una degradación del rendimiento en escenarios difíciles de reproducir con bases de datos grandes.

Fuente: opennet.ru

Añadir un comentario