ページの障害に関するドキュメントを作成していて、具体的な数値を使用できるようにしようとしているので、12 * 1024*1024バイトのデータを読み取る簡単なプログラムを作成しました。簡単:
int main()
{
FILE*in = fopen("data.bin", "rb");
int i;
int total=0;
for(i=0; i<1024*1024*12; i++)
total += fgetc(in);
printf("%d\n", total);
}
そうです、それはファイル全体を調べて読み取ります。問題は、このプロセス中に1536回起動するdtraceプローブが必要なことです(12M / 8k)。すべてのfbt:mach_kernel:vm_fault *:プローブとすべてのvminfo :::プローブを数えても、500に到達しないため、適切なプローブが見つからないことがわかります。
ページがディスクからフォールトインされたときに起動するdtraceプローブをどこで見つけることができるか知っている人はいますか?
アップデート:
stdio関数でインテリジェントなプリフェッチが行われていることが問題であるという偶然の機会に、私は次のことを試みました。
int main()
{
int in = open("data.bin", O_RDONLY | O_NONBLOCK);
int i;
int total=0;
char buf[128];
for(i=0; i<1024*1024*12; i++)
{
read(in, buf, 1);
total += buf[0];
}
printf("%d\n", total);
}
このバージョンの実行にははるかに長い時間がかかります(リアルタイムで42秒、そのうちの10秒はユーザーで、残りはシステム時間でした-ページフォールトだと思います)が、それでも予想される5分の1のフォールトが生成されます。
不思議なことに、時間の増加はループのオーバーヘッドとキャスト(charからint)によるものではありません。これらのアクションだけを実行するコードバージョンは.07秒かかります。