Правильно ли я заставляю RocksDB использовать fsync?Ни fsync (), ни msync () не отображаются в strace - PullRequest
0 голосов
/ 04 декабря 2018

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

Спасибо.

1 Ответ

0 голосов
/ 06 декабря 2018

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

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

...