Я использую 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
Спасибо.