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 = 2不允许过度使用内存超过 RAM 的 50% (as vm.overcommit_ratio is 50),但我仍然可以看到当前内存使用量为 47 GB 中的 46 GB。

我是不是误会了什么?

答案1

实际上,设置 vm.overcommit_memory=2 确实允许过量使用。如果将 overcommit_ratio 设置为(例如)200,则可以将内存提交到 swap +(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。所以用户空间最多可以分配47GB。

您的free输出显示用户空间使用了 1GB,内核使用了 45GB 用于缓存。 1GB 用户空间远低于 94GB 的 50%。


补充更正:

vm.overcommit_memory = 2不允许过度使用内存超过 RAM 的 50%

此设置不允许过度使用根本不。与 结合使用vm.overcommit_ratio=50,它将允许用户空间提交最多 50% 的总内存。 "提交" != "过度提交"

相关内容