vm.overcommit_memory 表示內核在分配內存時候做檢查的方式。
這個變量可以取到0,1,2三個值。對取不同的值時的處理方式都定義在內核源碼 mm/mmap.c 的 __vm_enough_memory 函數中。
-
取 1 的時候:此時宏為 OVERCOMMIT_ALWAYS,函數直接 return 0,分配成功。
-
取 2 的時候:此時宏為 OVERCOMMIT_NEVER,內核計算:內存總量×vm.overcommit_ratio/100+SWAP 的總量,如果申請空間超過此數值,則分配失敗。vm.overcommit_ratio 的默認值為50。
-
取 0 的時候:此時宏為 OVERCOMMIT_GUESS,內核計算:NR_FILE_PAGES 總量+SWAP總量+slab中可以釋放的內存總量,如果申請空間超過此數值,則將此數值與空閑內存總量減掉 totalreserve_pages(?) 的總量相加。如果申請空間依然超過此數值,則分配失敗。
以上為粗略描述,在實際計算時,如果非root進程,則在計算時候會保留3%的空間,而root進程則沒有該限制
vm.overcommit_memory
默認值為:0
從內核文檔里得知,該參數有三個值,分別是:
0:當用戶空間請求更多的的內存時,內核嘗試估算出剩余可用的內存。
1:當設這個參數值為1時,內核允許超量使用內存直到用完為止,主要用於科學計算
2:當設這個參數值為2時,內核會使用一個決不過量使用內存的算法,即系統整個內存地址空間不能超過swap+50%的RAM值,50%參數的設定是在overcommit_ratio中設定。
vm.overcommit_ratio
默認值為:50
這個參數值只有在vm.overcommit_memory=2的情況下,這個參數才會生效。