Kernel

Overcommit_memory =0 中的啟發式是什麼意思?

  • July 13, 2017

我通讀了 man proc 的文件。當談到 overcommit_memory 時,overcommit_memory=0 中的啟發式方法並沒有被很好地理解。啟發式實際上意味著什麼?

“未檢查帶有 MAP_NORESERVE 的 mmap(2) 呼叫”是否意味著核心僅分配虛擬記憶體而不知道交換空間的存在?

該文件包含核心虛擬記憶體記帳模式。值為:

0:啟發式過度使用(這是預設值)
1:總是過度使用,從不檢查
2:總是檢查,從不過度使用

在模式0下,對帶有MAP_NORESERVE的mmap(2)呼叫不進行檢查,預設檢查很弱,導致風險
獲得一個程序“OOM-killed”。

除了前面的問題,不管剩餘物理記憶體是否足夠,虛擬地址空間耗盡是否會導致OOM。

謝謝。

overcommit_memory設置在記憶體管理子系統的三個位置被考慮在內。

  1. 主要的是__vm_enough_memoryin mm/util.c,它決定是否有足夠的記憶體來允許記憶體分配繼續進行(請注意,這是一個不一定要呼叫的實用函式)。如果overcommit_memory為 1,則此函式始終成功。如果為 2,則檢查實際可用記憶體。如果為 0,則使用您提到的著名啟發式算法;進行如下:
  • 計算空閒頁面的數量
  • 添加文件支持頁面的數量(這些可以恢復)
  • 刪除用於共享記憶體的頁面
  • 添加交換頁
  • 添加可回收頁面
  • 保留頁面的帳戶
  • 為 root 留一些記憶體(如果分配不是由cap_sys_admin程序完成的)結果總數用作記憶體分配的門檻值。
  1. mmap還檢查設置:MAP_NORESERVE如果允許過度使用(模式 0 和 1),則執行此設置,並導致分配沒有備份交換 ( VM_NORESERVE)。在這種特殊情況下,模式 0 等效於模式 1;這就是“不檢查mmap(2)withMAP_NORESERVE的呼叫”的意思:這意味著MAP_NORESERVE mmap呼叫總是會成功,並且過度分配將導致 OOM-killer 事後介入,或者在嘗試寫入時導致段違規。
  2. shmem具有與 類似的行為mmap

用完地址空間應該導致分配失敗,而不是OOM-kills,因為分配實際上無法繼續。

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