我正在使用C API通过RocksDB。
我有一个测试程序,打开一个数据库,进行1000次写入(在启动写入和回调之间收集时间数据),进行1000次读取,然后关闭。
这个程序可以工作。平均写入时间约为1ms。
我修改了测试程序,通过以下方式打开写同步
rocksdb_writeoptions_set_sync(wri_u, 1);
然后我再次运行了程序。每次写操作的平均时间约为8ms。
到目前为止,一切都很好。
但是,我接着在两个版本的程序上运行了strace以验证是否调用了fsync()或fdatasync()或msync()。
不进行同步的程序显示了4次fsync()、2次fdatasync()和0次msync()。这很合理。
...但是同步版本的程序显示了相同的4, 2和0。这很奇怪!令人惊讶!让人担忧!
同步版本确实显示出与非同步版本的两个有趣的差异:(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?因为strace中既没有fsync()也没有msync()
谢谢。