Linux

為什麼我沒有看到預期的頁面錯誤?

  • September 29, 2019

我正在嘗試探索 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 新手。任何見解都會非常有幫助!謝謝你。

我解決了這個問題。

  1. 我的程式碼的一個主要問題是,在第一次寫入 malloc 的頁面時,不會發生頁面錯誤,因為 Linux 不必從磁碟讀取空頁面。我更改了程式碼,以便它執行程式碼的循環部分兩次。
  2. 另外,我禁用了 Linux 預讀(通過 echo “0” >> /proc/sys/vm/page-cluster)

通過這兩項更改,我可以看到大約 2G / 4K = 524,288 個頁面錯誤(準確地說是 524,304)。

為什麼你會看到每頁第一次寫入記憶體的頁面錯誤?對於虛擬記憶體子系統來說,這或多或少是最糟糕的結果。因此,任何優化、記憶體、預載入、檢測訪問模式等都會減少這個數字。如果您嘗試這樣做,如果任何作業系統可靠地為您提供計算出的 256,000 頁錯誤,我會感到驚訝。

引用自:https://unix.stackexchange.com/questions/543935