mdbx: update READMEs (build section).

Change-Id: I731737edc594f22f81cbfc080d857caeb31b9f9a
This commit is contained in:
Leonid Yuriev 2019-08-21 01:05:57 +03:00
parent 07aa657b63
commit a6155bcf2a
2 changed files with 332 additions and 110 deletions

View File

@ -1,47 +1,50 @@
## The [repository now only mirrored on the Github](https://abf.io/erthink/libmdbx) due to illegal discriminatory restrictions for Russian Crimea and for sovereign crimeans.
### The [repository now only mirrored on the Github](https://abf.io/erthink/libmdbx) due to illegal discriminatory restrictions for Russian Crimea and for sovereign crimeans.
<!-- Required extensions: pymdownx.betterem, pymdownx.tilde, pymdownx.emoji, pymdownx.tasklist, pymdownx.superfences -->
---
-----
libmdbx
======================================
**The revised and extended descendant of [Symas LMDB](https://symas.com/lmdb/).**
Доработанный и расширенный потомок [Lightning Memory-Mapped Database](https://ru.bmstu.wiki/LMDB_(Lightning_Memory-Mapped_Database)) (aka _LMDB_).
English version is [here](README.md).
_libmdbx_ превосходит LMDB по возможностям и надежности, не уступая в
производительности. _libmdbx_ работает на Linux, FreeBSD, MacOS X и
других ОС соответствующих POSIX.1-2008, а также поддерживает Windows в
качестве дополнительной платформы.
Отдельно ведётся не-публичная разработка следующей версии, в которой
будет кардинальное изменение как API, так и формата базы данных. Цель
этой революции - обеспечение более четкого и надежного API, добавление
новых функций, а также наделение базы данных новыми свойствами.
*Всё будет хорошо. The Future will (be) [Positive](https://www.ptsecurity.ru).*
*The Future will (be) Positive. Всё будет хорошо.*
[![Build Status](https://travis-ci.org/leo-yuriev/libmdbx.svg?branch=master)](https://travis-ci.org/leo-yuriev/libmdbx)
[![Build status](https://ci.appveyor.com/api/projects/status/ue94mlopn50dqiqg/branch/master?svg=true)](https://ci.appveyor.com/project/leo-yuriev/libmdbx/branch/master)
[![Coverity Scan Status](https://scan.coverity.com/projects/12915/badge.svg)](https://scan.coverity.com/projects/reopen-libmdbx)
English version of this README is [here](README.md), also the translations [by Google](https://translate.googleusercontent.com/translate_c?act=url&ie=UTF8&sl=ru&tl=en&u=https://github.com/leo-yuriev/libmdbx/tree/master)
and [by Yandex](https://translate.yandex.ru/translate?url=https%3A%2F%2Fgithub.com%2FReOpen%2Flibmdbx%2Ftree%2Fmaster&lang=ru-en).
### Статус проекта
_libmdbx_ работает на Linux, FreeBSD, MacOS X и других ОС
соответствующих POSIX.1-2008, а также поддерживает Windows (начиная с
Windows XP) в качестве дополнительной платформы.
Отдельно ведётся не-публичная разработка следующей версии, в которой
будет большое изменение как API, так и формата базы данных. Цель этой
революции - обеспечение более четкого и надежного API, добавление новых
функций, а также наделение базы данных новыми свойствами.
## Содержание
- [Обзор](#Обзор)
- [Сравнение с другими СУБД](#Сравнение-с-другими-СУБД)
- [История & Acknowledgments](#История)
- [Основные свойства](#Основные-свойства)
- [Доработки и усовершенствования относительно LMDB](#Доработки-и-усовершенствования-относительно-lmdb)
- [Недостатки и Компромиссы](#Недостатки-и-Компромиссы)
- [Проблема долгих чтений](#Проблема-долгих-чтений)
- [Сохранность данных в режиме асинхронной фиксации](#Сохранность-данных-в-режиме-асинхронной-фиксации)
- [Сравнение с другими базами данных](#Сравнение-с-другими-базами-данных)
- [История & Выражение признательности](#История)
- [Описание](#Описание)
- [Ключевые свойства](#Ключевые-свойства)
- [Доработки и усовершенствования относительно LMDB](#Доработки-и-усовершенствования-относительно-lmdb)
- [Недостатки и Компромиссы](#Недостатки-и-Компромиссы)
- [Проблема долгих чтений](#Проблема-долгих-чтений)
- [Сохранность данных в режиме асинхронной фиксации](#Сохранность-данных-в-режиме-асинхронной-фиксации)
- [Использование](#Использование)
- [Сборка](#Сборка)
- [Привязки к другим языкам](#Привязки-к-другим-языкам)
- [Сравнение производительности](#Сравнение-производительности)
- [Интегральная производительность](#Интегральная-производительность)
- [Масштабируемость чтения](#Масштабируемость-чтения)
- [Синхронная фиксация](#Синхронная-фиксация)
- [Отложенная фиксация](#Отложенная-фиксация)
- [Асинхронная фиксация](#Асинхронная-фиксация)
- [Потребление ресурсов](#Потребление-ресурсов)
- [Интегральная производительность](#Интегральная-производительность)
- [Масштабируемость чтения](#Масштабируемость-чтения)
- [Синхронная фиксация](#Синхронная-фиксация)
- [Отложенная фиксация](#Отложенная-фиксация)
- [Асинхронная фиксация](#Асинхронная-фиксация)
- [Потребление ресурсов](#Потребление-ресурсов)
-----
## Обзор
_libmdbx_ - это встраиваемый key-value движок хранения со специфическим
@ -75,7 +78,7 @@ _libmdbx_ не использует
сценарии использования.
### Сравнение с другими СУБД
### Сравнение с другими базами данных
На данный момент, пожалуйста, обратитесь к [главе "сравнение BoltDB с
другими базами
@ -101,16 +104,20 @@ Tables](https://github.com/leo-yuriev/libfpta), aka ["Позитивные
Technologies](https://www.ptsecurity.ru).
#### Выражение признательности
### Выражение признательности
Говард Чу (Howard Chu) <hyc@openldap.org> - автор движка LMDB, от
Говард Чу (Howard Chu) <hyc@openldap.org> является автором движка LMDB, от
которого в 2015 году произошел MDBX.
Мартин Хеденфальк (Martin Hedenfalk) <martin@bzero.se> - автор кода
Мартин Хеденфальк (Martin Hedenfalk) <martin@bzero.se> является автором кода
`btree.c`, который использовался для начала разработки LMDB.
Основные свойства
=================
-----
Описание
========
## Ключевые свойства
_libmdbx_ наследует все ключевые возможности и особенности своего
прародителя
@ -165,8 +172,7 @@ Amplification Factor) и RAF (Read Amplification Factor) также Olog(N).
кэшированием. Всё необходимое штатно выполняет ядро ОС.
Доработки и усовершенствования относительно LMDB
================================================
## Доработки и усовершенствования относительно LMDB
1. Автоматическое динамическое управление размером БД согласно
параметрам задаваемым функцией `mdbx_env_set_geometry()`, включая шаг
@ -344,7 +350,6 @@ Amplification Factor) и RAF (Read Amplification Factor) также Olog(N).
Поэтому _libmdbx_ может немного отставать в тестах производительность от
LMDB, где используются именованные мьютексы.
--------------------------------------------------------------------------------
## Недостатки и Компромиссы
@ -402,7 +407,7 @@ LMDB, где используются именованные мьютексы.
> Подробности ниже.
#### Проблема долгих чтений
### Проблема долгих чтений
*Следует отметить*, что проблема "сборки мусора" так или иначе
существует во всех СУБД (Vacuum в PostgreSQL). Однако в случае _libmdbx_
и LMDB она проявляется более остро, прежде всего из-за высокой
@ -468,7 +473,7 @@ LMDB, где используются именованные мьютексы.
за счет эффективной работы [BBWC](https://en.wikipedia.org/wiki/BBWC)
при включении `LIFO RECLAIM` в _libmdbx_.
#### Сохранность данных в режиме асинхронной фиксации
### Сохранность данных в режиме асинхронной фиксации
При работе в режиме `WRITEMAP+MAPSYNC` запись измененных страниц
выполняется ядром ОС, что имеет ряд преимуществ. Так например, при крахе
приложения, ядро ОС сохранит все изменения.
@ -531,6 +536,118 @@ LMDB, где используются именованные мьютексы.
--------------------------------------------------------------------------------
Использование
=============
## Сборка
Для сборки на всех платформах кроме Windows вам потребуются не-дремучие
версии: GNU Make, [bash](https://ru.wikipedia.org/wiki/Bash), компиляторы C и C++ совместимые с GCC или CLANG.
Исторически сборка _libmdbx_ основывается на одном
[Makefile](https://ru.wikipedia.org/wiki/Makefile), что предполагает
разные рецепты сборки в зависимости от целевой платформы. В следующих
версиях планируется переход на использование
[CMake](https://ru.wikipedia.org/wiki/CMake), с отказом от поддержки
других инструментов.
#### Выгрузка DSO/DLL и деструкторы Thread-Local-Storage объектов
При сборке _libmdbx_ в виде разделяемой библиотеки, либо использовании
статической _libmdbx_ в составе другой динамической библиотеке,
желательно убедиться, что ваша система обеспечивает корректность вызова
деструкторов Thread-Local-Storage объектов при выгрузке динамических
библиотек.
Если это не так, то при выгрузке динамической библиотеки с _libmdbx_
внутри возможна либо утечка ресурсов, либо падения из-за вызова
деструкторов из уже выгруженного DSO/DLL объекта. Проблема может
проявляться только в многопоточном приложении, которое производит
выгрузку разделяемых динамических библиотек с кодом _libmdbx_ внутри,
после использования _libmdbx_. Заведомо известно, что TLS-деструкторы
корректно обслуживаются:
- На всех актуальных версиях Windows (Windows 7 и последующих).
- На системах c функцией
[`__cxa_thread_atexit_impl()`](https://sourceware.org/glibc/wiki/Destructor%20support%20for%20thread_local%20variables)
в стандартной библиотеке C. В том числе на системах с GNU libc версии
2.18 и выше.
- На системах с libpthread/ntpl из состава GNU libc с исправлением
ошибок [#21031](https://sourceware.org/bugzilla/show_bug.cgi?id=21031) и
[#21032](https://sourceware.org/bugzilla/show_bug.cgi?id=21032), либо
где нет подобных ошибок в реализации pthreads.
### Linux и другие платформы с GNU Make
Для сборки библиотеки достаточно выполнить `make all` в директории с
исходными текстами, а для выполнения базовых тестов `make check`.
Если установленный в система `make` не является GNU Make, то при попытке
сборки будет масса ошибок от make. В этом случае, возможно, вместо
`make` вам следует использовать `gmake`, либо даже `gnu-make` и т.п.
### FreeBSD и родственные платформы
Как правило, на таких системах по-умолчанию используется Berkeley Make.
А GNU Make вызывается командой `gmake` или может отсутствовать. Кроме
этого может отсутствовать [`bash`](https://ru.wikipedia.org/wiki/Bash).
Вам необходимо установить требуемые компоненты: GNU Make, bash,
компиляторы C и C++ совместимые с GCC или CLANG. После этого для сборки
библиотеки достаточно выполнить `gmake all` (или `make all`) в
директории с исходными текстами, а для выполнения базовых тестов `gmake
check` (или `make check`).
### Windows
Для сборки libmdbx_ для ОС Windows рекомендуется использовать [Microsoft
Visual Studio](https://ru.wikipedia.org/wiki/Microsoft_Visual_Studio),
но не такие инструменты как MinGW, MSYS или Cygwin. Для этого в набор
исходных кодов _libmdbx_ входят соответствующие файлы проектов
совместимые с Visual Studio 2015, Windows SDK для Windows 8.1 и более
поздними версиями. Достаточно открыть `mdbx.sln` и выполнить сборку
библиотеки.
Для сборки с более новыми версиями SDK или Visual Studio должно быть
достаточно выполнить "Retarget solution". Для сборки под старые версии
Windows (например Windows XP) или более старыми компиляторами вам
потребуется самостоятельно преобразовать или воссоздать файлы проектов.
Сборка посредством MinGW, MSYS или Cygwin потенциально возможна. Однако,
эти сценарии не тестируются и вероятно потребуют от вас доработки
`Makefile`. Следует отметить, что в _libmdbx_ предприняты усилия для
устранения runtime зависимостей от CRT и других библиотек Visual Studio.
Пример запуска базового сценария тестирования можно найти в
[CI-сценарии](appveyor.yml) для [AppVeyor](https://www.appveyor.com/).
Для выполнения [сценария длительного стохастического
тестирования](test/long_stochastic.sh) потребуется
[`bash`](https://ru.wikipedia.org/wiki/Bash), а само тестирование
рекомендуется выполнять с размещением тестовых данных на
[RAM-диске](https://ru.wikipedia.org/wiki/RAM-%D0%B4%D0%B8%D1%81%D0%BA).
### MacOS X
Актуальные [нативные сборочные
инструменты](https://ru.wikipedia.org/wiki/Xcode) для MacOS X включают
GNU Make, CLANG и устаревшую версию bash. Поэтому для сборки библиотеки
достаточно выполнить `make all` в директории с исходными текстами, а для
выполнения базовых тестов `make check`. Если же что-то пойдет не так, то
рекомендуется установить [Homebrew](https://brew.sh/) и попробовать ещё
раз.
Для выполнения [сценария длительного стохастического
тестирования](test/long_stochastic.sh) потребуется установка актуальной
(не устаревшей) версии [`bash`](https://ru.wikipedia.org/wiki/Bash). Для
этого рекомендуется установить [Homebrew](https://brew.sh/), а затем
выполнить `brew install bash`.
## Привязки к другим языкам
| Runtime | GitHub | Author |
| -------- | ------ | ------ |
| Java | [mdbxjni](https://github.com/castortech/mdbxjni) | [Castor Technologies](https://castortech.com/) |
| .NET | [mdbx.NET](https://github.com/wangjia184/mdbx.NET) | [Jerry Wang](https://github.com/wangjia184) |
--------------------------------------------------------------------------------
Сравнение производительности
============================
@ -542,9 +659,8 @@ SAMSUNG MZNTD512HAGL-000L1 (DXT23L0Q) 512 Гб.
сценарии тестирования [доступны на
github](https://github.com/pmwkaa/ioarena/tree/HL%2B%2B2015).
--------------------------------------------------------------------------------
### Интегральная производительность
## Интегральная производительность
Показана соотнесенная сумма ключевых показателей производительности в трёх
бенчмарках:
@ -571,7 +687,7 @@ github](https://github.com/pmwkaa/ioarena/tree/HL%2B%2B2015).
--------------------------------------------------------------------------------
### Масштабируемость чтения
## Масштабируемость чтения
Для каждого движка показана суммарная производительность при
одновременном выполнении запросов чтения/поиска в 1-2-4-8 потоков на
@ -581,7 +697,7 @@ github](https://github.com/pmwkaa/ioarena/tree/HL%2B%2B2015).
--------------------------------------------------------------------------------
### Синхронная фиксация
## Синхронная фиксация
- Линейная шкала слева и темные прямоугольники соответствуют количеству
транзакций в секунду, усредненному за всё время теста.
@ -607,7 +723,7 @@ github](https://github.com/pmwkaa/ioarena/tree/HL%2B%2B2015).
--------------------------------------------------------------------------------
### Отложенная фиксация
## Отложенная фиксация
- Линейная шкала слева и темные прямоугольники соответствуют количеству
транзакций в секунду, усредненному за всё время теста.
@ -638,7 +754,7 @@ _libmdbx_ при этом не ведет WAL, а передает весь ко
--------------------------------------------------------------------------------
### Асинхронная фиксация
## Асинхронная фиксация
- Линейная шкала слева и темные прямоугольники соответствуют количеству
транзакций в секунду, усредненному за всё время теста.
@ -668,7 +784,7 @@ _libmdbx_ при этом не ведет WAL, а передает весь ко
--------------------------------------------------------------------------------
### Потребление ресурсов
## Потребление ресурсов
Показана соотнесенная сумма использованных ресурсов в ходе бенчмарка в
режиме отложенной фиксации:

228
README.md
View File

@ -1,56 +1,51 @@
## The [repository now only mirrored on the Github](https://abf.io/erthink/libmdbx) due to illegal discriminatory restrictions for Russian Crimea and for sovereign crimeans.
### The [repository now only mirrored on the Github](https://abf.io/erthink/libmdbx) due to illegal discriminatory restrictions for Russian Crimea and for sovereign crimeans.
<!-- Required extensions: pymdownx.betterem, pymdownx.tilde, pymdownx.emoji, pymdownx.tasklist, pymdownx.superfences -->
---
-----
libmdbx
======================================
**Revised and extended descendant of [Symas LMDB](https://symas.com/lmdb/).**
Revised and extended descendant of [Lightning Memory-Mapped Database](https://en.wikipedia.org/wiki/Lightning_Memory-Mapped_Database) (aka _LMDB_).
Русскоязычная версия [здесь](README-RU.md).
_libmdbx_ is superior to LMDB in terms of features and reliability, not
inferior in performance. _libmdbx_ works on Linux, FreeBSD, MacOS X and
other systems compliant with POSIX.1-2008, but also support Windows as a
complementary platform.
The next version is under active non-public development, which will
radically change both the API and the database format. The goal of this
revolution is to provide a clearer and more reliable API, add more
features and new database properties.
*The Future will (be) [Positive](https://www.ptsecurity.com). Всё будет хорошо.*
*The Future will (be) positive.*
[![Build Status](https://travis-ci.org/leo-yuriev/libmdbx.svg?branch=master)](https://travis-ci.org/leo-yuriev/libmdbx)
[![Build status](https://ci.appveyor.com/api/projects/status/ue94mlopn50dqiqg/branch/master?svg=true)](https://ci.appveyor.com/project/leo-yuriev/libmdbx/branch/master)
[![Coverity Scan Status](https://scan.coverity.com/projects/12915/badge.svg)](https://scan.coverity.com/projects/reopen-libmdbx)
Русскоязычная версия этого README [здесь](README-RU.md).
## Project Status
_libmdbx_ works on Linux, FreeBSD, MacOS X and other systems compliant
with POSIX.1-2008, but also support Windows as a complementary platform.
The next version
([_devel_](https://github.com/leo-yuriev/libmdbx/tree/devel) branch) is
under active non-public development, i.e. API and set of features are
volatile. The goal of this revolution is to provide a clearer and more
reliable API, adding set of features and a new database properties.
Don't miss libmdbx for other runtimes:
| Runtime | GitHub | Author |
| ------------- | ------------- | ------------- |
| Java | [mdbxjni](https://github.com/castortech/mdbxjni) | [Castor Technologies](https://castortech.com/) |
| .NET | [mdbx.NET](https://github.com/wangjia184/mdbx.NET) | [Jerry Wang](https://github.com/wangjia184) |
## Table of Contents
- [Overview](#overview)
- [Comparison with other databases](#comparison-with-other-databases)
- [History & Acknowledgments](#history)
- [Description](#description)
- [Key features](#key-features)
- [Improvements over LMDB](#improvements-over-lmdb)
- [Gotchas](#gotchas)
- [Problem of long-time reading](#problem-of-long-time-reading)
- [Durability in asynchronous writing mode](#durability-in-asynchronous-writing-mode)
- [Usage](#usage)
- [Building](#building)
- [Bindings](#bindings)
- [Performance comparison](#performance-comparison)
- [Integral performance](#integral-performance)
- [Read scalability](#read-scalability)
- [Sync-write mode](#sync-write-mode)
- [Lazy-write mode](#lazy-write-mode)
- [Async-write mode](#async-write-mode)
- [Cost comparison](#cost-comparison)
-----
## Contents
- [Overview](#overview)
- [Comparison with other DBs](#comparison-with-other-dbs)
- [History & Acknowledgments](#history)
- [Main features](#main-features)
- [Improvements over LMDB](#improvements-over-lmdb)
- [Gotchas](#gotchas)
- [Problem of long-time reading](#problem-of-long-time-reading)
- [Durability in asynchronous writing mode](#durability-in-asynchronous-writing-mode)
- [Performance comparison](#performance-comparison)
- [Integral performance](#integral-performance)
- [Read scalability](#read-scalability)
- [Sync-write mode](#sync-write-mode)
- [Lazy-write mode](#lazy-write-mode)
- [Async-write mode](#async-write-mode)
- [Cost comparison](#cost-comparison)
## Overview
_libmdbx_ is an embedded lightweight key-value database engine oriented
for performance.
@ -76,7 +71,7 @@ _libmdbx_ uses [B+Trees](https://en.wikipedia.org/wiki/B%2B_tree) and
doesn't use [WAL](https://en.wikipedia.org/wiki/Write-ahead_logging)
which might be a caveat for some workloads.
### Comparison with other DBs
### Comparison with other databases
For now please refer to [chapter of "BoltDB comparison with other
databases"](https://github.com/coreos/bbolt#comparison-with-other-databases)
which is also (mostly) applicable to MDBX.
@ -93,16 +88,19 @@ conference](http://www.highload.ru/2015/abstracts/1831.html).
Since early 2017 _libmdbx_ is used in [Fast Positive Tables](https://github.com/leo-yuriev/libfpta),
and development is funded by [Positive Technologies](https://www.ptsecurity.com).
#### Acknowledgments
Howard Chu <hyc@openldap.org> - the author of LMDB, from which
### Acknowledgments
Howard Chu <hyc@openldap.org> is the author of LMDB, from which
originated the MDBX in 2015.
Martin Hedenfalk <martin@bzero.se> - the author of `btree.c` code, which
Martin Hedenfalk <martin@bzero.se> is the author of `btree.c` code, which
was used for begin development of LMDB.
-----
Main features
=============
Description
===========
## Key features
_libmdbx_ inherits all features and characteristics from
[LMDB](https://en.wikipedia.org/wiki/Lightning_Memory-Mapped_Database):
@ -147,10 +145,8 @@ without freezing writers.
9. No additional memory management, all done by basic OS services.
--------------------------------------------------------------------------------
Improvements over LMDB
======================
## Improvements over LMDB
1. Automatic dynamic DB size management according to the parameters
specified by `mdbx_env_set_geometry()` function. Including
@ -308,7 +304,6 @@ against incompetent user actions (aka
_libmdbx_ may be a little lag in performance tests from LMDB where a
named mutexes are used.
--------------------------------------------------------------------------------
## Gotchas
@ -357,7 +352,7 @@ of data.
> Details below.
#### Problem of long-time reading
### Problem of long-time reading
Garbage collection problem exists in all databases one way or another
(e.g. VACUUM in PostgreSQL). But in _libmdbx_ and LMDB it's even more
discernible because of high transaction rate and intentional internals
@ -384,7 +379,7 @@ writing data to persistent storage.
operations and the `LIFO RECLAIM` mode which addresses performance
degradation.
#### Durability in asynchronous writing mode
### Durability in asynchronous writing mode
In `WRITEMAP+MAPSYNC` mode updated (aka dirty) pages are written to
persistent storage by the OS kernel. This means that if the application
fails, the OS kernel will finish writing all updated data to disk and
@ -434,6 +429,119 @@ after a system crash, i.e. like the LMDB.
Next version of _libmdbx_ will be automatically create steady commit
points in async-write mode upon completion transfer data to the disk.
--------------------------------------------------------------------------------
Usage
=====
## Building
To build on all platforms except Windows the prerequirements are the
same: non-obsolete versions of GNU Make,
[bash](https://en.wikipedia.org/wiki/Bash_(Unix_shell)), C and C++
compilers compatible with GCC or CLANG. On Windows you will need only :
Microsoft Visual Studio 2015 or later, Windows SDK for Windows 8 or
later.
Historically, the libmdbx builing is based on single
[Makefile](https://en.wikipedia.org/wiki/Makefile) which assumes
different recipes depending on target platform. In the next versions, it
is planned to switch to [CMake](https://en.wikipedia.org/wiki/CMake),
with the refusal to support other tools.
#### DSO/DLL unloading and destructors of Thread-Local-Storage objects
When building _libmdbx_ as a shared library or use static _libmdbx_ as a
part of another dynamic library, it is advisable to make sure that your
system ensures the correctness of the call destructors of
Thread-Local-Storage objects when unloading dynamic libraries'.
If this is not the case, then unloading a dynamic-link library with
_libmdbx_ code inside, can result in either a resource leak or a crash
due to calling destructors from an already unloaded DSO/DLL object. The
problem can only manifest in a multithreaded application, which makes
the unloading of shared dynamic libraries with _libmdbx_ code inside,
after using _libmdbx_. It is known that TLS-destructors are properly
maintained in the following cases:
- On all modern versions of Windows (Windows 7 and later).
- On systems with the
[`__cxa_thread_atexit_impl()`](https://sourceware.org/glibc/wiki/Destructor%20support%20for%20thread_local%20variables)
function in the standard C library, including systems with GNU libc
version 2.18 and later.
- On systems with libpthread/ntpl from GNU libc with bug fixes
[#21031](https://sourceware.org/bugzilla/show_bug.cgi?id=21031) and
[#21032](https://sourceware.org/bugzilla/show_bug.cgi?id=21032), or
where there are no similar bugs in the pthreads implementation.
### Linux and other platforms with GNU Make
To build the library it is enough to execute `make all` in the directory
of source code, and `make check` for execute the basic tests.
If the `make` installed on the system is not GNU Make, there will be a
lot of errors from make when trying to build. In this case, perhaps you
should use `gmake` instead of `make`, or even `gnu-make`, etc.
### FreeBSD and related platforms
As a rule, in such systems, the default is to use Berkeley Make. And GNU
Make is called by the gmake command or may be missing. In addition,
[bash](https://en.wikipedia.org/wiki/Bash_(Unix_shell)) may be absent.
You need to install the required components: GNU Make, bash, C and C++
compilers compatible with GCC or CLANG. After that, to build the
library, it is enough execute `gmake all` (or `make all`) in the
directory with source code, and `gmake check` (or `make check`) to run
the basic tests.
### Windows
For building _libmdbx_ on Windows the [Microsoft Visual
Studio](https://en.wikipedia.org/wiki/Microsoft_Visual_Studio) is
recommended, but not tools such as MinGW, MSYS, or Cygwin. To do this,
the libmdbx source code includes the set of appropriate project files
that are compatible with Visual Studio 2015, the Windows SDK for Windows
8.1, and later. Just open `mdbx.sln` in Visual Studio and build the
library.
To build with newer versions of the SDK or Visual Studio, it should be
sufficient to execute "Retarget solution". To build for older versions
of Windows (such as Windows XP) or by older compilers, you will need to
convert or recreate the corresponding project files yourself.
Building by MinGW, MSYS or Cygwin is potentially possible. However,
these scripts are not tested and will probably require you to modify the
Makefile. It should be noted that in _libmdbx_ was efforts to resolve
runtime dependencies from CRT and other libraries Visual Studio.
An example of running a basic test script can be found in the
[CI-script](appveyor.yml) for [AppVeyor](https://www.appveyor.com/). To
run the [long stochastic test scenario](test/long_stochastic.sh),
[bash](https://en.wikipedia.org/wiki/Bash_(Unix_shell)) is required, and
the such testing is recommended with place the test data on the
[RAM-disk](https://en.wikipedia.org/wiki/RAM_drive).
### MacOS X
Current [native build tools](https://en.wikipedia.org/wiki/Xcode) for
MacOS X include GNU Make, CLANG and an outdated version of bash.
Therefore, to build the library, it is enough to run `make all` in the
directory with source code, and run `make check` to execute the base
tests. If something goes wrong, it is recommended to install
[Homebrew](https://brew.sh/) and try again.
To run the [long stochastic test scenario](test/long_stochastic.sh), you
will need to install the current (not outdated) version of
[bash](https://en.wikipedia.org/wiki/Bash_(Unix_shell)). To do this, we
recommend that you install [Homebrew](https://brew.sh/) and then execute
`brew install bash`.
## Bindings
| Runtime | GitHub | Author |
| -------- | ------ | ------ |
| Java | [mdbxjni](https://github.com/castortech/mdbxjni) | [Castor Technologies](https://castortech.com/) |
| .NET | [mdbx.NET](https://github.com/wangjia184/mdbx.NET) | [Jerry Wang](https://github.com/wangjia184) |
--------------------------------------------------------------------------------
Performance comparison
@ -444,9 +552,7 @@ and multiple [scripts](https://github.com/pmwkaa/ioarena/tree/HL%2B%2B2015)
runs on Lenovo Carbon-2 laptop, i7-4600U 2.1 GHz, 8 Gb RAM,
SSD SAMSUNG MZNTD512HAGL-000L1 (DXT23L0Q) 512 Gb.
--------------------------------------------------------------------------------
### Integral performance
## Integral performance
Here showed sum of performance metrics in 3 benchmarks:
@ -472,7 +578,7 @@ Here showed sum of performance metrics in 3 benchmarks:
--------------------------------------------------------------------------------
### Read Scalability
## Read Scalability
Summary performance with concurrent read/search queries in 1-2-4-8
threads on 4 CPU cores machine.
@ -481,7 +587,7 @@ threads on 4 CPU cores machine.
--------------------------------------------------------------------------------
### Sync-write mode
## Sync-write mode
- Linear scale on left and dark rectangles mean arithmetic mean
transactions per second;
@ -503,7 +609,7 @@ and after full run the database contains 10,000 small key-value records.
--------------------------------------------------------------------------------
### Lazy-write mode
## Lazy-write mode
- Linear scale on left and dark rectangles mean arithmetic mean of
thousands transactions per second;
@ -530,7 +636,7 @@ records.
--------------------------------------------------------------------------------
### Async-write mode
## Async-write mode
- Linear scale on left and dark rectangles mean arithmetic mean of
thousands transactions per second;
@ -554,7 +660,7 @@ and after full run the database contains 10,000 small key-value records.
--------------------------------------------------------------------------------
### Cost comparison
## Cost comparison
Summary of used resources during lazy-write mode benchmarks: