mdbx: переработка контроля "некогерентности" для уменьшения накладных расходов.

Существует проблема https://libmdbx.dqdkfa.ru/dead-github/issues/269,
которая проявляется только при специфической неупорядоченности внутри
ядра ОС, когда страницы, записанные в файл отображенный в память,
становятся видны в памяти посредством работы unified page cache:

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

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

В результате, в некоторых сценариях возвращается 5-10%
производительности, а в отдельных синтетических тестах до 30%.
This commit is contained in:
Леонид Юрьев (Leonid Yuriev)
2022-12-25 19:56:50 +03:00
parent 0498114469
commit a06fe4f168
2 changed files with 81 additions and 6 deletions

View File

@@ -622,6 +622,11 @@ typedef struct pgop_stat {
MDBX_atomic_uint64_t prefault; /* Number of prefault write operations */
MDBX_atomic_uint64_t mincore; /* Number of mincore() calls */
MDBX_atomic_uint32_t
incoherence; /* number of https://libmdbx.dqdkfa.ru/dead-github/issues/269
caught */
MDBX_atomic_uint32_t reserved;
/* Статистика для профилирования GC.
* Логически эти данные может быть стоит вынести в другую структуру,
* но разница будет сугубо косметическая. */