当我使用默认设置时:
vm.overcommit_memory = 0
vm.overcommit_ratio = 50
/proc/meminfo
我可以从文件中读取这些值:
CommitLimit: 2609604 kB
Committed_AS: 1579976 kB
但是当我从 更改vm.overcommit_memory
为0
时2
,我无法启动在更改之前可以启动的同一组应用程序,尤其是 amarok。我不得不更改vm.overcommit_ratio
为300
,因此可以增加限制。现在,当我启动 amarok 时,/proc/meminfo
显示以下内容:
CommitLimit: 5171884 kB
Committed_AS: 3929668 kB
这台机器只有 1GiB 的 RAM,但是当vm.overcommit_memory
设置为 0 时 amarok 可以正常工作。但是在设置为 的情况下2
,amarok 需要分配超过 2GiB 的内存。这是正常行为吗?如果是这样,谁能解释为什么,例如,firefox(它比 amarok 消耗 4-6 倍的内存)在更改前后以相同的方式工作?
man 5 proc
您可以在(或在 kernel.org )找到文档:简单的答案是,将overcommit设置为 1,这样当程序调用类似
malloc()
分配一块内存(man 3 malloc
要求。要理解的基本概念是虚拟内存的概念。程序看到一个虚拟地址空间,它可能会或可能不会映射到实际的物理内存。通过禁用过度使用检查,您可以告诉操作系统假设始终有足够的物理内存来备份虚拟空间。
例子
要强调为什么有时这很重要,请查看Redis 指南,了解为什么
vm.overcommit_memory
应该将其设置为 1。这是一个老问题,答案很明确,但我认为还有更多要补充的。
首先,当 时
vm.overcommit_memory = 0
,vm.overcommit_ratio
值是不相关的。内核将使用启发式算法来过度使用内存,以便您的amarok
进程可以分配比可用内存更多的内存。当您设置
vm.overcommit_memory
为 时2
,该vm.overcommit_ratio
值变得相关。默认情况下,此值设置为50
,这意味着系统最多只会分配 50% 的 RAM(加上交换)。这解释了为什么您无法启动正常vm.overcommit_memory = 0
的程序 - 因为可分配内存少于 500MB(假设没有交换)。当您将其设置为 时
300
,您将允许系统分配多达 300% 的 RAM(加上交换,如果有的话),这就是CommitLimit
in/proc/meminfo
值如此之高的原因。虽然
vm.overcommit_memory = 2
通常用于防止过度使用,但在这里,您使用它来限制可以过度使用的数量。将其设置300
为危险,因为您的系统没有5171884 kB
内存,因此,取决于您拥有多少交换空间,系统将使用交换(速度很慢),或者完全耗尽内存。至于为什么
amarok
在什么时候使用更多内存vm.overcommit_memory = 2
- 这可能是因为使用更多内存时amarok
效果最好,但使用更少也很好。所以程序的逻辑最初可能会尝试分配 2GB 的内存,但如果失败,则尝试分配 1GB。