我正在編寫關於頁面錯誤的文檔,並試圖獲得一些具體的數字來處理,所以我寫了一個簡單的程序,讀取12 * 1024 * 1024字節的數據。簡單:哪個(OS X)dtrace探針在頁面從磁盤發生故障時觸發?
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);
}
所以是的,它通過並讀取整個文件。問題是我需要在此過程中(12M/8k)發射1536次的dtrace探頭。即使我計算了所有的fbt:mach_kernel:vm_fault::探針和所有的vminfo :::探針,我也沒有達到500,所以我知道我沒有找到正確的探針。
任何人都知道在哪裏可以找到dtrace探針,當頁面從磁盤發生故障時會觸發?
UPDATE:
在起飛的機會,問題是,有一些智能預取的標準輸入輸出功能的時候,我試過如下:
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);
}
這個版本需要更長的時間運行(42s實時,其中10s是用戶,其餘是系統時間 - 頁面錯誤,我猜),但仍然會產生五分之一的錯誤,如我所料。
爲了好奇,時間增加並不是由於循環開銷和鑄造(char到int)。執行這些操作的代碼版本需要0.07秒。
......以及後續問題......爲什麼dtrace問題總是以「唧唧喳喳唧唧聲」類別結束?我懷疑這是因爲dtrace探針的唯一真實文檔位於內核源代碼中,而OS X只是少量地發佈。這就是爲什麼我更喜歡在solaris機器上使用dtrace,所以我可以從Open Solaris中挖掘出我需要的東西。 – Sniggerfardimungus 2010-07-28 16:56:25
你也可以在FreeBSD上試試'dtrace' :) – 2010-08-13 19:02:21