我通过C使用RocksDB。
我有一个测试程序,它打开一个数据库,执行1,000次写入(从写开始到回调之间收集定时数据),执行1,000次读取,并关闭。
这个很管用。写一篇文章的平均时间大约是1ms。
我修改了测试程序,通过以下方式打开写同步
rocksdb_writeoptions_set_sync(wri_u, 1);
然后再运行一次。写一篇文章的平均时间大约是8ms。
到现在为止还好。
但是,我随后在两个版本的程序上运行strace,以验证fsync()或fdat异步()或msync()是否正在被调用。
非同步程序显示fsync()、fdatasync()和msync()的4个调用。合情合理。
...but程序的同步版本显示相同的4、2和0。奇怪!令人惊讶!担心!
同步版本确实显示了与非同步版本相比的两个有趣的增量:(i)每次写2次对nanos休眠()的调用,(ii) mmap()所花费的时间增加了80%。
我的另一个理论是,也许msync()或者是它的替代品实际上是以Nanos休眠()来实现的?
这是在桌面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中。
谢谢。
发布于 2018-12-05 22:19:18
是的,这是打开fsync()的正确方法。
问题是strace
必须与-f标志一起使用,以跟踪新线程中的系统调用.RocksDB在其他线程中执行所有同步操作。
https://stackoverflow.com/questions/53617068
复制相似问题