/proc/sys/vm/ 的文件

核心版本 2.6.29

版權所有 (c) 1998, 1999, Rik van Riel <riel@nl.linux.org>

版權所有 (c) 2008 Peter W. Morreale <pmorreale@novell.com>

有關一般資訊和法律宣告,請參閱/proc/sys 的文件


此檔案包含 /proc/sys/vm 中 sysctl 檔案的文件,適用於 Linux 核心版本 2.6.29。

此目錄中的檔案可用於調整 Linux 核心虛擬記憶體 (VM) 子系統的操作以及髒資料寫入磁碟的方式。

大多數這些檔案的預設值和初始化例程可在 mm/swap.c 中找到。

目前,這些檔案位於 /proc/sys/vm 中

  • admin_reserve_kbytes

  • compact_memory

  • compaction_proactiveness

  • compact_unevictable_allowed

  • defrag_mode

  • dirty_background_bytes

  • dirty_background_ratio

  • dirty_bytes

  • dirty_expire_centisecs

  • dirty_ratio

  • dirtytime_expire_seconds

  • dirty_writeback_centisecs

  • drop_caches

  • enable_soft_offline

  • extfrag_threshold

  • highmem_is_dirtyable

  • hugetlb_shm_group

  • laptop_mode

  • legacy_va_layout

  • lowmem_reserve_ratio

  • max_map_count

  • mem_profiling (僅當 CONFIG_MEM_ALLOC_PROFILING=y 時)

  • memory_failure_early_kill

  • memory_failure_recovery

  • min_free_kbytes

  • min_slab_ratio

  • min_unmapped_ratio

  • mmap_min_addr

  • mmap_rnd_bits

  • mmap_rnd_compat_bits

  • nr_hugepages

  • nr_hugepages_mempolicy

  • nr_overcommit_hugepages

  • nr_trim_pages (僅當 CONFIG_MMU=n 時)

  • numa_zonelist_order

  • oom_dump_tasks

  • oom_kill_allocating_task

  • overcommit_kbytes

  • overcommit_memory

  • overcommit_ratio

  • page-cluster

  • page_lock_unfairness

  • panic_on_oom

  • percpu_pagelist_high_fraction

  • stat_interval

  • stat_refresh

  • numa_stat

  • swappiness

  • unprivileged_userfaultfd

  • user_reserve_kbytes

  • vfs_cache_pressure

  • vfs_cache_pressure_denom

  • watermark_boost_factor

  • watermark_scale_factor

  • zone_reclaim_mode

admin_reserve_kbytes

系統中應為具有 cap_sys_admin 能力的使用者保留的空閒記憶體量。

admin_reserve_kbytes 預設為 min(3% 的空閒頁, 8MB)。

在預設的記憶體過量分配“猜測”模式下,這應該能為管理員提供足夠的記憶體來登入並終止程序(如果需要)。

在記憶體過量分配“從不”模式下執行的系統應增加此值,以考慮用於恢復的程式的完整虛擬記憶體大小。否則,root 使用者可能無法登入以恢復系統。

如何計算最小有用儲備?

sshd 或 login + bash(或其他 shell)+ top(或 ps、kill 等)

對於過量分配“猜測”模式,我們可以彙總常駐集大小 (RSS)。在 x86_64 上約為 8MB。

對於過量分配“從不”模式,我們可以取它們虛擬大小 (VSZ) 的最大值,然後加上它們的 RSS 總和。在 x86_64 上約為 128MB。

更改此設定會在應用程式請求記憶體時立即生效。

compact_memory

僅當設定了 CONFIG_COMPACTION 時可用。當向檔案寫入 1 時,所有區域都會被整理,以便儘可能以連續塊的形式提供空閒記憶體。這對於例如巨頁的分配很重要,儘管程序也會根據需要直接整理記憶體。

compaction_proactiveness

此可調引數的取值範圍為 [0, 100],預設值為 20。此可調引數決定了後臺整理的積極程度。向此可調引數寫入非零值將立即觸發主動整理。將其設定為 0 則停用主動整理。

請注意,整理會對整個系統產生非平凡的影響,因為屬於不同程序的頁會被移動,這還可能導致不經意的應用程式出現延遲峰值。核心採用各種啟發式方法,如果檢測到主動整理無效,則會避免浪費 CPU 週期。

將該值設定在 80 以上,除了會降低可接受的碎片級別外,還會使整理程式碼對碎片增加更敏感,即整理會更頻繁地觸發,但每次減少的碎片量會更小。這使得碎片級別隨著時間的推移更穩定。

請謹慎將其設定為極端值,如 100,因為這可能會導致過度的後臺整理活動。

compact_unevictable_allowed

僅當 CONFIG_COMPACTION 設定時可用。設定為 1 時,允許記憶體整理檢查不可收回的 LRU(mlocked 頁面)以查詢要整理的頁面。這應在以下系統上使用:輕微頁錯誤導致的停頓是可接受的,以換取大量連續的空閒記憶體。設定為 0 可防止記憶體整理移動不可收回的頁面。預設值為 1。在 CONFIG_PREEMPT_RT 系統上,預設值為 0,以避免因記憶體整理而導致頁錯誤,這會阻止任務在錯誤解決之前變為活動狀態。

defrag_mode

設定為 1 時,頁分配器會更努力地避免碎片化並保持生成巨頁/高階頁的能力。

建議在啟動後立即啟用此功能,因為碎片一旦發生,可能會長期存在甚至永久存在。

dirty_background_bytes

包含後臺核心重新整理執行緒將開始回寫時的髒記憶體量。

注意

dirty_background_bytes 是 dirty_background_ratio 的對應項。一次只能指定其中一個。當寫入一個 sysctl 時,它會立即用於評估髒記憶體限制,而另一個在讀取時顯示為 0。

dirty_background_ratio

包含後臺核心重新整理執行緒將開始寫出髒資料的髒頁數,表示為包含空閒頁和可回收頁的總可用記憶體的百分比。

總可用記憶體不等於總系統記憶體。

dirty_bytes

包含生成磁碟寫入的程序本身將開始回寫時的髒記憶體量。

注意:dirty_bytes 是 dirty_ratio 的對應項。一次只能指定其中一個。當寫入一個 sysctl 時,它會立即用於評估髒記憶體限制,而另一個在讀取時顯示為 0。

注意:dirty_bytes 允許的最小值為兩個頁面(以位元組為單位);任何低於此限制的值都將被忽略,並保留舊配置。

dirty_expire_centisecs

此可調引數用於定義髒資料在記憶體中保留多長時間後,可以由核心重新整理執行緒進行回寫。它以百分之一秒為單位表示。在記憶體中髒資料超過此間隔後,在下一次重新整理執行緒喚醒時將被寫入。

dirty_ratio

包含生成磁碟寫入的程序本身將開始寫出髒資料的髒頁數,表示為包含空閒頁和可回收頁的總可用記憶體的百分比。

總可用記憶體不等於總系統記憶體。

dirtytime_expire_seconds

當一個 lazytime inode 的頁面持續被弄髒時,帶有更新時間戳的 inode 將永遠沒有機會被寫入。而且,如果檔案系統上唯一發生的事情是由 atime 更新引起的 dirtytime inode,則會排程一個工作執行緒以確保該 inode 最終被推送到磁碟。此可調引數用於定義髒 inode 達到多長時間後可以由核心重新整理執行緒進行回寫。並且,它還用作喚醒 dirtytime_writeback 執行緒的間隔。

dirty_writeback_centisecs

核心重新整理執行緒將定期喚醒並將資料寫入磁碟。此可調引數以百分之一秒為單位表示這些喚醒之間的間隔。

將其設定為零將完全停用定期回寫。

drop_caches

寫入此檔案將導致核心丟棄乾淨的快取,以及可回收的 slab 物件,如目錄項 (dentries) 和 inode。一旦丟棄,它們的記憶體就變為可用。

釋放頁快取

echo 1 > /proc/sys/vm/drop_caches

釋放可回收的 slab 物件(包括目錄項和 inode)

echo 2 > /proc/sys/vm/drop_caches

釋放 slab 物件和頁快取

echo 3 > /proc/sys/vm/drop_caches

這是一個非破壞性操作,不會釋放任何髒物件。要增加此操作釋放的物件數量,使用者可以在寫入 /proc/sys/vm/drop_caches 之前執行 sync。這將最大程度地減少系統上的髒物件數量,並建立更多可丟棄的物件。

此檔案並非用於控制各種核心快取(inode、目錄項、頁快取等)的增長。當系統其他地方需要記憶體時,這些物件會自動被核心回收。

使用此檔案可能會導致效能問題。因為它丟棄了快取物件,所以重新建立被丟棄的物件可能會花費大量的 I/O 和 CPU,特別是如果它們被大量使用。因此,不建議在測試或除錯環境之外使用。

使用此檔案時,您可能會在核心日誌中看到資訊性訊息

cat (1234): drop_caches: 3

這些僅供參考。它們不表示您的系統有任何問題。要停用它們,請向 drop_caches 寫入 4(位 2)。

enable_soft_offline

可糾正的記憶體錯誤在伺服器上非常常見。軟離線是核心針對具有(過多)已糾正記憶體錯誤的記憶體頁面的解決方案。

