Kernel
Overcommit_memory =0 中的啟發式是什麼意思?
我通讀了 man proc 的文件。當談到 overcommit_memory 時,overcommit_memory=0 中的啟發式方法並沒有被很好地理解。啟發式實際上意味著什麼?
“未檢查帶有 MAP_NORESERVE 的 mmap(2) 呼叫”是否意味著核心僅分配虛擬記憶體而不知道交換空間的存在?
該文件包含核心虛擬記憶體記帳模式。值為: 0:啟發式過度使用(這是預設值) 1:總是過度使用,從不檢查 2:總是檢查,從不過度使用 在模式0下,對帶有MAP_NORESERVE的mmap(2)呼叫不進行檢查,預設檢查很弱,導致風險 獲得一個程序“OOM-killed”。
除了前面的問題,不管剩餘物理記憶體是否足夠,虛擬地址空間耗盡是否會導致OOM。
謝謝。
該
overcommit_memory
設置在記憶體管理子系統的三個位置被考慮在內。
- 主要的是
__vm_enough_memory
inmm/util.c
,它決定是否有足夠的記憶體來允許記憶體分配繼續進行(請注意,這是一個不一定要呼叫的實用函式)。如果overcommit_memory
為 1,則此函式始終成功。如果為 2,則檢查實際可用記憶體。如果為 0,則使用您提到的著名啟發式算法;進行如下:
- 計算空閒頁面的數量
- 添加文件支持頁面的數量(這些可以恢復)
- 刪除用於共享記憶體的頁面
- 添加交換頁
- 添加可回收頁面
- 保留頁面的帳戶
- 為 root 留一些記憶體(如果分配不是由
cap_sys_admin
程序完成的)結果總數用作記憶體分配的門檻值。
mmap
還檢查設置:MAP_NORESERVE
如果允許過度使用(模式 0 和 1),則執行此設置,並導致分配沒有備份交換 (VM_NORESERVE
)。在這種特殊情況下,模式 0 等效於模式 1;這就是“不檢查mmap(2)
withMAP_NORESERVE
的呼叫”的意思:這意味著MAP_NORESERVE
mmap
呼叫總是會成功,並且過度分配將導致 OOM-killer 事後介入,或者在嘗試寫入時導致段違規。shmem
具有與 類似的行為mmap
。用完地址空間應該導致分配失敗,而不是OOM-kills,因為分配實際上無法繼續。