(vm.overcommit_memoryの説明はぐぐってください: google:vm.overcommit_memory)
例えば
vm.overcommit_memory = 2 vm.overcommit_ratio = 90
なときに、実際の上限と今現在の値はどこで確認できるか?
the total virtual address space on the system is limited to (SS + RAM*(r/100)), where SS is the size of the swap space, and RAM is the size of the physical memory, and r is the contents of the file /proc/sys/vm/overcommit_ratio.
proc(5): process info pseudo-file system - Linux man page
と書かれているので、
memstat() { awk -v FS='[ :]*' '{h[$1]=$2} END{tot=h["MemTotal"]+h["SwapTotal"];used=tot-h["MemFree"]-h["SwapFree"];printf("tot=%d used=%d limit=%d\n",tot,used,h["SwapTotal"]+h["MemTotal"]*0.9)}' /proc/meminfo; }
な感じで今現在の値を確認できると思ったらさにあらず。(上限はこれで確認できますが)
使用量は単純な合算ではなくて、カウントするもの/されないものがあるそうで、結局、正確な値は /proc/meminfo の CommitLimit (上限値) と Committed_AS (使用量) で確認できるようです。
# echo 2 > /proc/sys/vm/overcommit_memory # echo 90 > /proc/sys/vm/overcommit_ratio # grep ^Commit /proc/meminfo CommitLimit: 2350852 kB Committed_AS: 1330664 kB # echo 50 > /proc/sys/vm/overcommit_ratio # grep ^Commit /proc/meminfo CommitLimit: 1527364 kB # 少なくなった Committed_AS: 1330664 kB $ ./100MB-malloc-suruzo- # grep ^Commit /proc/meminfo CommitLimit: 1527364 kB Committed_AS: 1433400 kB # 増えた # echo 0 > /proc/sys/vm/overcommit_ratio # grep ^Commit /proc/meminfo bash: fork: Cannot allocate memory # ウ、ウヒー # echo 0 > /proc/sys/vm/overcommit_memory # grep ^Commit /proc/meminfo # フゥ CommitLimit: 498004 kB Committed_AS: 1330828 kB
あと、上限値の計算式を、正しいのは
- (SS + RAM*(r/100))
なんですが、
- (SS + RAM)*(r/100)
と勘違いしてオハマリしました。(今となっては CommitLimit 見ればいいんですが…)
あわせて読みたい
- linux-2.6.X/Documentation/vm/overcommit-accounting
- linux-2.6.X/Documentation/filesystems/proc.txt
- Linux Memory Overcommit - memologue
- 革命の日々! Linuxでのovercommit_memory制御の勘所
- 革命の日々! で、結局overommit_memoryのオススメ設定値はいくつなのさ?