過度提交記賬¶
Linux 核心支援以下過度提交處理模式
- 0
啟發式過度提交處理。 明顯的地址空間過度提交將被拒絕。 用於典型系統。 它確保嚴重的瘋狂分配失敗,同時允許過度提交以減少交換使用。 這是預設設定。
- 1
始終過度提交。 適用於某些科學應用程式。 典型的例子是使用稀疏陣列,並且僅僅依賴於幾乎完全由零頁組成的虛擬記憶體的程式碼。
- 2
不要過度提交。 系統總的地址空間提交不允許超過交換空間 + 可配置數量(預設為 50%)的物理 RAM。 根據您使用的數量,在大多數情況下,這意味著程序在訪問頁面時不會被殺死,而是在記憶體分配時會收到相應的錯誤。
對於希望保證其記憶體分配在未來可用的應用程式非常有用,而無需初始化每個頁面。
過度提交策略透過 sysctl vm.overcommit_memory 設定。
過度提交量可以透過 vm.overcommit_ratio(百分比)或 vm.overcommit_kbytes(絕對值)設定。 只有當 vm.overcommit_memory 設定為 2 時,這些才有效。
當前過度提交限制和已提交量可以在 /proc/meminfo 中分別作為 CommitLimit 和 Committed_AS 檢視。
注意事項¶
C 語言堆疊增長會進行隱式的 mremap。 如果您想要絕對保證並且接近邊緣執行,您必須 mmap 您的堆疊到您認為需要的最大尺寸。 對於典型的堆疊使用,這無關緊要,但如果您真的非常在意,這是一個極端情況
在模式 2 中,MAP_NORESERVE 標誌被忽略。
它是如何工作的¶
過度提交基於以下規則
- 對於檔案支援的對映
- SHARED 或 READ-only - 0 成本(檔案是對映而不是交換空間)PRIVATE WRITABLE - 每個例項的對映大小
- 對於匿名或
/dev/zero對映 - SHARED - 對映大小PRIVATE READ-only - 0 成本(但幾乎沒有用處)PRIVATE WRITABLE - 每個例項的對映大小
- 附加記賬
- 由 mmap 生成的可寫副本頁面從同一池中提取的 shmfs 記憶體
狀態¶
我們對 mmap 記憶體對映進行記賬
我們對提交中的 mprotect 更改進行記賬
我們對大小中的 mremap 更改進行記賬
我們對 brk 進行記賬
我們對 munmap 進行記賬
我們在 /proc 中報告提交狀態
在 fork 上進行記賬和檢查
複查執行時的堆疊處理/構建
SHMfs 記賬
實施實際的限制執行
待辦事項¶
記賬 ptrace 頁面(這很難)