Memory

vm.overcommit_memory 是如何工作的?

  • December 5, 2019

當我使用預設設置時:

vm.overcommit_memory = 0
vm.overcommit_ratio = 50

/proc/meminfo我可以從文件中讀取這些值:

CommitLimit:     2609604 kB
Committed_AS:    1579976 kB

但是當我從 更改vm.overcommit_memory02,我無法啟動在更改之前可以啟動的同一組應用程序,尤其是 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 倍的記憶體)在更改前後以相同的方式工作?

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。

引用自:https://serverfault.com/questions/606185