Я использую RocksDB через C API.
У меня есть тестовая программа, которая открывает базу данных, делает 1000 записей (сбор данных о времени между началом записи и обратным вызовом), делает 1000 операций чтения и закрытиявниз.
Это работает.Среднее время выполнения записи составляет около 1 мс.
Я изменил тестовую программу, чтобы включить синхронизацию записи через эту
rocksdb_writeoptions_set_sync(wri_u, 1);
, и снова запустил ее.Среднее время выполнения записи составляет около 8 мс.
Пока все хорошо.
ОДНАКО тогда я запустил strace для обеих версий программы, чтобы убедиться, что fsync () или fdatasync ()или вызывается msync ().
Программа без синхронизации отображает 4 вызова функции fsync (), 2 вызова функции fdatasync () и 0 функции msync ().Разумно.
... но версия программы синхронизации показывает те же 4, 2 и 0. Странно!Удивительно!Беспокойство!
Синхронизирующая версия показывает 2 интересных дельты из несинхронизированной версии: (i) 2 вызова функции nanosleep () на запись, (ii) увеличение времени, затрачиваемого на mmap () на 80%.
Одна из теорий о том, что msync () [или заменитель] на самом деле реализована в терминах nanosleep ()?
Это включеноLinux для рабочего стола 16.04
uname -a
Linux mithril 4.4.0-139-generic #165-Ubuntu SMP Wed Oct 24 10:58:50 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
В любом случае, мой вопрос в отношении строки темы:
Правильно ли я заставляю RocksDB использовать fsync?... потому что ни fsync (), ни msync () не отображаются в strace
Спасибо.