当我使用默认设置时:
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 倍的内存)在更改前后的工作方式相同吗?
答案1
您可以在以下位置找到文档man 5 proc
(或者访问 kernel.org):
/proc/sys/vm/overcommit_memory This file contains the kernel virtual memory accounting mode. Values are: 0: heuristic overcommit (this is the default) 1: always overcommit, never check 2: always check, never overcommit In mode 0, calls of mmap(2) with MAP_NORESERVE are not checked, and the default check is very weak, leading to the risk of getting a process "OOM-killed". In mode 2 (available since Linux 2.6), the total virtual address space that can be allocated (CommitLimit in /proc/mem‐ info) is calculated as CommitLimit = (total_RAM - total_huge_TLB) * overcommit_ratio / 100 + total_swap
简单的答案是,将过度提交设置为 1,这样当程序调用某些函数malloc()
来分配一块内存(man 3 malloc
)时,它总是会成功,无论系统是否知道它不会拥有所要求的所有内存。
要理解的基本概念是虚拟内存。程序看到的虚拟地址空间可能映射到实际物理内存,也可能不映射到实际物理内存。通过禁用过度使用检查,您可以告诉操作系统假设始终有足够的物理内存来备份虚拟空间。
例子
为了强调为什么这有时很重要,请查看Redis 指南为什么vm.overcommit_memory
要将其设置为 1。
答案2
这是一个老问题,有着成熟的答案,但我认为还有更多需要补充。
首先,当 时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
中的值/proc/meminfo
如此之高。
虽然vm.overcommit_memory = 2
通常用于防止过度使用,但在这里,您使用它来限制可以过度使用的数量。将其设置为 是300
危险的,因为您的系统没有5171884 kB
内存,因此,根据您拥有的交换空间大小,系统将使用交换(这很慢),或者将完全耗尽内存。
至于为什么amarok
在什么时候使用更多内存vm.overcommit_memory = 2
- 这可能是因为amarok
内存越多效果越好,但内存越少也行。因此程序的逻辑可能最初尝试分配 2GB 内存,但如果失败,则尝试 1GB。
答案3
Linux 内核支持以下过量使用处理模式
0 - 启发式过量使用处理。明显的地址空间过量使用被拒绝。用于典型系统。它确保严重的分配失败,同时允许过量使用以减少交换使用。在此模式下,root 可以分配稍多的内存。这是默认设置。
1 - 始终过度使用。适用于某些科学应用。典型示例是使用稀疏数组的代码,并且仅依赖几乎完全由零页组成的虚拟内存。
2 - 不要过度使用。系统的总地址空间提交量不得超过交换 + 可配置的物理 RAM 量(默认值为 50%)。根据您使用的数量,在大多数情况下,这意味着进程在访问页面时不会被终止,但会在内存分配时收到相应的错误。
Useful for applications that want to guarantee their
memory allocations will be available in the future
without having to initialize every page.
https://www.kernel.org/doc/Documentation/vm/overcommit-accounting