C 顺序文件写入的posix_fadvise()参数是什么?

C 顺序文件写入的posix_fadvise()参数是什么?,c,optimization,posix,C,Optimization,Posix,我正在开发一个应用程序,它可以按顺序写入一个大文件(并且根本不读取),我想使用posix_fadvise()来优化文件系统行为 手册页中的功能说明表明,最合适的策略是POSIX\u FADV\u SEQUENTIAL。但是,Linux实施说明怀疑: 在Linux下,POSIX_FADV_NORMAL将预读窗口设置为备份设备的默认大小POSIX_FADV_SEQUENTIAL将此大小加倍,并且POSIX_FADV_RANDOM完全禁用文件预读 因为我只写数据(可能也会覆盖文件),所以我不希望有任何

我正在开发一个应用程序,它可以按顺序写入一个大文件(并且根本不读取),我想使用
posix_fadvise()
来优化文件系统行为

手册页中的功能说明表明,最合适的策略是
POSIX\u FADV\u SEQUENTIAL
。但是,Linux实施说明怀疑:

在Linux下,
POSIX_FADV_NORMAL
将预读窗口设置为备份设备的默认大小
POSIX_FADV_SEQUENTIAL
将此大小加倍,并且
POSIX_FADV_RANDOM
完全禁用文件预读

因为我只写数据(可能也会覆盖文件),所以我不希望有任何预读。然后,我应该继续使用我的
POSIX\u FADV\u SEQUENTIAL
还是使用
POSIX\u FADV\u RANDOM
来禁用它


其他选项如何,如POSIX\U FADV\U NOREUSE?或者根本不使用
posix_fadvise()
进行写入?

这一切都取决于数据的时间位置。如果您的应用程序在写入后不久就不需要数据,那么您可以使用
POSIX\u FADV\u NOREUSE
来避免写入缓冲区缓存(与
open()
中的
O\u DIRECT
标志类似)。

就写入而言,我认为您可以依靠操作系统的磁盘IO调度程序来做正确的事情

您应该记住,虽然posix_fadvise是专门为内核提供关于未来文件使用模式的提示的,但是内核还有其他数据可以帮助您解决这个问题


如果不打开文件进行读取,则只需在部分写入块时读取这些块。如果要将文件截断为0,则它甚至不必这样做(您说您正在覆盖)。

大多数
posix_fadvise()
标志(例如
posix_FADV_SEQUENTIAL
posix_FADV_RANDOM
)都是关于预读而不是写入的提示

关于获得良好的顺序写入性能,Linus和John提出了一些建议。我们的想法是将文件拆分为大的ish(8MB)窗口,然后循环执行以下操作:

  • Write()
    写出窗口N
  • 使用
    sync\u file\u range(…,sync\u file\u range\u write)
  • 等待窗口N-1外的写入完成,包括
    sync\u file\u range(…,sync\u file\u range\u Wait\u之前;sync\u file\u range\u write;sync\u file\u range\u Wait\u之后)
  • 使用
    posix\u fadvise(…,posix\u FADV\u DONTNEED)

这样,页面缓存中的数据不会超过两个窗口,但在填充下一部分的同时,内核仍会将页面缓存的一部分写入磁盘。

请注意,linux内核中没有实现POSIX_FADV_NOREUSE。这是我需要的,以使utee()不必重击缓存,而是保持快速。谢谢