Efter tre månaders utveckling släpptes biblioteket libmdbx 0.10.0 (MDBX) med implementeringen av en högpresterande, kompakt inbäddad nyckel-värde-databas. Koden för libmdbx distribueras under OpenLDAP Public License. libmdbx är en djupgående omarbetning av databashanteraren LMDB och enligt utvecklarna överträffar den sin föregångare när det gäller pålitlighet, funktionalitet och prestanda. Det påstås att libmdbx är upp till 20 % snabbare än LMDB i CRUD-scenarier och upp till 30 % snabbare om intern kontroll stängs av vid kompilering av libmdbx till en jämförbar nivå med LMDB.
Libmdbx erbjuder ACID, strikt serialisering av ändringar och icke-blockerande läsning med linjär skalning över CPU-kärnor. Stort fokus läggs på kodens kvalitet, stabiliteten hos API:n, testning och automatiska kontroller. Automatisk kompaktisering, automatiskt DB-storlekshantering, en enhetlig DB-format för 32-bit och 64-bit versioner, samt uppskattning av urvalsstorlek baserat på intervall (range query estimation) stöds. En verktyg för att kontrollera databasstrukturen med viss återställningskapacitet levereras. Sedan 2016 finansieras projektet av företaget Positive Technologies och sedan 2017 används det i deras produkter, och de sanktioner som den amerikanska regeringen infört mot Positive Technologies påverkar inte märkbart.
Huvudsakliga nyheter, förbättringar och rättelser som lagts till sedan den senaste utgåvan:
- Bindningar till Ruby från Mahlon E. Smith och en provversion av bindningar till Python från Noel Kuntze är tillgängliga, bindningarna till GoLang från Alexey Sharov har uppdaterats.
- För läget "MDBX_WRITEMAP", där databasen ändras direkt i RAM, har en "transparent spill" till disk av databassidan genomförts. Nu, efter att varje operation har slutförts, är sådana sidor omedelbart redo för skrivning till disk och operativsystemets kärna kan självständigt skriva de ändrade sidorna till disk, vilket innebär att transaktionsfixering inte kräver framtida modifieringar av dem. Som resultat kan mängden diskoperationer i belastade scenarier med otillräckligt RAM minskas med upp till 50 %.
- Genomförd eliminering av länge outnyttjade skuggkopior av ändrade sidor, med prioritet för sidor med stora/långa värden, vilka oftast endast ändras en gång per transaktion. Som ett resultat minskar diskutbytet och prestandan ökar i scenarier med mycket stora transaktioner.
- En 'smart' sida delningläge har implementerats vid insättning av nycklar. Nu säkerställs automatisk fyllning av sidor vid insättning av ordnade sekvenser, medan en mer optimal balansering av trädet uppnås i övriga fall. Det resulterar i att DB-sidor i genomsnitt fylls mer optimalt och B-trädet blir mer balanserat, vilket positivt påverkar prestandan.
- Statistik över sidoperationer har lagts till, vilket möjliggör en exakt uppskattning av kostnaden för modifierande operationer med DB.
- Mer än ett dussin brister och fel har åtgärdats, inklusive: problem med sammansättning via MinGW, användning av `std::filesystem::path` i iOS <= 13.0, sammansättning riktad mot äldre versioner av Windows osv.
- Totalt har mer än 200 ändringar gjorts i 66 filer, med ~6500 nya rader och ~4500 borttagna.
Särskilt värt att nämna valet av Turbo-Geth-projektet (turbo-fork av Go-Ethereum) libmdbx som ny lagringsbackend, samt att tacka projektteamet (särskilt Alexey Sharov, Artem Vorotnikov och Alexey Akhunov) för stort stöd vid testning i extrema användningsscenarier. Särskilt upptäcktes och åtgärdades ett fel i hanteringen av förhandsläsning/cache, vilket ledde till prestandaförsämring i svårt reproducerbara scenarier med stora DB.
Källa: opennet.ru
