Rilascio del DBMS incorporato ad alte prestazioni libmdbx 0.10

Dopo tre mesi di sviluppo, è stato rilasciato libmdbx 0.10.0 (MDBX), che implementa un database di valori-chiave incorporato compatto e ad alte prestazioni. Il codice libmdbx è concesso in licenza sotto la licenza pubblica OpenLDAP. libmdbx è una profonda rielaborazione del DBMS LMDB e, secondo gli sviluppatori, è superiore al suo antenato in termini di affidabilità, gamma di capacità e prestazioni. Si afferma che libmdbx è fino al 20% più veloce di LMDB negli scenari CRUD e fino al 30% più veloce se i controlli interni sono disabilitati durante la creazione di libmdbx a un livello paragonabile a LMDB.

Libmdbx offre ACID, serializzazione delle modifiche avanzata e letture non bloccanti che si adattano linearmente ai core della CPU. In libmdbx viene prestata molta attenzione alla qualità del codice, al funzionamento stabile dell'API, ai test e ai controlli automatici. Supporta la compattazione automatica, la gestione automatica delle dimensioni del database, un formato di database singolo per assembly a 32 e 64 bit e la stima dell'intervallo di query. Viene fornita un'utilità per verificare l'integrità della struttura del database con alcune funzionalità di ripristino. Dal 2016 il progetto è finanziato da Positive Technologies e utilizzato nei suoi prodotti dal 2017, e le sanzioni imposte dal governo statunitense contro Positive Technologies non hanno alcun impatto evidente.

Principali innovazioni, miglioramenti e correzioni aggiunte dall'ultima versione:

  • Sono disponibili un collegamento Ruby di Mahlon E. Smith e una versione di prova dei collegamenti Python di Noel Kuntze, mentre i collegamenti GoLang di Alexey Sharov sono stati aggiornati.
  • Per la modalità “MDBX_WRITEMAP”, quando i dati del database vengono modificati direttamente nella RAM, viene implementata una “distribuzione trasparente” delle pagine del database modificate su disco. Ora, dopo il completamento di ciascuna operazione, tali pagine sono immediatamente completamente pronte per la scrittura su disco e il kernel del sistema operativo può scaricare autonomamente le pagine modificate sul disco e l'esecuzione della transazione non richiederà la loro modifica. Di conseguenza, in scenari impegnativi con RAM insufficiente, il volume delle operazioni del disco può essere ridotto fino a 2 volte.
  • Implementata l'eliminazione delle copie shadow inutilizzate da molto tempo delle pagine modificate, con una preferenza per l'eliminazione delle pagine con valori grandi/lunghi, che nella stragrande maggioranza degli scenari vengono modificate solo una volta per transazione. Il risultato è una riduzione del traffico su disco e un miglioramento delle prestazioni in scenari con transazioni di grandi dimensioni.
  • Implementata una modalità "intelligente" per dividere le pagine durante l'inserimento delle chiavi. Ora, quando si inseriscono sequenze ordinate, le pagine vengono automaticamente riempite completamente e, in altri casi, l'albero è bilanciato in modo più ottimale. Di conseguenza, in media, le pagine del database vengono riempite in modo più ottimale e l’albero B è più bilanciato, il che ha un effetto positivo sulle prestazioni.
  • Sono state aggiunte le statistiche delle operazioni con le pagine, che consentono di stimare con precisione il costo della modifica delle operazioni con il database.
  • Sono stati risolti più di una dozzina di bug e bug, tra cui: problemi con la creazione utilizzando MinGW, utilizzando `std::filesystem::path` in iOS <= 13.0, creazione mirata a versioni precedenti di Windows, ecc.
  • In totale, sono state apportate più di 200 modifiche a 66 file, sono state aggiunte circa 6500 righe e ne sono state eliminate circa 4500.

Separatamente, vorrei sottolineare la scelta del progetto Turbo-Geth (un turbo fork di Go-Ethereum) libmdbx come nuovo backend di archiviazione, e ringraziare anche il team del progetto (in particolare Alexey Sharov, Artyom Vorotnikov e Alexey Akhunov) per il loro grande aiuto nei test in scenari di casi d'uso estremi. In particolare, è stato scoperto ed eliminato un difetto nel controllo read-ahead/caching, che portava ad un degrado delle prestazioni in scenari difficili da riprodurre con database di grandi dimensioni.

Fonte: opennet.ru

Aggiungi un commento