197 Commits

Author SHA1 Message Date
Леонид Юрьев (Leonid Yuriev)
e6af7d7c53 mdbx: переработка инициализации, проверки и импорта dbi-хендлов в транзакциях.
Ранее инициализация в транзакциях структур данных, связанных с
dbi-хендлами и subDb, выполнялась непосредственно при запуске
транзакций. Что в сценариях с большим кол-вом dbi-дексприторов (например
libfpta) порождало заметные накладные расходы, которые расли линейно от
общего кол-ва открытых subDb, а не от реально используемых в транзакции.
При использовании одной-двух сотен хендлов, при старте каждой транзакции
могли копироваться и/или обнуляться десятки килобайт. Теперь этот
недостаток устранен.

Изменена схема инициализации, валидации и импорта хендлов открытых после
старта транзакции:

1) Инициализация теперь выполняется отложенна, а при старте транзации
   обнуляется только массив с однобайтовыми статустами dbi-хендлов.
   При этом доступнва опция сборки `MDBX_ENABLE_DBI_SPARSE`, при активации
   которой используется битовая карты, что снижает объем инициализации
   при старте транзакции в 8 раз (CHAR_BIT).

2) Переработана валидация dbi-хендлов на входах API, с уменьшением кол-ва
   проверок и ветвлений до теоретического минимума.

3) Переработ импорт dbi-хендов открытых после старта транзакци, теперь
   при этом не захватывается мьютекс.
2023-11-11 12:29:10 +03:00
Леонид Юрьев (Leonid Yuriev)
4b79d46d38 mdbx: удаление поля mt_dbxs из транзакции.
Явного выигрыша или проигрыша в производительности тут нет. Но теперь
меньше алиасинга указателей и чуть меньше полей в транзакциях.
2023-11-11 12:29:10 +03:00
Леонид Юрьев (Leonid Yuriev)
f317170706 mdbx: переименование внутренних полей и макросов для улучшения читаемости кода. 2023-11-11 12:29:10 +03:00
Леонид Юрьев (Leonid Yuriev)
81f386f831 mdbx: перемещение полей внутри MDBX_txn и MDBX_env.
В текущем понимании так префетчер ЦПУ может быть чуть более эффективным
и чуть меньше зазоров для выравнивания.
2023-11-11 12:29:10 +03:00
Леонид Юрьев (Leonid Yuriev)
253a56206b mdbx: переработка и перенос функционала утилиты mdbx_chk внутрь библиотеки. 2023-10-23 20:25:03 +03:00
Леонид Юрьев (Leonid Yuriev)
f0d523c507 mdbx: дополнение API функциями lock/unlock/upgrade/downgrade основной блокировки. 2023-10-23 20:25:03 +03:00
Леонид Юрьев (Leonid Yuriev)
1aead6869a mdbx: костыль для глушения/игнорирования EDEADLK в ряде сценариев при использовании Valgrind или ASAN.
Достаточно запутанно:

 - Для полноценного контроля при использовании Valgrind или ASAN
   требуется закрашивать/отравлять отображение файла БД выше границы
   распределенных страниц.

 - Производить такое подкрашивание/отравление необходимо в синхронизации
   с пишущими транзакциями и запросами на изменение геометрии, в том числе
   при изменении размера БД и/или геометрии другим процессом.

 - Для такой синхронизации логично и проще всего использовать основной
   мьютекс/механизм блокировки пишущих транзакций, что и происходит внутри
   txn_valgrind().

 - Однако, в этой схеме может возникать ошибка EDEADLK, когда
   txn_valgrind() вызывается при завершении читающей транзакции
   выполняющейся с дополнительной блокировкой пишущих транзакций.

 - Как таковая ошибка EDEADLK при этом проблем не создаёт и поэтому
   просто игнорируется. Но утилита mdbx_chk при работе в кооперативном
   (не эксклюзивном) режиме чтения-записи использует именно такой сценарий,
   а возникающую при этом ошибку EDEADLK засчитывает как проблему при
   проверке.

 = В результате, при использовании Valgrind или ASAN утилита mdbx_chk
   запущенная с опциями `-wc` всегда завершается неудачей из-за как минимум
   одной проблемы в ходе проверки. Что внешне выглядит как
   недочет/ошибка/регресс и создает проблемы при автоматизированном
   тестировании.

Добавленный костыль использует atomic-счетчик, который инкремируется до
и декремируется после попытки захвата блокировки изнутри txn_valgrind().
В свою очередь, код обрабатывающий ошибку захвата блокировки, игнорирует
EDEADLK при ненулевом значении счетчика. Активируется костыль только при
сборке с поддержкой Valgrind или включенном ASAN, и не оказывает
никакого влияния в остальных случаях.
2023-10-07 23:37:51 +03:00
Леонид Юрьев (Leonid Yuriev)
99c9bc2411 mdbx: использование clang-format-16. 2023-04-19 11:02:53 +03:00
Леонид Юрьев (Leonid Yuriev)
25e958f081 mdbx: устранение всех предупреждений статического анализатора MSVC (все несущественные или ложные). 2023-02-11 00:26:06 +03:00
Леонид Юрьев (Leonid Yuriev)
1684d17b0f mdbx-windows: поддержка char-версии mdbx_env_get_path(). 2023-02-11 00:26:06 +03:00
Леонид Юрьев (Leonid Yuriev)
c01f025bfa mdbx: обновление года на 2023. 2023-01-16 16:32:02 +03:00
Леонид Юрьев (Leonid Yuriev)
525c4a55a4 mdbx: fix English typos.
Thanks to Dimitris Apostolou <dimitris.apostolou@icloud.com>
2023-01-10 14:16:08 +03:00
Леонид Юрьев (Leonid Yuriev)
c6b73c8a24 mdbx: добавление me_madv_threshold и рефакторинг/упрощение.
Для уменьшения затрат на MDBX_SHRINK_ALLOWED.
2023-01-03 20:20:03 +03:00
Леонид Юрьев (Leonid Yuriev)
f0c2927fc7 mdbx: перенос LRU-отметок в теневые страницы по отрицательному смещению.
Это позволяет избавиться от повторного поиска в "гзязном" списке
страниц, уже находящихся в стеке курсора, для обнлвления LRU-отметок.
2023-01-03 19:28:11 +03:00
Леонид Юрьев (Leonid Yuriev)
bcddeaba9f mdbx: изменение CMP2INT().
Решил вернуться к старому варианту. Вроде-бы все актуальные компиляторы
ведут себя с ним прилично (не хуже), а некоторые лучше.
2023-01-03 19:28:11 +03:00
Леонид Юрьев (Leonid Yuriev)
be05037906 mdbx: перемещение debug/assert-макросов перед атомиками. 2023-01-03 19:28:11 +03:00
Леонид Юрьев (Leonid Yuriev)
a06fe4f168 mdbx: переработка контроля "некогерентности" для уменьшения накладных расходов.
Существует проблема https://libmdbx.dqdkfa.ru/dead-github/issues/269,
которая проявляется только при специфической неупорядоченности внутри
ядра ОС, когда страницы, записанные в файл отображенный в память,
становятся видны в памяти посредством работы unified page cache:

 - если записанная последней мета-страница "обгоняет" ранее записанные,
   т.е. когда записанное в файл позже становится видимым в отображении
   раньше, чем записанное ранее.

Теперь, вместо постоянной полной сверки записываемых страниц,
выполняется легковесная проверка при старте транзакций, с переключением
в режим "как раньше" при обнаружении проблемы.

В результате, в некоторых сценариях возвращается 5-10%
производительности, а в отдельных синтетических тестах до 30%.
2022-12-27 11:50:28 +03:00
Леонид Юрьев (Leonid Yuriev)
686145ec2e mdbx: рефакторинг с удалением cursor_spill() и MDBX_NOSPILL. 2022-12-27 11:50:23 +03:00
Леонид Юрьев (Leonid Yuriev)
fe55f25665 mdbx: использование msync(MS_ASYNC) для спиллинга в режиме MDBX_WRITEMAP вне зависимости от MDBX_AVOID_MSYNC и MDBX_MMAP_USE_MS_ASYNC. 2022-12-22 00:48:41 +03:00
Леонид Юрьев (Leonid Yuriev)
54b15d7e41 mdbx: определение in-core БД (в tmpfs/ramfs/mfs) с отключением prefault-write.
Это вынужденный читинг для "починки" сравнительных бенчмарков при
размещении БД в /dev/shm.

