【发布时间】:2014-06-16 18:37:27
【问题描述】:
我有一个 linux 应用程序,可以将数据流式传输到直接连接的 SAS 存储阵列上的文件。它填充大缓冲区,以 O_DIRECT 模式写入它们,然后回收缓冲区(即再次填充它们等)。我不需要使用 O_SYNC 来保证数据完整性,因为我可以忍受崩溃、延迟写入等导致的数据丢失。我主要对高吞吐量感兴趣,而且在没有 O_SYNC 的情况下我似乎可以获得更好的性能。但是,我想知道它是否安全:如果使用 O_DIRECT 而不是 O_SYNC,那么 write() 系统调用究竟何时返回?
如果在对存储阵列缓存的 DMA 完成后 write() 返回,那么我的应用程序可以安全地再次填充缓冲区。阵列本身处于回写模式:它最终会写入磁盘,这对我来说是可以接受的。
如果写入在 DMA 启动后立即返回(但尚未完成),则我的应用程序不安全,因为它会在 DMA 仍在进行时覆盖缓冲区。显然我不想写损坏的数据;但在这种情况下,我也无法确定缓冲区的 DMA 何时完成并且可以安全地重新填充。
(实际上有几个并行线程,每个线程都有自己的缓冲区池,尽管这对于上面的问题可能并不重要。)
【问题讨论】:
标签: linux io filesystems linux-device-driver