libmdbx — чрезвычайно быстрая, компактная, мощная, интегрированная и разрешительно лицензированная транзакционная база данных «ключ-значение».
В выпуск новой версии libmdbx 0.12.3 (MDBX) реализация компактной высокопроизводительной встроенной базы данных «ключ-значение».
libmdbx это глубокая переработка СУБД LMDB и превосходит своего предшественника по надежности, набор функций и производительность. По сравнению с LMDB, libmdbx уделяет большое внимание качеству кода, стабильности API, тестированию и самопроверке.
Основные новые возможности libmdbx 0.12.3
В этой новой версии мы можем найти, что реализован динамический выбор между одновременной записью на диск и записью normal, за которым следует 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_WRITEMAP страницы генерируют ошибку страницы, и страница считывается с диска, даже если содержимое страницы не требуется (оно будет перезаписано). Это следствие работы подсистемы виртуальной памяти, а штатный метод лечения MADV_REMOVE работает не на всех файловых системах и зачастую обходится дороже полученной экономии.
Помимо этого, также стоит отметить, что libmdbx теперь использует «упреждающую запись» таких страниц, который в системах с унифицированным кэшем страниц приводит к «проталкиванию» данных, устраняя необходимость чтения с диска при доступе к этой странице из памяти. Новая функциональность работает в сочетании с автоматической обработкой кэша упреждающего чтения и состояния присутствия страницы в ОЗУ через mincore().
Также упоминается, что запись до сбоя была реализована при выделении страниц для чтения и записи. Это приводит к многократному снижению затрат на систему и значительному увеличению производительности в соответствующих случаях использования, когда: размер базы данных и объем данных значительно больше оперативной памяти; Используется режим MDBX_WRITEMAP; Немелкие транзакции (многие сотни или тысячи страниц выделяются в ходе транзакции).
Из других изменений которые выделяются:
- Добавлен контроль отсутствия файлов LCK с альтернативными именами.
- Улучшена поддержка автоматического объединения записей GC в page_alloc_slowpath().
- Задействован одиночный курсор для поиска 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.
Наконец, если вам интересно узнать об этом больше, вы можете проверить подробности По следующей ссылке.