對於不同型別的頁面,軟離線具有不同的行為/成本。

  • 對於一個原始錯誤頁面,軟離線會將使用中的頁面內容遷移到一個新的原始頁面。

  • 對於透明巨頁的一部分頁面,軟離線會將透明巨頁拆分為原始頁面,然後僅遷移原始錯誤頁面。因此,使用者透明地由少了 1 個巨頁支援,影響記憶體訪問效能。

  • 對於 HugeTLB 巨頁的一部分頁面,軟離線首先遷移整個 HugeTLB 巨頁,在此期間會消耗一個空閒巨頁作為遷移目標。然後,原始巨頁被分解為原始頁面,沒有補償,從而使 HugeTLB 池的容量減少 1。

在透明和 HugeTLB 情況下,由使用者決定是在可靠性(遠離脆弱的物理記憶體)與效能/容量影響之間進行選擇。

對於所有架構,enable_soft_offline 控制是否對記憶體頁進行軟離線。當設定為 1 時,核心會在認為需要時嘗試軟離線頁面。當設定為 0 時,核心對軟離線頁面的請求返回 EOPNOTSUPP。其預設值為 1。

值得一提的是,將 enable_soft_offline 設定為 0 後,以下軟離線頁面的請求將不會執行

  • 來自 RAS 可糾正錯誤收集器的軟離線頁請求。

  • 在 ARM 上,來自 GHES 驅動程式的軟離線頁請求。

  • 在 PARISC 上,來自頁面解除分配表的軟離線頁請求。

extfrag_threshold

此引數影響核心是壓縮記憶體還是直接回收以滿足高階分配。debugfs 中的 extfrag/extfrag_index 檔案顯示了系統中每個區域每個階的碎片化指數。接近 0 的值表示分配將因記憶體不足而失敗,接近 1000 的值表示失敗是由於碎片化,而 -1 表示只要滿足水印,分配就會成功。

如果碎片化指數 <= extfrag_threshold,核心將不會在區域中壓縮記憶體。預設值為 500。

highmem_is_dirtyable

僅適用於啟用 CONFIG_HIGHMEM 的系統(32 位系統)。

此引數控制是否考慮高記憶體進行髒寫者限制。預設情況下不考慮,這意味著只有核心直接可見/可用的記憶體才能被弄髒。結果,在記憶體量大且低記憶體基本耗盡的系統上,寫入者可能會過早被限制,並且流式寫入會變得非常緩慢。

將值更改為非零將允許更多記憶體被弄髒,從而允許寫入者寫入更多資料,這些資料可以更有效地重新整理到儲存。請注意,這也會帶來過早 OOM killer 的風險,因為某些寫入者(例如直接塊裝置寫入)只能使用低記憶體,並且它們可以用髒資料填滿低記憶體而沒有任何限制。

hugetlb_shm_group

hugetlb_shm_group 包含允許使用 hugetlb 頁建立 SysV 共享記憶體段的組 ID。

laptop_mode

laptop_mode 是一個控制“筆記本模式”的旋鈕。由這個旋鈕控制的所有內容都在如何使用筆記本模式省電中討論。

legacy_va_layout

如果非零,此 sysctl 將停用新的 32 位 mmap 佈局 - 核心將為所有程序使用舊版 (2.4) 佈局。

lowmem_reserve_ratio

對於高記憶體機器上的某些特殊工作負載,核心允許從“低記憶體”區域分配程序記憶體是危險的。這是因為該記憶體可能透過 mlock() 系統呼叫或由於交換空間不可用而被鎖定。

在大容量高記憶體機器上,這種可回收低記憶體的不足可能是致命的。

因此,Linux 頁分配器有一種機制,可以防止可能使用高記憶體的分配使用過多的低記憶體。這意味著一定量的低記憶體被保護,避免被捕獲到鎖定的使用者記憶體中。

(同樣的論點適用於舊的 16MB ISA DMA 區域。此機制還將保護該區域免受可能使用高記憶體或低記憶體的分配)。

可調引數lowmem_reserve_ratio決定了核心保護這些低區域的積極程度。

如果您的機器使用高記憶體或 ISA DMA,並且您的應用程式使用 mlock(),或者您在沒有交換空間的情況下執行,那麼您可能應該更改 lowmem_reserve_ratio 設定。

lowmem_reserve_ratio 是一個數組。您可以透過讀取此檔案來檢視它們

% cat /proc/sys/vm/lowmem_reserve_ratio
256     256     32

但是,這些值不直接使用。核心根據它們計算每個區域的保護頁數。這些在 /proc/zoneinfo 中顯示為保護頁陣列,如下所示。(這是一個 x86-64 機器的示例)。每個區域都有一個這樣的保護頁陣列

Node 0, zone      DMA
  pages free     1355
        min      3
        low      3
        high     4
      :
      :
    numa_other   0
        protection: (0, 2004, 2004, 2004)
      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  pagesets
    cpu: 0 pcp: 0
        :

這些保護被新增到分數中,以判斷該區域是否應該用於頁面分配或是否應該被回收。

