0

すべてのファイルを開くための次のコードがあります。

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

posix_fadvise return 0は、成功を意味します。

しかし、それは正しく機能していません。

OS: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変更できません。読んだブロックが1ブロック未満の場合でも、そのブロックのコストを支払う必要があります。

それでも、posix_fadviseその名前が示すように、はカーネルへの単なるアドバイスです。ヒント。厳密なルールではありません。

于 2012-05-14T11:18:30.597 に答える