これは私の現在の設定です。
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 = 2
RAMの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 = 2
RAMの50%を超えるメモリ乱用は許可されていません。
この設定は過度の使用を許可しません別の言葉。と一緒に使用すると、vm.overcommit_ratio=50
ユーザースペースは合計メモリーの最大50%までコミットできます。 "コミット" != "オーバーコミット"