Linux內核內存管理相關的配置參數(主要位于/proc/sys/vm/
目錄下),用于調整內存分配、緩存管理、交換機制、OOM(內存溢出)策略等核心內存行為。以下是對每個參數的詳細解釋:
admin_reserve_kbytes
block_dump
compaction_proactiveness
compact_memory
compact_unevictable_allowed
dirty_background_bytes
dirty_background_ratio
dirty_bytes
dirty_expire_centisecs
dirty_ratio
dirtytime_expire_seconds
dirty_writeback_centisecs
drop_caches
extfrag_threshold
hugetlb_shm_group
laptop_mode
legacy_va_layout
lowmem_reserve_ratio
max_map_count
memory_failure_early_kill
memory_failure_recovery
min_free_kbytes
mmap_min_addr
mmap_rnd_bits
mmap_rnd_compat_bits
nr_hugepages
nr_overcommit_hugepages
oom_dump_tasks
oom_kill_allocating_task
overcommit_kbytes
overcommit_memory
overcommit_ratio
page-cluster
page_lock_unfairness
panic_on_oom
percpu_pagelist_fraction
stat_interval
stat_refresh
swappiness
user_reserve_kbytes
vfs_cache_pressure
watermark_boost_factor
watermark_scale_factor
1. 內存預留與保護相關
-
admin_reserve_kbytes
為系統管理員(root用戶)預留的內存大小(單位:KB)。當系統內存緊張時,普通用戶可能無法分配內存,但root仍可使用預留內存進行緊急操作(如殺進程)。 -
user_reserve_kbytes
為每個非root用戶預留的內存大小(單位:KB)。防止單個用戶耗盡內存導致其他用戶無法操作。
2. 臟頁(Dirty Page)管理
臟頁指內存中已修改但尚未寫入磁盤的文件數據,內核需定期將其同步到磁盤以保證數據一致性。
-
dirty_background_bytes / dirty_background_ratio
觸發后臺同步(pdflush/flush線程)的臟頁閾值。dirty_background_bytes
:以字節為單位(絕對數值)。dirty_background_ratio
:以總內存的百分比為單位(相對比例)。
兩者同時存在時,bytes
優先級更高(非0時生效)。當臟頁達到此值,內核會在后臺異步同步臟頁,不阻塞用戶進程。
-
dirty_bytes / dirty_ratio
觸發強制同步的臟頁閾值。dirty_bytes
:以字節為單位。dirty_ratio
:以總內存的百分比為單位。
當臟頁達到此值,用戶進程的寫操作會被阻塞,直到臟頁同步到磁盤(避免臟頁過多導致數據丟失風險)。
-
dirty_expire_centisecs
臟頁在內存中停留的最長時間(單位:厘秒,1厘秒=0.01秒)。超過此時間的臟頁會被標記為“過期”,下次后臺同步時優先寫入磁盤。 -
dirtytime_expire_seconds
針對“僅修改時間”的臟頁(如僅更新文件atime/mtime,未修改內容)的過期時間(單位:秒)。用于優化僅元數據修改的場景。 -
dirty_writeback_centisecs
后臺同步線程(flush)的喚醒間隔(單位:厘秒)。即使臟頁未達閾值,線程也會定期喚醒檢查并同步過期臟頁。
3. 內存壓縮與碎片管理
-
compaction_proactiveness
內存碎片整理的“主動程度”(取值0-100)。值越高,內核越傾向于提前整理內存碎片,減少分配連續大頁時的失敗概率(適用于需要大頁的場景,如數據庫)。 -
compact_memory
手動觸發內存碎片整理的開關。寫入1
到該文件(echo 1 > /proc/sys/vm/compact_memory
),內核會立即嘗試合并零散內存頁為連續頁。 -
compact_unevictable_allowed
是否允許整理“不可驅逐”內存頁(如被鎖定的內存mlock()
)。1
表示允許,可提高碎片整理效果,但可能短暫影響鎖定內存的進程。 -
extfrag_threshold
內存外部碎片的閾值(0-1000)。外部碎片指內存中有足夠總空間,但無連續大頁可供分配的情況。值越低,內核越容易觸發碎片整理(如超過閾值則嘗試壓縮內存)。
4. 緩存與交換(Swap)管理
-
drop_caches
手動釋放頁緩存、目錄項緩存(dentry)和索引節點緩存(inode)的開關。- 寫入
1
:釋放頁緩存(文件數據緩存)。 - 寫入
2
:釋放dentry和inode緩存。 - 寫入
3
:釋放所有緩存。
注意:釋放緩存不會影響臟頁,需先同步臟頁(sync
命令)再執行,避免數據丟失。
- 寫入
-
swappiness
內核使用交換分區(Swap)的傾向程度(取值0-100)。- 值越高:越傾向于將內存中的不常用數據換出到Swap,為緩存騰出空間(如100時優先用Swap)。
- 值越低:越傾向于保留內存數據,僅在內存緊張時使用Swap(如0時盡量不換出,適用于內存充足的服務器)。
-
vfs_cache_pressure
內核回收目錄項(dentry)和索引節點(inode)緩存的傾向(取值0-200)。- 100:默認值,按正常比例回收緩存。
- <100:減少回收緩存的頻率(更傾向保留緩存,適合文件操作頻繁的場景)。
-
100:增加回收頻率(適合內存緊張,需釋放緩存給應用的場景)。
5. 大頁(HugePage)管理
大頁用于減少TLB(內存地址轉換緩存)的開銷,提升需要大量連續內存的應用(如數據庫、虛擬化)性能。
-
nr_hugepages
預分配的靜態大頁數量。大頁大小由系統架構決定(如x86_64默認2MB),分配后會長期占用內存,不被內核自動回收。 -
nr_overcommit_hugepages
動態分配的大頁數量(“超額提交”的大頁)。當靜態大頁不足時,內核可臨時分配此參數指定的大頁,用完后可回收。 -
hugetlb_shm_group
允許使用大頁共享內存(SHM_HUGETLB)的用戶組ID(GID)。非該組用戶無法分配大頁共享內存,用于權限控制。
6. OOM(內存溢出)策略
當內存耗盡且無法回收時,內核會觸發OOM killer殺死進程釋放內存。
-
oom_dump_tasks
OOM發生時是否打印所有進程的內存使用信息(1
=打印,0
=不打印)。幫助分析哪些進程消耗內存過多。 -
oom_kill_allocating_task
OOM時是否優先殺死“觸發內存分配的進程”(1
=優先殺死,0
=按評分選擇)。減少誤殺關鍵進程的概率(如果分配進程是“罪魁禍首”)。 -
panic_on_oom
OOM時是否觸發系統panic(0
=不panic,僅殺進程;1
=直接panic重啟;2
=僅當無法殺死進程時panic)。生產環境通常設為0,避免系統直接崩潰。 -
memory_failure_early_kill
當檢測到內存硬件錯誤(如壞頁)時,是否立即殺死訪問該壞頁的進程(1
=立即殺死,0
=嘗試恢復)。減少錯誤擴散風險。 -
memory_failure_recovery
是否開啟內存硬件錯誤恢復機制(1
=開啟,嘗試隔離壞頁并繼續運行;0
=關閉,直接panic)。依賴硬件支持(如ECC內存)。
7. 內存過量使用(Overcommit)管理
Linux默認允許進程“過量申請內存”(實際使用時才分配物理內存),通過以下參數控制策略。
-
overcommit_memory
內存過量使用的策略(取值0/1/2):0
(默認):智能判斷,拒絕明顯不可能的申請(如申請超過總內存+Swap的內存)。1
:允許所有過量申請(適合數據庫等需要預分配大量內存但實際使用少的場景)。2
:嚴格限制,申請內存不得超過(總內存 - 已使用) + Swap * overcommit_ratio%
,避免過量使用導致OOM。
-
overcommit_kbytes / overcommit_ratio
配合overcommit_memory=2
使用:overcommit_kbytes
:允許過量申請的內存上限(字節)。overcommit_ratio
:允許過量申請的比例(相對于Swap大小),默認50(即允許申請Swap的50%)。
8. 其他核心參數
-
min_free_kbytes
系統始終保留的最小空閑內存(KB)。確保內核和關鍵進程有足夠內存運行,避免內存完全耗盡。值過小可能導致系統卡頓,過大會浪費內存。 -
lowmem_reserve_ratio
針對不同內存區域(如DMA、Normal)的預留內存比例,防止某一區域內存耗盡影響其他區域(多適用于32位系統,64位系統較少調整)。 -
max_map_count
單個進程可創建的內存映射(mmap)數量上限。防止進程創建過多映射耗盡系統資源(如惡意程序)。 -
mmap_min_addr
進程通過mmap
分配內存的最低地址(單位:字節)。默認非0,用于防止用戶進程映射低地址內存(如NULL指針附近),避免某些漏洞攻擊(如緩沖區溢出)。 -
page-cluster
交換內存時一次讀取/寫入的連續頁數量(2^n,n為參數值)。值越高,交換效率越高(連續IO更快),但內存緊張時延遲可能增加。 -
watermark_boost_factor / watermark_scale_factor
內存水位線(Watermark)調整參數。用于動態調整內存空閑閾值,在內存緊張時提高回收力度,避免頻繁觸發OOM。
這些參數的默認值已適配多數場景,但可根據實際需求(如服務器、嵌入式、桌面)調整。修改時需謹慎(通過echo 值 > /proc/sys/vm/參數名
臨時生效),長期生效需寫入/etc/sysctl.conf
。