В пускане на новата версия на libmdbx 0.12.3 (MDBX) реализация на компактна, високопроизводителна вградена база данни ключ-стойност.
libmdbx е дълбока преработка на LMDB DBMS и надминава своя предшественик по отношение на надеждност, набор от функции и производителност. В сравнение с LMDB, libmdbx поставя голям акцент върху качеството на кода, стабилността на API, тестването и самопроверките.
Основни нови функции на libmdbx 0.12.3
В тази нова версия можем да намерим това внедри динамичен избор между едновременен запис на диск и запис нормален, последван от fdatasync(), контролиран от опцията MDBX_opt_writethrough_threshold. В трайни режими данните могат да се изхвърлят на диск по два начина: едновременно записване чрез файлов дескриптор, отворен с O_DSYNC, и нормално писане, последвано от fdatasync().
Първият метод по-удобно е при писане на малък брой страници и/или ако комуникационният канал с диска/носителя има забавяне, близко до нула. Вторият метод е удобен, ако трябва да напишете много страници и/или каналът за взаимодействие има значително забавяне (центрове за данни, облаци). Добавената опция MDBX_opt_writethrough_threshold ви позволява да зададете праг по време на изпълнение, за да изберете динамично метода на запис въз основа на обема и специфичните условия на използване.
Друга промяна, която се откроява, е тази добави опция за компилиране MDBX_MMAP_USE_MS_ASYNC което ви позволява да деактивирате използването на системно извикване msync(MS_ASYNC), което не е необходимо на по-голямата част от текущите операционни системи.
Освен него по подразбиране MDBX_MMAP_USE_MS_ASYNC=0(хора с увреждания) на Linux и други системи с унифициран кеш на страници. Това поведение (без използване на msync(MS_ASYNC)) съответства на твърдо кодирана логика на LMDB. В резултат на това при прости/наивни бенчмаркове libmdbx превъзхожда LMDB по същия начин, както при реална употреба.
За всеки случай си струва да се отбележи/запомни още веднъж, че в Windows се очаква libmdbx да изостава от LMDB в сценарии с много малки транзакции, тъй като libmdbx умишлено използва заключвания на файлове в Windows, които са бавни (зле внедрени). в ядрото на операционната система), но ви позволява да защитите потребителите от големия брой грешни действия, които водят до повреда на базата данни.
В режим на разпределение/повторно използване на MDBX_WRIITEMAP страниците генерират грешка на страницата и страницата се чете от диска, дори ако съдържанието на страницата не е необходимо (то ще бъде презаписано). Това е следствие от работата на подсистемата на виртуалната памет, а обикновеният метод на лечение MADV_REMOVE не работи на всички файлови системи и често е по-скъп от получените спестявания.
Освен това си струва да се отбележи, че libmdbx сега използва "write-ahead" на такива страници, което на системи с унифициран кеш на страници кара данните да бъдат "избутвани", елиминирайки необходимостта от четене от диска при достъп до тази страница от паметта. Новата функционалност работи във връзка с автоматичното управление на кеша за състояние на четене напред и на присъствие на страници в RAM чрез mincore().
Също така се споменава, че писането преди повреда е внедрено при разпределяне на страници за разпределения за четене и запис. Това води до многократно намаляване на системните разходи и значително повишаване на производителността в съответните случаи на използване, когато: размерът на базата данни и количеството данни са значително по-големи от RAM; Използва се режим MDBX_WRIITEMAP; Немалки транзакции (много стотици или хиляди страници се разпределят в хода на транзакция).
От останалите промени които се открояват:
- Добавен е контрол за липсата на LCK файлове с алтернативни имена.
- Подобрена поддръжка за автоматично сливане на GC записи в page_alloc_slowpath().
- Включва един курсор за търсене в GC. Променени вътрешни флагове, свързани с GC страниране.
- Подобрена подготовка на резервацията преди актуализиране на GC с активиран BigFoot.
- Оптимизирано е използването на pnl_merge() за случаи на обединени списъци без припокриване.
- Оптимизирана поддръжка за подреден списък от страници в dpl_append().
- Подобрена производителност на mdbx_chk при обработка на потребителско въвеждане на @MAIN.
- Модифицирани LRU маркировки
- Преработен контрол за „несъответствие“ в унифицирания кеш на страниците, за да се намалят режийните разходи.
- Автоматично инсталиране осигурява MDBX_opt_rp_augment_limit в зависимост от размера на базата данни.
- Добавена е опция MDBX_opt_prefault_write_enable за принудително активиране/деактивиране на запис преди грешка.
- Добавена е поддръжка за непечатаеми имена за subDb.
Добавена е изрична опция tls_model("local-dynamic") за коригиране на проблем "преместване R_X86_64_TPOFF32 срещу FOO не може да се използва с -shared" поради грешка в Clang, която е причинила използването на грешен режим ls_model.
И накрая, ако се интересувате да научите повече за това, можете да проверите подробностите В следващия линк.