Linux / FreeBSD上的O_DIRECT与O_SYNC
我正在编写一个在
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>. 注意: >你的写入性能(在硬盘上)现在绝对会很糟糕.>不要使用sync选项挂载分区;这将导致所有I / O(包括读取)同步完成.>不要使用O_DIRECT.它会尝试完全绕过缓存.这可能也会影响读取. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |