După trei luni de dezvoltare, a fost lansată biblioteca libmdbx 0.10.0 (MDBX) cu implementarea unei baze de date încorporate, de tip cheie-valoare, de înaltă performanță și compactă. Codul libmdbx este distribuit sub licența OpenLDAP Public License. libmdbx reprezintă o revizuire profundă a SGBD-ului LMDB și, conform dezvoltatorilor, depășește strămoșul său în ceea ce privește fiabilitatea, setul de funcționalități și performanță. Se afirmă că libmdbx este cu până la 20% mai rapid decât LMDB în scenarii CRUD și cu până la 30% mai rapid dacă la compilarea libmdbx se dezactivează controlul intern până la un nivel comparabil cu cel al LMDB.
Libmdbx oferă ACID, serializare strictă a modificărilor și citire non-blocantă cu scalare liniară pe nuclee CPU. În libmdbx, se acordă o mare atenție calității codului, funcționării stabile a API-ului, testării și verificărilor automate. Este suportată auto-compacția, gestionarea automată a dimensiunii bazei de date, un format unic pentru versiunile de 32 și 64 de biți, estimarea volumului de interogări pe intervale (range query estimation). Este livrat un utilitar de verificare a integrității structurii bazei de date, cu unele funcționalități de recuperare. Din 2016, proiectul este finanțat de compania Positive Technologies și, din 2017, este utilizat în produsele acesteia, iar sancțiunile impuse de guvernul Statelor Unite împotriva Positive Technologies nu au un impact semnificativ.
Principalele noutăți, îmbunătățiri și corecturi, adăugate după ultima lansare:
- Sunt disponibile legături pentru Ruby de la Mahlon E. Smith și o versiune de încercare a legăturilor pentru Python de la Noel Kuntze, legăturile pentru GoLang de la Alexey Sharov au fost actualizate.
- Pentru modul „MDBX_WRITEMAP”, când datele bazei de date sunt modificate direct în RAM, a fost implementat un „spill” transparent pe disc al paginilor modificate ale bazei de date. Acum, după finalizarea fiecărei operațiuni, aceste pagini sunt gata să fie scrise pe disc, iar nucleul OS poate să descarce singur paginile modificate pe disc, fără ca fixarea tranzacției să necesite modificarea acestora. Ca urmare, în scenarii încărcate cu lipsă de RAM, volumul operațiunilor pe disc poate fi redus cu până la 2 ori.
- A fost implementată înlăturarea copiilor shadow ale paginilor modificate, nefolosite de mult timp, cu preferința pentru înlăturarea paginilor cu valori mari/lungi, care în cea mai mare parte a scenariilor sunt modificate doar o singură dată pe tranzacție. Ca urmare, se reduce volumul de transfer cu discul și se îmbunătățește performanța în scenariile cu tranzacții foarte mari.
- A fost implementat un mod „inteligent” de împărțire a paginilor la inserarea cheilor. Acum, la inserarea secvențelor ordonate, se asigură automat umplerea completă a paginilor, iar în celelalte cazuri se face o mai bună echilibrare a copacului. Drept urmare, în medie, paginile bazei de date sunt umplute mai optim, iar arborele B devine mai echilibrat, ceea ce afectează pozitiv performanța.
- A fost adăugată statistica operațiunilor cu paginile, ceea ce permite estimarea precisă a costului operațiunilor de modificare a bazei de date.
- Au fost eliminate mai mult de zece neajunsuri și erori, inclusiv: probleme rezolvate cu compilarea utilizând MinGW, utilizarea `std::filesystem::path` în iOS <= 13.0, compilarea vizând versiuni mai vechi de Windows etc.
- În total, au fost efectuate peste 200 de modificări în 66 de fișiere, au fost adăugate aproximativ 6500 de linii, iar aproximativ 4500 au fost șterse.
Merită menționat în mod special alegerea proiectului Turbo-Geth (fork-ul Turbo al Go-Ethereum) libmdbx ca nou backend de stocare, precum și mulțumirile echipei proiectului (în special lui Alexey Sharov, Artem Vorotnikov și Alexey Akhunov) pentru ajutorul acordat în testarea în scenarii extreme. În special, a fost descoperită și rezolvată o defecțiune în gestionarea citirii anticipate/cache-ului, care ducea la degradarea performanței în scenarii greu de reprodus cu baze de date mari.
Sursa: opennet.ro
