加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

Linux / FreeBSD上的O_DIRECT与O_SYNC

发布时间:2020-12-14 01:15:31 所属栏目:Linux 来源:网络整理
导读:我正在编写一个在 Linux和FreeBSD上运行的程序,我想确保在每次write()返回时数据实际写入物理设备上的文件,这样我的数据就不会丢失了事故(例如,电力损失,过程意外中断等). 根据OPEN(2)手册页,在Linux(高于2.6)上,O_DIRECT是同步的,但可能存在性能问题;在Free
我正在编写一个在 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.它会尝试完全绕过缓存.这可能也会影响读取.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读