gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 16:31:31 30 4
gpt4 key购买 nike

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

联机帮助页中的函数描述表明最合适的策略是 POSIX_FADV_SEQUENTIAL。然而,Linux 实现描述怀疑:

Under Linux, POSIX_FADV_NORMAL sets the readahead window to the default size for the backing device; POSIX_FADV_SEQUENTIAL doubles this size, and POSIX_FADV_RANDOM disables file readahead entirely.

因为我只写数据(也可能覆盖文件),所以我不希望有任何预读。然后我应该坚持使用我的 POSIX_FADV_SEQUENTIAL 还是使用 POSIX_FADV_RANDOM 来禁用它?

其他选项如何,例如 POSIX_FADV_NOREUSE?或者根本不使用 posix_fadvise() 进行写作?

最佳答案

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

Linus 有一些建议 herehere关于获得良好的顺序写入性能。这个想法是将文件分成大的 (8MB) 窗口,然后循环执行:

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

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

关于c - 顺序文件写入的 posix_fadvise() 参数是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3755765/

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