vm.overcommit_memory = 2 のときに、実際の上限と今現在の値はどこで確認できるか?

(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 見ればいいんですが…)