gpt4 book ai didi

c - O_DIRECT 与 Linux/FreeBSD 上的 O_SYNC

转载 作者:IT王子 更新时间:2023-10-29 01:13:38 33 4
gpt4 key购买 nike

我正在编写一个在 Linux 和 FreeBSD 上都运行的程序,我想确保当每个 write() 返回时,数据确实写入了物理设备上的文件,这样我的数据就不会意外丢失(例如,断电、过程意外中断等)。

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

那么,在 Linux 上,O_DIRECTO_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 of=/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 打开文件选项。

注意:

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

关于c - O_DIRECT 与 Linux/FreeBSD 上的 O_SYNC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19440041/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com