web-dev-qa-db-ja.com

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 = 2はRAM (as vm.overcommit_ratio is 50)の50%を超えるメモリのオーバーコミットを許可しませんが、それでも現在のメモリ使用量は47GBのうち46GBであることがわかります。

私は何かを誤解しましたか?

3
gpdude_

実際、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
3
Graham Nicholls

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

freeの出力は、ユーザースペースで1 GBが使用され、カーネルでキャッシュに45GBが使用されていることを示しています。 1GBのユーザースペースは94GBの50%をはるかに下回っています。


追加の修正:

vm.overcommit_memory = 2 RAMの50%を超えるメモリをオーバーコミットすることはできません

この設定では、オーバーコミットは許可されませんまったく。と組み合わせ vm.overcommit_ratio=50、ユーザースペースが合計メモリの最大50%をコミットできるようにします。 "commit"!= "overcommit"

1
Patrick