posix_fadvise不起作用

posix_fadvise not working

本文关键字:不起作用 fadvise posix      更新时间:2023-10-16

我有以下代码来打开所有文件:

int ret= open(zFile, flags, mode);
posix_fadvise (ret, 0, 0, POSIX_FADV_RANDOM);

posix_fadvise返回 0 表示成功。

但它无法正常工作。

操作系统: 乌班图 12.04

Strace 显示程序完成的读取是29088 字节。

我使用以下命令来计算从跟踪日志读取

cat fadvise3.log | grep read | awk '{SUM+=$NF} END {print SUM}'

但iotop显示该程序已经阅读了有关2.5 MB.

  1. 有没有办法知道为什么它读了这么多?
  2. 为什么 iotop O/p 与 strace 不匹配?
  3. 为什么posix_fadvise(ret, 0, 0, POSIX_FADV_RANDOM); 不起作用?
  4. 如何禁用进程的预读?

有关阅读的更多详细信息:我正在使用 sqlite 库。并修改了他们的函数posixOpen以打开数据库。读取由 sqlite 完成。

>posix_fadvise将更改内核内部完成的预读量。它不会更改用户空间应用程序将传递给读取系统调用的参数。因此,除了在 strace 下运行时读取系统调用的参数会有任何不同之外,您不应该这样做。

磁盘读取是在磁盘块中完成的,这是一个硬件限制,POSIX_FADV_RANDOM无法更改它。如果您阅读的量少于一个块,您仍然需要支付该块的成本。

即便如此, posix_fadvise 顾名思义,只是对内核的建议。一个提示。不是严格的规定。