Linux
為什麼我沒有看到預期的頁面錯誤?
我正在嘗試探索 Linux 的頁面錯誤行為。我製作了一個 lxc 容器,將記憶體限制為 1GB(通過將 ’lxc.cgroup.memory.limit_in_bytes = 1G’ 添加到 /etc/lxc/default.conf)。然後,我執行了一個訪問 2GB 數據量的簡單程式碼。
int main() { char* buf = malloc(1024*1024*1024); char* buf2 = malloc(1024*1024*1024); if (buf == 0 || buf2 == 0) { printf("Malloc failed!\n"); return 0; } int i,j,k; for (i=0; i<1024; i++) for (j=0; j<1024; j++) for (k=0; k<1024; k++) buf[i*1024*1024 + j*1024 + k] = i+j+k; for (i=0; i<1024; i++) for (j=0; j<1024; j++) for (k=0; k<1024; k++) buf2[i*1024*1024 + j*1024 + k] = i+j+k; free(buf); free(buf2); while(1); return 0; }
程式碼使用 -O0 編譯並在容器內執行。當程序到達 while(1); 時,我檢查它經歷了多少頁錯誤
ps -eo maj_flt,cmd | grep a.out
其中 a.out 是編譯後的執行檔。有時我會遇到 200~300 個頁面錯誤;但是,有時我只看到 10~20 個頁面錯誤。因為記憶體只有 1G,我認為至少應該發生 1G/4K = 256K 頁面錯誤。為什麼有時我只看到 10~20 個頁面錯誤?我確認我的 Linux 預設使用 4K 頁面。
我是 Linux 新手。任何見解都會非常有幫助!謝謝你。
我解決了這個問題。
- 我的程式碼的一個主要問題是,在第一次寫入 malloc 的頁面時,不會發生頁面錯誤,因為 Linux 不必從磁碟讀取空頁面。我更改了程式碼,以便它執行程式碼的循環部分兩次。
- 另外,我禁用了 Linux 預讀(通過 echo “0” >> /proc/sys/vm/page-cluster)
通過這兩項更改,我可以看到大約 2G / 4K = 524,288 個頁面錯誤(準確地說是 524,304)。
為什麼你會看到每頁第一次寫入記憶體的頁面錯誤?對於虛擬記憶體子系統來說,這或多或少是最糟糕的結果。因此,任何優化、記憶體、預載入、檢測訪問模式等都會減少這個數字。如果您嘗試這樣做,如果任何作業系統可靠地為您提供計算出的 256,000 頁錯誤,我會感到驚訝。