vm.overcommit_memory如何工作?


49

当我使用默认设置时:

vm.overcommit_memory = 0
vm.overcommit_ratio = 50

我可以从/proc/meminfo文件中读取这些值:

CommitLimit:     2609604 kB
Committed_AS:    1579976 kB

但是,当我改变vm.overcommit_memory来自02,我无法启动的同一组,我可以改变之前启动应用程序,特别是Amarok的。我必须更改vm.overcommit_ratio300,因此可以增加限制。现在,当我启动amarok时,/proc/meminfo显示以下内容:

CommitLimit:     5171884 kB
Committed_AS:    3929668 kB

该机器只有1GiB的RAM,但将amarok vm.overcommit_memory设置为0 时,其工作不会出现问题。但是,如果将2amarok 设置为,则amarok需要分配超过2GiB的内存。这是正常现象吗?如果是这样,那么谁能解释一下,为什么firefox(消耗的内存比amarok多4-6倍)为何在更改前后都以相同的方式工作?

Answers:


66

您可以在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

简单的答案是,将overcommit设置为1,将设置阶段,以便当程序调用诸如malloc()分配内存块(man 3 malloc)之类的程序时,无论系统是否知道没有正在使用的所有内存,它都会始终成功要求。

要理解的基本概念是虚拟内存的概念。程序会看到一个虚拟地址空间,该虚拟地址空间可能会或可能不会映射到实际的物理内存。通过禁用过量使用检查,您可以告诉操作系统仅假设始终有足够的物理内存来备份虚拟空间。

为了突出说明有时有时如此重要的原因,请查看有关Redis为何vm.overcommit_memory将其设置为1的指南。


2
但是Committed_AS两种情况下的值不应该相同吗?
Mikhail Morfikov

@MikhailMorfikov:理论上,我相信,但是谁知道这些程序在做什么。希望看到一个具有更简单程序的受控环境,该程序只是通过Malloc分配了ram的数量。在两次测试之间重新启动后,再运行测试。
凯尔·布​​兰特

好吧,所以我0现在就呆在一起。
Mikhail Morfikov 2014年

2
@MikhailMorfikov:是的,实际上我认为0最有意义。在我的环境,我唯一一次让1是Redis的,这确实的东西它希望做会问了很多更多的内存,它是利用因叉()。这个孩子几乎会使用所有相同的内存页面,但是Linux并不知道说是安全的,它必须假定将使用2 倍的内存(如果您想了解更多,请访问:redis.io/topics/faq
Kyle Brandt 2014年

您答案中的最后一条语句不应该像“通过启用过量提交”那样开始吗?因为将其设置为1意味着您要求它过量使用,对吗?
当天asgs
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.