posix_fadvise不工作

时间:2012-05-14 10:47:08

标签: c++ linux ubuntu

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

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

和posix_fadvise返回0表示成功。

但它无法正常工作。

操作系统:Ubuntu 12.04

Strace表明该程序已完成读取操作 29088字节。

我使用以下命令计算从strace日志中读取的数据

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. 如何禁用进程的预读?
  5. 有关阅读的更多细节: 我正在使用sqlite库。并修改了它们的函数posixOpen来打开数据库。读取由sqlite完成。

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

磁盘读取是在磁盘块中完成的,这是硬件限制,POSIX_FADV_RANDOM无法更改。如果你读的少于块,你仍然需要支付该块的费用。

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