0

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

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. 如何禁用进程的预读?

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

4

2 回答 2

3

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

于 2012-05-14T11:18:47.977 回答
1

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

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

于 2012-05-14T11:18:30.597 回答