Проблема в том, что актуальные ядра Linux для файлов размещенных в tmpfs
возвращают mincore=false. В результате, в простейших бенчмарках видно
двукратное снижение производительности, просто из-за вызовов write()
выполняемых для prefault.

Из-за этого, в таких синтетических тестах, новая libmdbx становится
существенно медленнее предыдущих версий, в том числе LMDB.
2022-12-12 18:54:03 +03:00
Леонид Юрьев (Leonid Yuriev)
1bb41ee8fc mdbx: отключение "экономии последовательностей" посредством MDBX_ENABLE_SAVING_SEQUENCES=0. 2022-12-09 18:07:16 +03:00
Леонид Юрьев (Leonid Yuriev)
a572902fde mdbx: автоматическая установка rp_augment_limit в "золотое сечение" от размера БД. 2022-12-09 18:07:16 +03:00
Леонид Юрьев (Leonid Yuriev)
fd7aaf5f35 mdbx: добавление ошибки MDBX_BACKLOG_DEPLETED и соответствующей логики в page_alloc_slowpath(). 2022-12-09 18:07:16 +03:00
Леонид Юрьев (Leonid Yuriev)
4b27c4c7c9 mdbx: предварительное вычисление me_maxgc_per_branch. 2022-12-08 16:29:18 +03:00
Леонид Юрьев (Leonid Yuriev)
3a77af7d8a mdbx: оптимизация поддержки сортировки в dpl_append(). 2022-12-07 00:06:07 +03:00
Леонид Юрьев (Leonid Yuriev)
a9163f6307 mdbx: доработка внутренних LRU-отметок для аккуратного спиллинга огромных транзакций. 2022-12-07 00:06:07 +03:00
Леонид Юрьев (Leonid Yuriev)
a772a9d3e1 mdbx: добавление проверки посредством mincore() с кэшированием присутствия страниц в памяти (опция сборки MDBX_ENABLE_MINCORE). 2022-12-05 10:41:05 +03:00
Леонид Юрьев (Leonid Yuriev)
be3ff92772 mdbx: предотвращение бесполезных page-faults в режиме MDBX_WRITEMAP (опция сборки MDBX_ENABLE_PREFAULT). 2022-12-05 10:03:00 +03:00
Леонид Юрьев (Leonid Yuriev)
dc27d5d30a mdbx: рефакторинг с формированием page_alloc_finalize() и сокрашением метрик MDBX_ENABLE_PROFGC. 2022-12-04 18:24:30 +03:00
Леонид Юрьев (Leonid Yuriev)
23d236f70e mdbx: добавление MDBX_opt_writethrough_threshold и сопутствующие доработки. 2022-12-04 13:41:50 +03:00
Леонид Юрьев (Leonid Yuriev)
01a39e7dc2 mdbx: добавление и использование ptr_disp() и ptr_dist().
Для уменьшения кастинга типов указателей и потенциальной нагрузки оптимизатора/кодогенератора алиасингом.
2022-11-29 02:50:34 +03:00
Леонид Юрьев (Leonid Yuriev)
c521a21f05 mdbx: перемещение mp_next в заголовке страницы для отделения от mp_txnid. 2022-11-28 23:56:42 +03:00
Леонид Юрьев (Leonid Yuriev)
c5ddf12602 mdbx: увеличение лимита MDBX_TXL_MAX до 2^26. 2022-11-28 15:51:36 +03:00
Леонид Юрьев (Leonid Yuriev)
3757eb72f7 mdbx: экономия последовательностей при выделении одиночных страниц. 2022-11-28 15:51:36 +03:00
Леонид Юрьев (Leonid Yuriev)
da023657f5 mdbx: переработка внутренних флагов связанных с выделением страниц из GC. 2022-11-23 00:56:09 +03:00
Леонид Юрьев (Leonid Yuriev)
6c840cf58e mdbx: подсчет грязных страниц в режиме MDBX_WRITEMAP для статистики. 2022-11-19 19:36:30 +03:00
Леонид Юрьев (Leonid Yuriev)
c270306580 mdbx-windows: уточнение проверок макросов MinGW и устранение предупреждений. 2022-11-08 20:39:44 +03:00
Леонид Юрьев (Leonid Yuriev)
f0c6aa4646 mdbx: workaround for false-positives from Valgrind bug. 2022-11-07 00:47:16 +03:00
Леонид Юрьев (Leonid Yuriev)
f680c99116 mdbx: переделка page_alloc_slowpath() с добавлением профилирования GC. 2022-11-07 00:44:37 +03:00
Леонид Юрьев (Leonid Yuriev)
47e7a646fd mdbx: переделка отслеживания mlocks для игнорирования EINVAL от madvise(). 2022-11-05 14:06:00 +03:00
Леонид Юрьев (Leonid Yuriev)
28e2e31949 mdbx: выделение специфической инициализации в osal_ctor(). 2022-11-02 11:09:32 +03:00
Леонид Юрьев (Leonid Yuriev)
d661d4bac7 mdbx: добавление mdbx_env_warmup() 2022-10-24 11:37:57 +03:00
Леонид Юрьев (Leonid Yuriev)
4e95a079ee mdbx: переименование MDBX_COMMIT_PAGES в MDBX_AUXILARY_IOV_MAX. 2022-10-22 11:12:52 +03:00
Леонид Юрьев (Leonid Yuriev)
e5fc056035 mdbx: изменение формата LCK и семантики некоторых внутренних полей.
Изменение формата LCK-файла означает что версии libmdbx использующие
разный формат не смогут работать с одной БД одновременно, а только
поочередно (LCK-файл переписывается при открытии первым открывающим БД
процессом).

