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_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 倍的記憶體)在更改前後以相同的方式工作?
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。