This repository has been archived by the owner on Sep 22, 2022. It is now read-only.
-
-
Notifications
You must be signed in to change notification settings - Fork 112
Incoherent flaw of Linux' unified page/buffer cache #269
Labels
not-a-bug
external issue and/or not a libmdbx's bug
Comments
A description in English may be provided later. |
Related to #67. |
For now, just-in-case, had release a painless workaround for kernels < 5.4 |
Reproduced on the 5.10 (linux-image-5.10.0-0.bpo.9-amd64/buster-backports,now 5.10.70-1~bpo10+1 amd64). |
Reproduced on the |
|
This was referenced Mar 16, 2022
Good news:
Bad news:
Some technical details:
|
Sign up for free
to subscribe to this conversation on GitHub.
Already have an account?
Sign in.
Исходя из наблюдаемого в серии экспериментов, можно сделать вывод, что есть некий дефект «некогерентности» в unified page cache ядра Linux (как минимум в linux-image-4.19.0-18-amd64, 4.19.208-1), который проявляется в купе при взаимодействии с остальными компонентами (io-scheduler, virtual memory management, драйвер диска/контроллера).
Из-за этого некоторая часть страниц записанная одним процессом, становится видимой другому процессу с задержкой и неравномерно/неодновременно.
В результате, процесс-читатель БД следуя по ссылкам (meta-page => maindb-root => maindb_leaf => subdb-root => ...) иногда видит смесь страниц измененных в последней транзакции и устаревших данных.
Всё вышеописанное работает при условии «когерентного» unified page cache внутри ядра ОС. Суть в том, что во всех случаях ядру нет смысла иметь в памяти более одной копии каждой страницы отображенного файла БД. Поэтому, как только кто-то пишет в этот файл через файловый дескриптор, эти изменения сразу видны всем процессам отобразившим файл БД в память:
write()
в писателе.В наблюдаемых случаях, очень-очень похоже, что происходит следующее:
MDBX_WRITEMAP
, т.е. данные пишутся через файловый дескриптор, но без последующего fdatasync();Был проведен эксперимент с включением режима
MDBX_WRITEMAP
. При этом данные изменяются непосредственно в памяти, соответствующие страницы при необходимости подгружаются в unified page cache, меняются в памяти, помечаются «грязными» и уже после могут быть направлены к очереди к io-планировщику. Это устранило проблему и подтвердило гипотезу,но по-хорошему ребуется перепроверка(многократно перепроверено и подтверждено).Пока проблема была зафиксирована только на ядре 4.19 и ни разу не была замечена на ядрах 5.4, 5.8, 5.11 и 5.13. Поэтому, предположительно, соответствующий баг/недочет в ядре уже устранен в актуальных ядрах Linux.Многократно перепроверено и подтверждено на всех актуальных ядрах Linux, но проблема воспроизводится (в том числе собственными тестами libmdbx) только если на машине параллельно работает нагруженный SIEM.The text was updated successfully, but these errors were encountered: