LinuxFreeBSD上的O_DIRECT与O_SYNC

LinuxFreeBSD上的O_DIRECT与O_SYNC,第1张

概述我正在编写一个在 Linux和FreeBSD上运行的程序,我想确保在每次write()返回时数据实际写入物理设备上的文件,这样我的数据就不会丢失了事故(例如,电力损失,过程意外中断等). 根据OPEN(2)手册页,在Linux(高于2.6)上,O_DIRECT是同步的,但可能存在性能问题;在FreeBSD上,O_DIRECT不保证同步,也可能有问题. 因此,在Linux上,O_DIRECT或O_S 我正在编写一个在 Linux和FreeBSD上运行的程序,我想确保在每次write()返回时数据实际写入物理设备上的文件,这样我的数据就不会丢失了事故(例如,电力损失,过程意外中断等).

根据OPEN(2)手册页,在linux(高于2.6)上,O_DIRECT是同步的,但可能存在性能问题;在FreeBSD上,O_DIRECT不保证同步,也可能有问题.

因此,在linux上,O_DIRECT或O_SYNC保证同步写入,但哪一个具有更好的性能?

在FreeBSD上,为保证同步写入,哪个选项具有最佳性能:(1)O_DIRECT fsync()(2)O_DIRECT | O_SYNC或(3)O_SYNC单独?

解决方法 对于当前的硬盘,即使磁盘将写入报告为完整的 *** 作系统,也无法保证文件实际写入磁盘!这是由于驱动器中的内置缓存.

在freeBSD上,你可以通过将kern.cam.ada.write_cache sysctl设置为0来禁用它.这将显着降低写入性能.上次我测量它(ICH-7芯片组上的WDC WD5001ABYS-01YNA0硬盘,FreeBSD 8.1 AMD64),连续写入性能(用dd if = / dev / zero = / tmp / foo bs = 10M count = 1000测量)下降从75,000,000字节/秒到12,900,000字节/秒.

如果你想绝对确定你的文件是写的;

>使用sysctl kern.cam.ada.write_cache = 0禁用写入缓存,然后执行camcontrol reset< bus>:< target>:< lun>.
>使用O_SYNC选项打开文件.

注意:

>你的写入性能(在硬盘上)现在绝对会很糟糕.>不要使用sync选项挂载分区;这将导致所有I / O(包括读取)同步完成.>不要使用O_DIRECT.它会尝试完全绕过缓存.这可能也会影响读取.

总结

以上是内存溢出为你收集整理的Linux / FreeBSD上的O_DIRECT与O_SYNC全部内容,希望文章能够帮你解决Linux / FreeBSD上的O_DIRECT与O_SYNC所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/1026919.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-23
下一篇 2022-05-23

发表评论

登录后才能评论

评论列表(0条)

保存