vm.overcommit_memory 如何工作?

vm.overcommit_memory 如何工作?

当我使用默认设置时:

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_ratio300,这样限制就可以增加了。现在当我启动 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

相关内容