libmdbx 0.12.3 ya fue liberado y estas son sus novedades
Se dio a conocer el lanzamiento de la nueva versión de libmdbx 0.12.3 (MDBX) una implementación de una base de datos clave-valor incrustada compacta de alto rendimiento.
libmdbx es una reelaboración profunda de LMDB DBMS y supera a su antecesor en términos de confiabilidad, conjunto de funciones y rendimiento. En comparación con LMDB, libmdbx pone mucho énfasis en la calidad del código, la estabilidad de la API, las pruebas y las comprobaciones automáticas.
Principales novedades de libmdbx 0.12.3
En esta nueva versión podremos encontrar que se implementó una elección dinámica entre escritura simultánea en disco y escritura normal seguida de fdatasync(), controlada por la opción MDBX_opt_writethrough_threshold. En los modos duraderos, los datos se pueden vaciar en el disco de dos maneras: escritura simultánea a través de un descriptor de archivo abierto con O_DSYNCy escritura normal seguida de fdatasync().
El primer método es más conveniente cuando se escribe un número reducido de páginas y/o si el canal de comunicación con el disco/medio tiene un retraso cercano a cero. El segundo método es conveniente si necesitas escribir muchas páginas y/o el canal de interacción tiene un retraso importante (centros de datos, nubes). La opción agregada MDBX_opt_writethrough_thresholdle permite establecer un umbral en tiempo de ejecución para seleccionar dinámicamente el método de grabación según el volumen y las condiciones de uso específicas.
Otro de los cambios que se destaca es que se ha agregado una opción de compilación MDBX_MMAP_USE_MS_ASYNC que permite deshabilitar el uso de una llamada al sistema msync(MS_ASYNC), que no es necesaria en la gran mayoría de los sistemas operativos actuales.
Ademas de ello se ha colocado como predeterminado MDBX_MMAP_USE_MS_ASYNC=0(desactivado) en Linux y otros sistemas con caché de página unificada. Este comportamiento (sin usar msync(MS_ASYNC)) corresponde a la lógica LMDB codificada. Como resultado, en los puntos de referencia simples/ingenuos, libmdbx supera a LMDB de la misma manera que en el uso real.
Por si acaso, vale la pena señalar/recordar una vez más que en Windows, se espera que libmdbx se quede atrás de LMDB en escenarios con muchas transacciones pequeñas, ya que libmdbx usa deliberadamente bloqueos de archivos en Windows, que son lentos (mal implementados en el kernel del sistema operativo), pero le permite proteger a los usuarios de la gran cantidad de acciones incorrectas que provocan daños en la base de datos.
En MDBX_WRITEMAP el modo de asignación/reutilización, las páginas generan un error de página y la página se lee del disco, incluso si el contenido de la página no es necesario (se sobrescribirá). Esto es una consecuencia del trabajo del subsistema de memoria virtual, y el método regular de tratamiento MADV_REMOVEno funciona en todos los sistemas de archivos y suele ser más caro que los ahorros resultantes.
Ademas de ello, tambien vale la pena destacar que libmdbx ahora usa «escritura anticipada» de tales páginas, lo que en sistemas con un caché de página unificado hace que los datos se «inserten», eliminando la necesidad de leer desde el disco al acceder a dicha página de memoria. La nueva funcionalidad funciona en conjunto con la gestión automática de la lectura anticipada y la caché de estado de presencia de página en RAM, a través de mincore().
Tambien se menciona que se implementó la escritura previa a la falla al asignar páginas para asignaciones de lectura y escritura. Esto lleva a una reducción múltiple en los costos del sistema y un aumento significativo en el rendimiento en los casos de uso relevantes, cuando: el tamaño de la base de datos y la cantidad de datos son significativamente mayores que la RAM; se utiliza el modo MDBX_WRITEMAP; Transacciones no pequeñas (se asignan muchos cientos o miles de páginas en el curso de una transacción).
De los demás cambios que se destacan:
- Añadido control por la ausencia de archivos LCK con nombres alternativos.
- Soporte mejorado para la fusión automática de registros GC dentro de page_alloc_slowpath().
- Involucrado un solo cursor para buscar en el GC. Indicadores internos modificados relacionados con la paginación del GC.
- Preparación mejorada de la reserva antes de actualizar el GC con BigFoot habilitado.
- Se optimizó el uso de pnl_merge() para casos de listas combinadas que no se superponen.
- Compatibilidad optimizada para la lista ordenada de páginas en dpl_append().
- Rendimiento mejorado de mdbx_chk al procesar entradas de usuario en @MAIN.
- Marcas LRU modificadas
- Control de «incoherencia» de caché de página unificada rediseñado para reducir la sobrecarga.
- Instalación automática proporcionada MDBX_opt_rp_augment_limitdependiendo del tamaño de la base de datos.
- Se agregó la opción MDBX_opt_prefault_write_enablepara forzar la activación/desactivación de la grabación previa a la falla.
- Se agregó soporte para nombres no imprimibles para subDb.
Se agregó una opción explícita tls_model(«local-dynamic»)para solucionar un problema » relocation R_X86_64_TPOFF32 against FOO cannot be used with -shared» debido a un error en Clang que causaba el uso del modo incorrecto ls_model.
Finalmente, si estás interesado en poder conocer más al respecto, puedes consultar los detalles en el siguiente enlace.