我是否正确强制RocksDB使用fsync?无论是fsync()还是msync()都没有出现在strace中。

4

我正在使用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()

谢谢。

1个回答

2

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

问题在于必须使用-f标志与strace一起在新线程中跟踪系统调用...而RocksDB正在其他线程中执行所有同步操作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接