什么posix_fadvise()args用于顺序文件写入?

Mic*_*rny 17 c optimization posix

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

联机帮助页中的功能描述表明最合适的策略是POSIX_FADV_SEQUENTIAL.但是,Linux实现描述怀疑:

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

因为我只是在写数据(可能也会覆盖文件),所以我不希望有任何预告.我应该坚持使用POSIX_FADV_SEQUENTIAL或更确切地说使用POSIX_FADV_RANDOM它来禁用它吗?

其他选项怎么样,比如POSIX_FADV_NOREUSE?或者根本不posix_fadvise()用于写作?

caf*_*caf 38

大多数posix_fadvise()标志(例如POSIX_FADV_SEQUENTIALPOSIX_FADV_RANDOM)都是关于readahead而不是写入的提示.

Linus 在这里这里提出了一些关于获得良好的顺序写入性能的建议.想法是将文件分成大型(8MB)窗口,然后循环执行:

  • 写出窗口N用write();
  • 请求异步写出窗口N. sync_file_range(..., SYNC_FILE_RANGE_WRITE)
  • 等待窗口N-1的写出完成 sync_file_range(..., SYNC_FILE_RANGE_WAIT_BEFORE | SYNC_FILE_RANGE_WRITE | SYNC_FILE_RANGE_WAIT_AFTER)
  • 从页面缓存中删除窗口N-1 posix_fadvise(..., POSIX_FADV_DONTNEED)

这样,页面缓存中的数据永远不会超过两个窗口,但是当您填充下一部分时,仍然会让内核将部分页面缓存写入磁盘.


小智 5

这一切都取决于数据的时间局部性.如果您的应用程序在编写后不久就不需要数据,那么您可以选择POSIX_FADV_NOREUSE避免写入缓冲区缓存(以与O_DIRECT标志相似的方式open()).

  • 请注意,Linux内核中没有实现POSIX_FADV_NOREUSE. (9认同)