我正在通过C API使用RocksDB。

我有一个测试程序,该程序打开一个数据库,执行1000次写入(在启动写入和回调之间收集计时数据),进行1000次读取,然后关闭。

这可行。平均写入时间约为1毫秒。

我修改了测试程序以通过此功能打开写入同步

rocksdb_writeoptions_set_sync(wri_u, 1);


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

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

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

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

...但是程序的同步版本显示相同的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中显示

谢谢。

最佳答案

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

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

关于rocksdb - 我是否可以正确地迫使RocksDB使用fsync? strace中均未显示fsync()和msync(),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53617068/

10-15 22:04