- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我正在编写一个在 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 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
打开文件选项。注意:
sync
挂载分区选项;这将导致所有 I/O(包括读取)同步完成。O_DIRECT
.它将尝试完全绕过缓存。这可能也会影响阅读。关于c - O_DIRECT 与 Linux/FreeBSD 上的 O_SYNC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19440041/
在 C 中,当我调用 open() 打开文件描述符时,我必须显式传递 O_SYNC 标志以确保对此文件的写入将被持久化在 write() 返回时写入磁盘。如果我愿意,我可以不向open()提供O_SY
我们的项目简要描述:我们在项目中使用CycloneV,FPGA将使用AXI总线将数据写入DDR,我们的应用程序需要使用以太网将数据发送出去。我们使用 iperf 对以太网吞吐量进行基准测试,它可以达到
我有一个 Linux 应用程序,可以将数据流式传输到直接连接的 SAS 存储阵列上的文件。它填充大缓冲区,以 O_DIRECT 模式写入它们,然后回收缓冲区(即再次填充它们等)。我不需要使用 O_SY
我有一个 mmap 只读/共享文件,多个线程/进程同时读取数据。允许单个写入器随时修改数据(在单独的共享内存区域中使用互斥锁)。使用底层文件上的 write() 执行更改。整体设置是旨在实现事务一致性
我正在编写一个在 Linux 和 FreeBSD 上都运行的程序,我想确保当每个 write() 返回时,数据确实写入了物理设备上的文件,这样我的数据就不会意外丢失(例如,断电、过程意外中断等)。 根
大家 最近,我用fio做了一些测试来测试我的磁盘性能。我配置fio使用direct io和O_SYNC,下面是我的配置 [global] invalidate=0 # mandatory dir
O_DIRECT 等标志, O_SYNC , O_DSYNC可用于在创建描述符时指定同步/异步 IO(create syscall)。但是是否可以将此标志用于不同的 write (或类似的)系统调用以
O_SYNC 和 O_DIRECT 标志的使用和效果非常令人困惑,并且在不同平台之间似乎有所不同。从 Linux 手册页(参见示例 here )来看,O_DIRECT 提供同步 I/O,最大限度地减少
我是一名优秀的程序员,十分优秀!