3

我通过 C API 使用 RocksDB。

我有一个测试程序,它打开一个数据库,执行 1,000 次写入(在开始写入和回调之间收集时间数据),执行 1,000 次读取,然后关闭。

这行得通。写入的平均时间约为 1 毫秒。

我修改了测试程序以通过这个打开写同步

rocksdb_writeoptions_set_sync(wri_u, 1);

并再次运行它。写入的平均时间约为 8 毫秒。

到目前为止,一切都很好。

但是,我随后在程序的两个版本上运行 strace 以验证是否调用了 fsync() 或 fdatasync() 或 msync()。

no-sync 程序显示 4 次 fsync() 调用,2 次 fdatasync() 和 0 次 msync()。合理的。

...但程序的同步版本显示相同的 4、2 和 0。奇怪!奇怪!令人担忧!

同步版本确实显示了与非同步版本相比的 2 个有趣的增量:(i) 每次写入对 nanosleep() 的 2 次调用,(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

谢谢。

4

1 回答 1

1

是的,这是打开 fsync() 的正确方法。

问题是strace必须与 -f 标志一起使用来跟踪新线程中的系统调用......并且 RocksDB 正在其他线程中进行所有同步。

于 2018-12-05T22:19:18.447 回答