После трех месяцев разработки состоялся выпуск библиотеки libmdbx 0.10.0 (MDBX) с реализацией высокопроизводительной, компактной встраиваемой базы данных класса ключ-значение. Код libmdbx распространяется под лицензией OpenLDAP Public License. libmdbx является глубокой переработкой СУБД LMDB и по заявлению разработчиков превосходит своего прародителя по надежности, набору возможностей и производительности. Заявляется, что libmdbx до 20% быстрее LMDB в CRUD сценариях и до 30% быстрее, если при сборке libmdbx отключить внутренний контроль до сопоставимого с LMDB уровня.
Libmdbx предлагает ACID, строгую сериализацию изменений и неблокирующее чтение с линейным масштабированием по ядрам CPU. В libmdbx большое внимание уделяется качеству кода, стабильной работе API, тестированию и автоматическим проверкам. Поддерживается автокомпактификация, автоматическое управление размером БД, единый формат БД для 32-битных и 64-битных сборок, оценка объёма выборок по диапазонам (range query estimation). Поставляется утилита проверки целостности структуры БД с некоторыми возможностями восстановления. C 2016 года проект финансируется компанией Positive Technologies и c 2017 года используется в её продуктах, а введённые правительством США санкции против Positive Technologies не оказывают какого-либо заметного влияния.
Основные новшества, доработки и исправления, добавленные после прошлого выпуска:
- Доступны привязка для Ruby от Mahlon E. Smith и пробная версия привязок для Python от Noel Kuntze, обновлены привязки для GoLang от Алексея Шарова.
- Для режима «MDBX_WRITEMAP», когда данные БД изменяются непосредственно в ОЗУ, реализован «прозрачный пролив» на диск измененных страниц БД. Теперь, после завершения каждой операции, такие страницы сразу полностью готовы для записи на диск и ядро ОС может самостоятельно сбрасывать измененные страницы на диск, а фиксация транзакции не потребует их модификации. В результате, в нагруженных сценариях с недостатком ОЗУ, объем дисковых операций может сокращаться до 2 раз.
- Реализовано вытеснение давно неиспользуемых теневых копий измененных страниц, с предпочтением вытеснения страниц с большими/длинными значениями, которые в подавляющем большинстве сценариев изменяются только один раз за транзакцию. В результате уменьшается объем обмена с диском и увеличивается производительность в сценариях с очень большими транзакциями.
- Реализован «умный» режим разделения страниц при вставке ключей. Теперь при вставке упорядоченных последовательностей автоматически обеспечивается полное заполнение страниц, а в остальных случаях более оптимальная балансировка дерева. В результате, в среднем, страницы БД заполняются более оптимально, а B-дерево получается более сбалансированным, что положительно влияет на производительность.
- Добавлена статистика операций со страницами, что позволяет точно оценивать стоимость модифицирующих операций с БД.
- Устранено более десятка недочётов и ошибок, в том числе: решены проблемы со сборкой посредством MinGW, использования `std::filesystem::path` в iOS <= 13.0, сборка с таргетированием на старые версии Windows и т.д.
- Суммарно внесено более 200 изменений в 66 файлов, добавлено ~6500 строк, удалено ~4500.
Отдельно хочется отметить выбор проектом Turbo-Geth (турбо-форк Go-Ethereum) libmdbx в качестве нового бекэнда хранения, а также поблагодарить команду проекта (в особенности Алексея Шарова, Артёма Воротникова и Алексея Ахунова) за большую помощь в тестировании в экстремальных сценариях использования. В частности, так был обнаружен и устранен дефект в управлении упреждающим чтением/кэшированием, который приводил к деградации производительности в сложно-воспроизводимых сценариях с большими БД.
Источник: opennet.ru