Après trois mois de développement, la bibliothèque libmdbx 0.10.0 (MDBX) a été publiée, avec une implémentation d'une base de données embarquée clé-valeur compacte et haute performance. Le code de libmdbx est distribué sous la licence OpenLDAP Public License. libmdbx est une réécriture approfondie de la base de données LMDB et, selon les développeurs, surpasse son prédécesseur en termes de fiabilité, de fonctionnalités et de performance. Il est affirmé que libmdbx est jusqu'à 20 % plus rapide que LMDB dans les scénarios CRUD et jusqu'à 30 % plus rapide si le contrôle interne est désactivé lors de la compilation de libmdbx à un niveau comparable à celui de LMDB.
Libmdbx propose ACID, une sérialisation stricte des modifications et une lecture non bloquante avec une mise à l'échelle linéaire sur les cœurs CPU. Dans libmdbx, une grande attention est accordée à la qualité du code, à la stabilité de l'API, aux tests et aux vérifications automatiques. La compactification automatique, la gestion automatique de la taille de la base de données et un format unique pour les versions 32 bits et 64 bits sont pris en charge, ainsi que l'estimation du volume d'échantillons par intervalles (range query estimation). Un utilitaire de vérification de l'intégrité de la structure de la base de données est fourni, avec certaines capacités de récupération. Depuis 2016, le projet est financé par Positive Technologies et est utilisé dans ses produits depuis 2017, et les sanctions imposées par le gouvernement américain contre Positive Technologies n'ont pas d'impact significatif.
Principales innovations, améliorations et corrections ajoutées depuis la dernière publication :
- Des liaisons pour Ruby par Mahlon E. Smith et une version d'essai des liaisons pour Python par Noel Kuntze sont disponibles, ainsi que des liaisons mises à jour pour GoLang par Alexey Sharov.
- Pour le mode « MDBX_WRITEMAP », lorsque les données de la base de données sont modifiées directement dans la RAM, une « vidange transparente » sur le disque des pages modifiées de la base de données a été mise en œuvre. Désormais, après chaque opération, ces pages sont prêtes à être écrites sur le disque, et le noyau de l'OS peut lui-même évacuer les pages modifiées, rendant la confirmation de transaction sans nécessité de modification. En conséquence, dans des scénarios chargés avec un manque de RAM, le volume des opérations disque peut être réduit jusqu'à 2 fois.
- L'élimination des instantanés d'anciennes pages modifiées a été mise en œuvre, avec une préférence pour l'élimination des pages ayant de grandes longueurs de valeurs, qui dans la grande majorité des cas, ne changent qu'une seule fois par transaction. Cela réduit le volume des échanges avec le disque et améliore les performances dans des scénarios avec de très grandes transactions.
- Un mode de répartition des pages « intelligent » a été mis en place lors de l'insertion de clés. Désormais, lors de l'insertion de séquences ordonnées, le remplissage complet des pages est automatiquement garanti, tandis que dans les autres cas, un équilibrage d'arbre plus optimal est assuré. En conséquence, les pages de la base de données sont en moyenne plus optimisées, et l'arbre B devient plus équilibré, ce qui influence positivement les performances.
- Des statistiques sur les opérations des pages ont été ajoutées, ce qui permet d'évaluer précisément le coût des opérations de modification sur la base de données.
- Plus d'une dizaine de défauts et erreurs ont été corrigés, y compris : des problèmes avec la compilation via MinGW, l'utilisation de `std::filesystem::path` sur iOS <= 13.0, compilation ciblant d'anciennes versions de Windows, etc.
- Au total, plus de 200 modifications ont été apportées dans 66 fichiers, ajoutant environ 6500 lignes et en supprimant environ 4500.
Il convient de souligner que le projet Turbo-Geth (fork turbo de Go-Ethereum) a choisi libmdbx comme nouvelle solution de stockage, et de remercier l'équipe du projet (en particulier Alexei Sharov, Artem Vorotnikov et Alexei Akhunov) pour leur aide précieuse dans les tests dans des scénarios d'utilisation extrêmes. En particulier, cela a permis de découvrir et de corriger un défaut dans la gestion de la lecture anticipée/caching, qui entraînait une dégradation des performances dans des scénarios difficiles à reproduire avec de grandes bases de données.
Source : opennet.ru