在此示例中,如果此 DMA 區域需要普通頁面(索引=2),並且水印 [WMARK_HIGH] 用於水印,則核心判斷不應使用此區域,因為 pages_free(1355) 小於水印 + protection[2] (4 + 2004 = 2008)。如果此保護值為 0,則此區域將用於普通頁面需求。如果需求是 DMA 區域(索引=0),則使用 protection[0] (=0)。

zone[i] 的 protection[j] 由以下表達式計算

(i < j):
  zone[i]->protection[j]
  = (total sums of managed_pages from zone[i+1] to zone[j] on the node)
    / lowmem_reserve_ratio[i];
(i = j):
   (should not be protected. = 0;
(i > j):
   (not necessary, but looks 0)

lowmem_reserve_ratio[i] 的預設值為

256

(如果 zone[i] 表示 DMA 或 DMA32 區域)

32

(其他)

如上表達式所示,它們是比率的倒數。256 表示 1/256。保護頁數約為節點上總管理頁的“0.39%”。

如果您想保護更多頁面,較小的值是有效的。最小值為 1 (1/1 -> 100%)。小於 1 的值將完全停用頁面保護。

max_map_count:

此檔案包含程序可能擁有的最大記憶體對映區域數。記憶體對映區域是呼叫 malloc 的副作用、直接透過 mmap、mprotect 和 madvise,以及載入共享庫時使用的。

雖然大多數應用程式需要少於一千個對映,但某些程式,特別是 malloc 偵錯程式,可能會消耗大量對映,例如,每次分配多達一到兩個對映。

預設值為 65530。

mem_profiling

啟用記憶體分析(當 CONFIG_MEM_ALLOC_PROFILING=y 時)

1:啟用記憶體分析。

0:停用記憶體分析。

啟用記憶體分析會對所有記憶體分配引入少量效能開銷。

預設值取決於 CONFIG_MEM_ALLOC_PROFILING_ENABLED_BY_DEFAULT。

memory_failure_early_kill:

控制當硬體在後臺檢測到核心無法處理的未糾正記憶體錯誤(通常是記憶體模組中的 2 位錯誤)時如何終止程序。在某些情況下(例如頁面在磁碟上仍有有效副本),核心將透明地處理故障,而不會影響任何應用程式。但如果沒有其他最新資料副本,它將終止以防止任何資料損壞蔓延。

1:一旦檢測到損壞,立即終止所有已對映損壞且無法重新載入頁面的程序。請注意,這不支援少數型別的頁面,例如核心內部分配的資料或交換快取,但適用於大多數使用者頁面。

0:僅從所有程序中取消對映損壞的頁面,並僅終止嘗試訪問該頁面的程序。

終止操作使用 BUS_MCEERR_AO 的可捕獲 SIGBUS 完成,因此程序如果需要可以處理此訊號。

這僅在具有高階機器檢查處理功能的架構/平臺上啟用,並取決於硬體能力。

應用程式可以使用 PR_MCE_KILL prctl 單獨覆蓋此設定

memory_failure_recovery

啟用記憶體故障恢復(如果平臺支援)

1: 嘗試恢復。

0: 記憶體故障時始終恐慌。

min_free_kbytes

這用於強制 Linux VM 保持最小數量的空閒千位元組。VM 使用此數字為系統中的每個低記憶體區域計算一個水印 [WMARK_MIN] 值。每個低記憶體區域根據其大小按比例獲得一定數量的保留空閒頁。

需要一些最小量的記憶體來滿足 PF_MEMALLOC 分配;如果您將其設定低於 1024KB,您的系統將變得微妙地損壞,並在高負載下容易出現死鎖。

將其設定過高將立即導致您的機器 OOM。

min_slab_ratio

此功能僅在 NUMA 核心上可用。

每個區域中總頁面數的百分比。在區域回收(從本地區域回退發生)時,如果區域中超過此百分比的頁面是可回收的 slab 頁面,則將回收 slab。這確保了 slab 的增長保持在控制之下,即使在很少執行全域性回收的 NUMA 系統中也是如此。

預設值為 5%。

請注意,slab 回收是以每區/節點的方式觸發的。回收 slab 記憶體的過程目前不是節點特定的,並且可能不快。

min_unmapped_ratio

此功能僅在 NUMA 核心上可用。

這是每個區域中總頁數的百分比。區域回收僅在超過此百分比的頁處於 zone_reclaim_mode 允許回收的狀態時才會發生。

如果 zone_reclaim_mode 的值透過 OR 運算包含 4,則該百分比將與所有檔案支援的未對映頁面(包括交換快取頁面和 tmpfs 檔案)進行比較。否則,僅考慮由普通檔案而非 tmpfs 檔案和類似檔案支援的未對映頁面。

預設值為 1%。

mmap_min_addr

此檔案指示使用者程序將被限制 mmap 的地址空間量。由於核心空指標解引用錯誤可能會意外地根據記憶體前幾頁中的資訊進行操作,因此不應允許使用者空間程序寫入這些頁面。預設情況下,此值設定為 0,並且安全模組將不強制執行任何保護。將此值設定為例如 64k 將允許絕大多數應用程式正常工作,併為未來潛在的核心錯誤提供深度防禦。

mmap_rnd_bits

此值可用於選擇用於確定由 mmap 分配產生的 vma 區域基地址隨機偏移的位數,適用於支援調整地址空間隨機化的架構。此值將受架構支援的最小和最大值的限制。

此值可以在啟動後使用 /proc/sys/vm/mmap_rnd_bits 可調引數進行更改

mmap_rnd_compat_bits

此值可用於選擇用於確定由 mmap 分配產生的 vma 區域基地址隨機偏移的位數,用於在相容模式下執行的應用程式,適用於支援調整地址空間隨機化的架構。此值將受架構支援的最小和最大值的限制。

此值可以在啟動後使用 /proc/sys/vm/mmap_rnd_compat_bits 可調引數進行更改

nr_hugepages

更改巨頁池的最小大小。

請參閱巨頁 (HugeTLB Pages)

hugetlb_optimize_vmemmap

當“struct page”(include/linux/mm_types.h 中定義的結構)的大小不是 2 的冪(一種不尋常的系統配置可能導致此情況)時,此旋鈕不可用。

啟用(設定為 1)或停用(設定為 0)HugeTLB Vmemmap 最佳化 (HVO)。

一旦啟用,後續從 buddy allocator 分配的 HugeTLB 頁面的 vmemmap 頁面將得到最佳化(每 2MB HugeTLB 頁面 7 頁,每 1GB HugeTLB 頁面 4095 頁),而已分配的 HugeTLB 頁面將不會被最佳化。當這些最佳化的 HugeTLB 頁面從 HugeTLB 池釋放到 buddy allocator 時,表示該範圍的 vmemmap 頁面需要重新對映,並且之前丟棄的 vmemmap 頁面需要重新分配。如果您的用例是 HugeTLB 頁面是“即時”分配的(例如,從不明確使用“nr_hugepages”分配 HugeTLB 頁面,而只是設定“nr_overcommit_hugepages”,這些超額提交的 HugeTLB 頁面是“即時”分配的),而不是從 HugeTLB 池中提取的,您應該權衡記憶體節省的好處與 HugeTLB 池和 buddy allocator 之間分配或釋放 HugeTLB 頁面的額外開銷(比以前慢約 2 倍)。另一個需要注意的行為是,如果系統處於嚴重的記憶體壓力下,它可能會阻止使用者將 HugeTLB 頁面從 HugeTLB 池釋放到 buddy allocator,因為 vmemmap 頁面的分配可能會失敗,如果您的系統遇到這種情況,您必須稍後重試。

一旦停用,後續從 buddy allocator 分配的 HugeTLB 頁面的 vmemmap 頁面將不會被最佳化,這意味著從 buddy allocator 分配時的額外開銷消失,而已最佳化的 HugeTLB 頁面將不受影響。如果您想確保沒有最佳化的 HugeTLB 頁面,您可以先將“nr_hugepages”設定為 0,然後停用此功能。請注意,將 nr_hugepages 寫入 0 將使任何“正在使用”的 HugeTLB 頁面成為多餘頁面。因此,這些多餘頁面仍然被最佳化,直到它們不再被使用。您需要等待這些多餘頁面被釋放,然後系統中才沒有最佳化的頁面。

nr_hugepages_mempolicy

在特定 NUMA 節點集上執行時更改巨頁池的大小。

請參閱巨頁 (HugeTLB Pages)

nr_overcommit_hugepages

更改巨頁池的最大大小。最大值為 nr_hugepages + nr_overcommit_hugepages。

請參閱巨頁 (HugeTLB Pages)

nr_trim_pages

此功能僅在 NOMMU 核心上可用。

此值調整了 2 的冪對齊 NOMMU mmap 分配的過量頁面修剪行為。

值為 0 完全停用分配修剪,而值為 1 則積極修剪過量頁面。任何大於或等於 1 的值都用作水印,在此水印處啟動分配修剪。

預設值為 1。

有關更多資訊,請參閱無 MMU 記憶體對映支援

numa_zonelist_order

此 sysctl 僅用於 NUMA,並且已棄用。除了節點順序之外的任何值都將失敗!

“記憶體從何處分配”由 zonelists 控制。

(此文件為簡單解釋,忽略 ZONE_HIGHMEM/ZONE_DMA32。您可以將 ZONE_DMA 理解為 ZONE_DMA32...)

在非 NUMA 情況下,GFP_KERNEL 的 zonelist 排序如下:ZONE_NORMAL -> ZONE_DMA。這意味著只有當 ZONE_NORMAL 不可用時,GFP_KERNEL 的記憶體分配請求才會從 ZONE_DMA 獲取記憶體。

在 NUMA 情況下,您可以考慮以下兩種排序型別。假設 2 節點 NUMA,以下是 Node(0) 的 GFP_KERNEL 的 zonelist

(A) Node(0) ZONE_NORMAL -> Node(0) ZONE_DMA -> Node(1) ZONE_NORMAL
(B) Node(0) ZONE_NORMAL -> Node(1) ZONE_NORMAL -> Node(0) ZONE_DMA.

型別(A)為 Node(0) 上的程序提供最佳區域性性,但 ZONE_DMA 將在 ZONE_NORMAL 耗盡之前使用。這增加了 ZONE_DMA 記憶體不足 (OOM) 的可能性,因為 ZONE_DMA 往往較小。

型別(B)無法提供最佳區域性性,但對 DMA 區域的 OOM 更具魯棒性。

型別 (A) 稱為“節點”順序。型別 (B) 稱為“區域”順序。

“節點順序”按節點排序 zonelist,然後按每個節點內的區域排序。指定“[Nn]ode”用於節點順序。

“區域順序”按區域型別排序 zonelist,然後按每個區域內的節點排序。指定“[Zz]one”用於區域順序。

指定“[Dd]efault”請求自動配置。

在 32 位系統上,普通區域需要為核心可訪問的分配保留,因此將選擇“區域”順序。

在 64 位系統上,需要 DMA32/DMA 的裝置相對較少,因此將選擇“節點”順序。

除非對您的系統/應用程式造成問題,否則建議使用預設順序。

oom_dump_tasks

當核心執行 OOM-killing 時,啟用系統範圍的任務轉儲(不包括核心執行緒),幷包含 pid、uid、tgid、vm 大小、rss、pgtables_bytes、swapents、oom_score_adj 分數和名稱等資訊。這有助於確定為什麼呼叫了 OOM killer,識別導致它的惡意任務,並確定 OOM killer 為什麼選擇殺死它所選擇的任務。

如果此值設定為零,則此資訊將被抑制。在具有數千個任務的超大型系統上,為每個任務轉儲記憶體狀態資訊可能不可行。此類系統在 OOM 條件下不應被迫承受效能損失,因為可能不需要這些資訊。

如果此值設定為非零,則只要 OOM killer 實際殺死了一個佔用大量記憶體的任務,就會顯示此資訊。

預設值為 1(啟用)。

oom_kill_allocating_task

此選項用於啟用或停用在記憶體不足情況下終止觸發 OOM 的任務。

如果此值設定為零,則 OOM killer 將遍歷整個任務列表,並根據啟發式演算法選擇一個任務進行終止。這通常會選擇一個惡意佔用記憶體的任務,該任務在被終止時會釋放大量記憶體。

如果此值設定為非零,則 OOM killer 只會終止觸發記憶體不足狀況的任務。這避免了昂貴的任務列表掃描。

如果選擇了 panic_on_oom,則它優先於 oom_kill_allocating_task 中使用的任何值。

預設值為 0。

overcommit_kbytes

當 overcommit_memory 設定為 2 時,已提交的地址空間不允許超過交換空間加上此物理 RAM 量。見下文。

注意:overcommit_kbytes 是 overcommit_ratio 的對應項。一次只能指定其中一個。設定其中一個會停用另一個(讀取時顯示為 0)。

overcommit_memory

此值包含一個標誌,用於啟用記憶體過量承諾。

當此標誌為 0 時,核心會將使用者空間記憶體請求大小與總記憶體加上交換空間進行比較,並拒絕明顯的過量承諾。

當此標誌為 1 時,核心假裝記憶體總是充足,直到實際耗盡。

當此標誌為 2 時,核心使用“永不過量承諾”策略,嘗試防止任何記憶體過量承諾。請注意 user_reserve_kbytes 影響此策略。

此功能非常有用,因為有許多程式會“以防萬一”malloc() 大量記憶體,但實際使用量卻很少。

預設值為 0。

有關更多資訊,請參閱過量承諾記賬和 mm/util.c::__vm_enough_memory()。

overcommit_ratio

當 overcommit_memory 設定為 2 時,已提交的地址空間不允許超過交換空間加上此物理 RAM 百分比。見上文。

page-cluster

page-cluster 控制一次性從交換空間讀入的連續頁面的數量。這是頁面快取預讀的交換對應物。所提及的連續性並非指虛擬/物理地址上的連續,而是在交換空間上的連續——這意味著它們是一起被交換出去的。

它是一個對數值——設定為零意味著“1 頁”,設定為 1 意味著“2 頁”,設定為 2 意味著“4 頁”等等。零完全停用交換預讀。

預設值為三(一次八頁)。如果您的工作負載是交換密集型的,調整此值可能會帶來一些小好處。

較低的值意味著初始故障的延遲較低,但同時如果它們本可以成為連續頁面預讀的一部分,則後續故障的額外故障和 I/O 延遲會增加。

page_lock_unfairness

此值決定了頁面鎖可以從等待者手中被“偷走”的次數。在鎖被偷走此檔案中指定的次數(預設值為 5)之後,“公平鎖交接”語義將生效,並且只有當鎖可以被獲取時,等待者才會被喚醒。

panic_on_oom

此選項用於啟用或停用記憶體不足時恐慌功能。

如果此設定為 0,核心將殺死一些流氓程序,稱為 oom_killer。通常,oom_killer 可以殺死流氓程序,系統將得以倖存。

如果此設定為 1,當記憶體不足發生時,核心會恐慌。但是,如果一個程序透過 mempolicy/cpusets 限制了其節點使用,並且這些節點達到記憶體耗盡狀態,一個程序可能會被 oom-killer 殺死。在這種情況下不會發生恐慌。因為其他節點的記憶體可能仍然空閒。這意味著系統整體狀態可能還沒有到致命的地步。

如果此設定為 2,即使在上述情況下,核心也會強制恐慌。即使在記憶體 cgroup 下發生 OOM,整個系統也會恐慌。

預設值為 0。

1 和 2 用於叢集的故障轉移。請根據您的故障轉移策略進行選擇。

panic_on_oom=2 + kdump 為您提供了非常有力的工具來調查 OOM 發生的原因。您可以獲取快照。

percpu_pagelist_high_fraction

這是每個區域中可以儲存到 per-cpu 頁列表中的頁的比例。它是一個上限,根據線上 CPU 數量進行劃分。最小值為 8,這意味著我們不允許每個區域中超過 1/8 的頁儲存在 per-cpu 頁列表中。此條目僅更改熱 per-cpu 頁列表的值。使用者可以指定一個數字,例如 100,以在 per-cpu 列表之間分配每個區域的 1/100。

每個 per-cpu 頁列表的批處理值保持不變,無論高比例的值如何,因此分配延遲不受影響。

初始值為零。核心使用此值根據區域的低水位線和本地線上 CPU 的數量設定高 pcp->high 標記。如果使用者向此 sysctl 寫入“0”,它將恢復到此預設行為。

stat_interval

虛擬機器統計資訊更新的時間間隔。預設值為 1 秒。

stat_refresh

任何讀取或寫入(僅限 root 使用者)都會將所有每 CPU 的 vm 統計資訊重新整理到其全域性總量中,以便在測試時提供更準確的報告,例如 cat /proc/sys/vm/stat_refresh /proc/meminfo

附帶影響是,它還會檢查負數總量(在其他地方報告為 0),如果發現任何負數,則會以 EINVAL 狀態“失敗”,並在 dmesg 中發出警告。(截至撰寫本文時,已知某些統計資訊有時會發現負數,但沒有不良影響:這些統計資訊的錯誤和警告已被抑制。)

numa_stat

此介面允許執行時配置 NUMA 統計資訊。

當頁面分配效能成為瓶頸,並且您可以容忍某些可能的工具損壞和 NUMA 計數器精度降低時,您可以這樣做

echo 0 > /proc/sys/vm/numa_stat

當頁面分配效能不是瓶頸並且您希望所有工具都能工作時,您可以這樣做

echo 1 > /proc/sys/vm/numa_stat

swappiness

此控制用於定義交換和檔案系統分頁的粗略相對 IO 成本,取值範圍為 0 到 200。在 100 時,VM 假定 IO 成本相等,因此將對頁快取和交換支援的頁面施加相同的記憶體壓力;較低的值表示交換 IO 更昂貴,較高的值表示更便宜。

請記住,在記憶體壓力下,檔案系統 IO 模式往往比交換的隨機 IO 更有效。最佳值需要透過實驗確定,並且還會因工作負載而異。

預設值為 60。

對於記憶體交換,例如 zram 或 zswap,以及在比檔案系統更快的裝置上進行交換的混合設定,可以考慮超過 100 的值。例如,如果對交換裝置的隨機 IO 平均比檔案系統 IO 快 2 倍,則 swappiness 應為 133(x + 2x = 200,2x = 133.33)。

在 0 時,核心不會啟動交換,直到一個區域中的空閒頁面和檔案支援頁面數量少於高水位線。

unprivileged_userfaultfd

此標誌控制非特權使用者可以使用 userfaultfd 系統呼叫的模式。將其設定為 0 以限制非特權使用者僅在使用者模式下處理頁面故障。在這種情況下,沒有 SYS_CAP_PTRACE 的使用者必須傳遞 UFFD_USER_MODE_ONLY 才能使 userfaultfd 成功。禁止使用 userfaultfd 處理來自核心模式的故障可能會使某些漏洞更難被利用。

將其設定為 1 以允許非特權使用者不受限制地使用 userfaultfd 系統呼叫。

預設值為 0。

控制 userfaultfd 許可權的另一種方法是使用 /dev/userfaultfd 而不是 userfaultfd(2)。請參閱Userfaultfd

user_reserve_kbytes

當 overcommit_memory 設定為 2(“永不過量分配”模式)時,保留 min(當前程序大小的 3%, user_reserve_kbytes) 的空閒記憶體。這是為了防止使用者啟動一個佔用大量記憶體的程序,導致他們無法恢復(殺死該程序)。

user_reserve_kbytes 預設設定為 min(當前程序大小的 3%, 128MB)。

如果此值減小到零,則將允許使用者透過單個程序分配所有空閒記憶體,減去 admin_reserve_kbytes。任何後續嘗試執行命令都將導致“fork: 無法分配記憶體”。

更改此設定會在應用程式請求記憶體時立即生效。

vfs_cache_pressure

此百分比值控制核心回收用於快取目錄和 inode 物件的記憶體的傾向。

在 vfs_cache_pressure=vfs_cache_pressure_denom 的預設值下,核心將嘗試以相對於 pagecache 和 swapcache 回收的“公平”速率回收目錄項和 inode。降低 vfs_cache_pressure 會使核心更傾向於保留目錄項和 inode 快取。當 vfs_cache_pressure=0 時,核心絕不會因記憶體壓力而回收目錄項和 inode,這很容易導致記憶體不足的情況。將 vfs_cache_pressure 增加到超過 vfs_cache_pressure_denom 會使核心更傾向於回收目錄項和 inode。

將 vfs_cache_pressure 顯著增加到超過 vfs_cache_pressure_denom 可能會對效能產生負面影響。回收程式碼需要獲取各種鎖才能找到可釋放的目錄和 inode 物件。當 vfs_cache_pressure 等於 (10 * vfs_cache_pressure_denom) 時,它將查詢比現有數量多十倍的可釋放物件。

注意:此設定應始終與 vfs_cache_pressure_denom 一起使用。

vfs_cache_pressure_denom

預設值為 100(允許的最小值)。需要相應的 vfs_cache_pressure 設定才能生效。

watermark_boost_factor

此因子控制記憶體碎片化時的回收級別。它定義了一個區域高水位線的百分比,當不同移動性的頁混合在頁塊中時,將回收該百分比的記憶體。其目的是讓整理在未來減少工作量,並提高未來高階分配(如 SLUB 分配、THP 和 hugetlbfs 頁)的成功率。

為了與 watermark_scale_factor 引數保持一致,單位是萬分之一。預設值 15,000 意味著如果由於碎片化導致頁塊混合,將回收高達高水位線 150% 的記憶體。回收級別由近期發生的碎片化事件數量決定。如果此值小於一個頁塊,則將回收一個頁塊的頁(例如,64 位 x86 上為 2MB)。提升因子為 0 將停用此功能。

watermark_scale_factor

此因子控制 kswapd 的積極性。它定義了節點/系統中剩餘記憶體量達到多少時 kswapd 會被喚醒,以及需要多少記憶體空閒時 kswapd 才會再次進入休眠狀態。

單位為萬分之一。預設值為 10,表示水印之間的距離是節點/系統中可用記憶體的 0.1%。最大值為 3000,即記憶體的 30%。

如果大量執行緒進入直接回收 (allocstall) 或 kswapd 過早進入休眠 (kswapd_low_wmark_hit_quickly),這可能表明 kswapd 為延遲原因維護的空閒頁面數量太少,無法滿足系統中發生的分配突發。此時可以使用此旋鈕相應地調整 kswapd 的積極性。

zone_reclaim_mode

zone_reclaim_mode 允許使用者設定在某個區域記憶體耗盡時,回收記憶體的積極程度。如果將其設定為零,則不進行區域回收。分配將從系統中其他區域/節點滿足。

這是透過 OR 運算組合的值

1

區域回收開啟

2

區域回收寫出髒頁

4

區域回收交換頁

zone_reclaim_mode 預設停用。對於檔案伺服器或受益於資料快取的工作負載,應停用 zone_reclaim_mode,因為快取效果可能比資料區域性性更重要。

如果已知工作負載已被分割槽,並且每個分割槽都適合 NUMA 節點內,並且訪問遠端記憶體會導致可測量的效能下降,則考慮啟用一個或多個 zone_reclaim 模式位。頁分配器在分配離節點頁面之前將採取額外措施。

允許區域回收寫出頁面可以阻止寫入大量資料的程序在其他節點上弄髒頁面。如果區域已滿,區域回收將寫出髒頁面,從而有效地限制程序。這可能會降低單個程序的效能,因為它無法再使用所有系統記憶體來緩衝傳出寫入,但它保留了其他節點上的記憶體,以便其他節點上執行的其他程序的效能不會受到影響。

允許常規交換有效地將分配限制在本地節點,除非透過記憶體策略或 cpuset 配置明確覆蓋。