AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 606185
Accepted
Mikhail Morfikov
Mikhail Morfikov
Asked: 2014-06-19 09:27:53 +0800 CST2014-06-19 09:27:53 +0800 CST 2014-06-19 09:27:53 +0800 CST

vm.overcommit_memory 是如何工作的?

  • 772

当我使用默认设置时:

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 倍的内存)在更改前后以相同的方式工作?

memory
  • 2 2 个回答
  • 131413 Views

2 个回答

  • Voted
  1. Best Answer
    Kyle Brandt
    2014-06-19T09:49:27+08:002014-06-19T09:49:27+08:00

    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。

    • 96
  2. d4nyll
    2019-12-06T03:43:51+08:002019-12-06T03:43:51+08:00

    这是一个老问题,答案很明确,但我认为还有更多要补充的。

    首先,当 时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(加上交换,如果有的话),这就是CommitLimitin/proc/meminfo值如此之高的原因。

    虽然vm.overcommit_memory = 2通常用于防止过度使用,但在这里,您使用它来限制可以过度使用的数量。将其设置300为危险,因为您的系统没有5171884 kB内存,因此,取决于您拥有多少交换空间,系统将使用交换(速度很慢),或者完全耗尽内存。

    至于为什么amarok在什么时候使用更多内存vm.overcommit_memory = 2- 这可能是因为使用更多内存时amarok效果最好,但使用更少也很好。所以程序的逻辑最初可能会尝试分配 2GB 的内存,但如果失败,则尝试分配 1GB。

    • 21

相关问题

  • 不会将整个 XML 文件读入内存的命令行 XML 验证器?

  • 在 Windows Server 2008 中,为什么我的 BIOS 和计算机属性显示我安装的所有 RAM,但任务管理器没有?

  • 如何使用 vmstat 获取 % 内存使用率?

  • 规格相同但引脚不匹配的 DDR2 模块?

  • ECC RAM、后台清理和 IOMMU BIOS 设置

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve