我通过 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
谢谢。