1. Поле mti_unsynced_pages теперь 64-битное (чтобы не контролировать
переполнение) и перемещено для соблюдения выравнивания.

2. Поле mti_sync_timestamp переименовано в mti_eoos_timestamp
одновременно со сменой семантики. Теперь время отсчитывается не от
момента сброса данных на диск, а с момента входа в «грязное» состояние.

Скорее всего, текущая версия формата LCK не окончательная
и изменится до релиза.
2022-10-12 21:25:18 +03:00
Леонид Юрьев (Leonid Yuriev)
98e29fe628 mdbx-windows: UNICODE-зависимое определение макросов MDBX_DATANAME, MDBX_LOCKNAME и MDBX_LOCK_SUFFIX. 2022-10-10 13:56:57 +03:00
Леонид Юрьев (Leonid Yuriev)
db72763de0 mdbx: отключение учета грязных страниц в не требующих этого режимах.
В режиме MDBX_WRITEMAP с опцией сборки MDBX_AVOID_MSYNC=0 отслеживание грязных страниц не требуется.
Эта доработка устраняет еще одну  из недоделок (пункт в TODO).
2022-10-10 13:56:57 +03:00
Леонид Юрьев (Leonid Yuriev)
c17617b816 mdbx: облегченная assert_fail() для не-отладочных сборок. 2022-10-10 13:56:57 +03:00
Леонид Юрьев (Leonid Yuriev)
66f2e3d596 mdbx: добавление в API функций mdbx_limits_pairsize4page_max() и mdbx_limits_valsize4page_max() с сопутствующими доработками. 2022-10-10 13:56:57 +03:00
Леонид Юрьев (Leonid Yuriev)
143e3dfb77 mdbx: преимущественное использование size_t для уменьшения накладных расходов на платформе Эльбрус. 2022-10-10 13:56:57 +03:00
Леонид Юрьев (Leonid Yuriev)
474391c83c mdbx: поддержка асинхронного ввода-вывода для Windows и подготовка к io_ring (объединённые коммиты и исправления). 2022-10-06 20:35:07 +03:00