overcommit_memory と overcommit_ratio

overcommit_memory と overcommit_ratio

これは私の現在の設定です。

vm.overcommit_ratio = 50 (default)
vm.overcommit_memory = 2

現在のメモリ使用量:

[localhost~]$ free -g
             total       used       free     shared    buffers     cached
Mem:            47         46          0          0          0         45
-/+ buffers/cache:          1         45
Swap:           47          0         47

~によると文書私の理解は次のとおりです

vm.overcommit_memory = 2RAMの50%を超えるメモリオーバーコミットは許可されていませんが(as vm.overcommit_ratio is 50)、現在のメモリ使用量は47GBのうち46GBであることがわかります。

私が何かを間違って理解したのでしょうか?

答え1

実際にvm.overcommit_memory = 2を設定すると、過剰なコミットが許可されます。 overcommit_ratio を (たとえば) 200 に設定すると、メモリをスワップ + (RAM*200/100) の範囲にコミットできます。

カーネル文書は少し誤解を招く可能性があります。 「2」はオーバーコミットしないことを意味します。これは、この制限にコミットすることを意味します。これは、実際にはovercommit_ratio(実際にはパーセンテージなので無効な名前です)が100より大きい場合に許可されます。 。

vm.overcommit_memoryは、オーバーコミット制限を設定することでより正確に説明されています。基本的に過度の使用は許可されていません。

送信制限を確認できます。

    $free -m | awk '$1 ~/[Mm]em/ {print $2}' ; sysctl -a 2>/dev/null | grep vm.over  ; grep -i commitlimit /proc/meminfo


vm.overcommit_kbytes = 0
vm.overcommit_memory = 2
vm.overcommit_ratio = 800
CommitLimit:    23449596 kB

答え2

これらのvm.overcommit_*設定は、ユーザー空間のメモリ割り当てを制御します。カーネルが割り当てることができるメモリには影響しません。また、取得する価値の50%は物理メモリ+スワップスペースです。 47+47=94。したがって、ユーザースペースは最大47 GBまで割り当てることができます。

出力freeによると、1GBはユーザースペースで使用され、45GBはカーネル内のキャッシュに使用されます。 1GBのユーザースペースは、94GBの50%にもはるかに劣ります。


追加の修正:

vm.overcommit_memory = 2RAMの50%を超えるメモリ乱用は許可されていません。

この設定は過度の使用を許可しません別の言葉。と一緒に使用すると、vm.overcommit_ratio=50ユーザースペースは合計メモリーの最大50%までコミットできます。 "コミット" != "オーバーコミット"

関連情報