Правильно ли я заставляю RocksDB использовать fsync? Ни fsync(), ни msync() не отображаются в strace

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

Спасибо.


person TJIC    schedule 04.12.2018    source источник


Ответы (1)


Да, это правильный способ включения fsync().

Проблема в том, что strace нужно использовать с флагом -f для отслеживания системных вызовов в новых потоках... и RocksDB выполняла всю синхронизацию в других потоках.

person TJIC    schedule 05.12.2018