Release av högpresterande inbäddad DBMS libmdbx 0.10

Efter tre månaders utveckling släpptes libmdbx 0.10.0 (MDBX), som implementerar en högpresterande, kompakt inbäddad nyckel-värdesdatabas. Libmdbx-koden är licensierad under OpenLDAP Public License. libmdbx är en djupgående omarbetning av LMDB DBMS och är enligt utvecklarna överlägsen sin förfader i tillförlitlighet, utbud av möjligheter och prestanda. Det anges att libmdbx är upp till 20 % snabbare än LMDB i CRUD-scenarier och upp till 30 % snabbare om interna kontroller är inaktiverade när man bygger libmdbx till en nivå som är jämförbar med LMDB.

Libmdbx erbjuder ACID, stark serialisering av förändringar och icke-blockerande läsningar som skalas linjärt över CPU-kärnor. I libmdbx ägnas mycket uppmärksamhet åt kodkvalitet, stabil API-drift, testning och automatiska kontroller. Stöder automatisk komprimering, automatisk databasstorlekshantering, ett enda databasformat för 32-bitars och 64-bitars sammansättningar och uppskattning av intervallfrågor. Ett verktyg för att kontrollera databasstrukturens integritet med vissa återställningsmöjligheter tillhandahålls. Sedan 2016 har projektet finansierats av Positive Technologies och har använts i dess produkter sedan 2017, och de sanktioner som USA:s regering har infört mot Positive Technologies har ingen märkbar effekt.

Stora innovationer, förbättringar och korrigeringar som lagts till sedan den senaste utgåvan:

  • En Ruby-bindning av Mahlon E. Smith och en testversion av Python-bindningar av Noel Kuntze finns tillgängliga, och GoLang-bindningar av Alexey Sharov har uppdaterats.
  • För "MDBX_WRITEMAP"-läget, när databasdata ändras direkt i RAM, implementeras ett "transparent spill" av ändrade databassidor till disken. Nu, efter slutförandet av varje operation, är sådana sidor omedelbart helt redo att skriva till disken och OS-kärnan kan självständigt spola de ändrade sidorna till disken, och att utföra en transaktion kommer inte att kräva att de ändras. Som ett resultat, i upptagna scenarier med otillräckligt RAM-minne, kan volymen av diskoperationer minskas med upp till 2 gånger.
  • Implementerad avhysning av länge oanvända skuggkopior av modifierade sidor, med preferens för avhysning av sidor med stora/långa värden, som i de allra flesta scenarier endast modifieras en gång per transaktion. Resultatet är minskad disktrafik och förbättrad prestanda i scenarier med mycket stora transaktioner.
  • Ett "smart" läge för att separera sidor när nycklar infogas har implementerats. När nu ordnade sekvenser infogas fylls sidorna automatiskt helt, och i andra fall är trädet mer optimalt balanserat. Som ett resultat fylls databassidor i genomsnitt mer optimalt och B-trädet är mer balanserat, vilket har en positiv effekt på prestandan.
  • Statistik över operationer med sidor har lagts till, vilket gör att du exakt kan uppskatta kostnaden för att ändra operationer med databasen.
  • Mer än ett dussin buggar och buggar har åtgärdats, inklusive: problem med att bygga med MinGW, använda `std::filesystem::path` i iOS <= 13.0, byggnad inriktad på äldre versioner av Windows, etc.
  • Totalt gjordes mer än 200 ändringar i 66 filer, ~6500 rader lades till, ~4500 raderades.

Separat skulle jag vilja notera valet av Turbo-Geth-projektet (en turbokaffel av Go-Ethereum) libmdbx som en ny lagringsbackend, och även tacka projektteamet (särskilt Alexey Sharov, Artyom Vorotnikov och Alexey Akhunov) för deras stor hjälp vid testning i extrema användningsscenarier. I synnerhet upptäcktes och eliminerades en defekt i läs-/cachningskontrollen, vilket ledde till prestandaförsämring i svårreproducerade scenarier med stora databaser.

Källa: opennet.ru

Lägg en kommentar