/proc/sys/vm虚拟内存参数
? ?給有cap_sys_admin權限的用戶保留的內存數量,默認值是min(free pages * 3%, 8MB)。這些內存是為了給管理員登錄和殺死進程恢復系統提供足夠的內存。
2.block_dump??? 如果設置的是非零值,則會啟用塊I/O調試。更多的關于塊I/O調試的信息可以參見Documentation/laptops/laptop-mode.txt。
3.compact_memory
? 只有在啟用了CONFIG_COMPACTION選項才有效。當向該文件(/proc/sys/vm/compact_memory)寫入1時,所有的內存域都會被壓縮,使空閑的內存盡可能形成連續的內存塊。
4.dirty_background_bytes
? 當臟頁所占的內存數量超過dirty_background_bytes時,內核的flusher線程開始回寫臟頁。
???注意:?dirty_background_bytes參數和?dirty_background_ratio參數是相對的,只能指定其中一個。當其中一個參數文件被寫入時,會立即開始計算臟頁限制,并且會將另一個參數的值清零。
5.dirty_background_ratio
? 當臟頁所占的百分比(相對于所有可用內存,即空閑內存頁+可回收內存頁)達到dirty_background_ratio時,內核的flusher線程開始回寫臟頁數據。所有可用內存不等于總的系統內存。
6.dirty_bytes? 當臟頁所占的內存數量達到dirty_bytes時,執行磁盤寫操作的進程自己開始回寫臟數據。
???注意:?dirty_bytes參數和?dirty_ratio參數是相對的,只能指定其中一個。當其中一個參數文件被寫入時,會立即開始計算臟頁限制,并且會將另一個參數的值清零
7.dirty_expire_centisecs
? 臟數據的過期時間,超過該時間后內核的flusher線程被喚醒時會將臟數據回寫到磁盤上,單位是百分之一秒。
8.dirty_ratio???當臟頁所占的百分比(相對于所有可用內存,即空閑內存頁+可回收內存頁)達到dirty_ratio時,執行磁盤寫操作的進程會自己開始回寫臟數據。所有可用內存不等于總的系統內存。
9.dirty_writeback_centisecs
? 內核的flusher線程會周期性地喚醒,然后將老的臟數據寫到磁盤上。?dirty_writeback_centisecs定義了喚醒的間隔,單位是百分之一秒。如果設置為0,則禁止周期性地喚醒回寫線程。
10.drop_caches? 向?/proc/sys/vm/drop_caches文件中寫入數值可以使內核釋放page cache,dentries和inodes緩存所占的內存。
? 只釋放pagecache:
??????? echo 1 >??/proc/sys/vm/drop_caches
? 只釋放dentries和inodes緩存:
??????? echo 2 >??/proc/sys/vm/drop_caches
? 釋放pagecache、dentries和inodes緩存:
??????? echo 3 >??/proc/sys/vm/drop_caches
? 這個操作不是破壞性操作,臟的對象(比如臟頁)不會被釋放,因此要首先運行sync命令。
11.?hugepages_treat_as_movable
? 這個參數用來控制是否可以從ZONE_MOVABLE內存域中分配大頁面。如果設置為非零,大頁面可以從ZONE_MOVABLE內存域分配。ZONE_MOVABLE內存域只有在指定了kernelcore啟動參數的情況下才會創建,如果沒有指定kernelcore啟動參數,?hugepages_treat_as_movable參數則沒有效果。
? 大頁面遷移在某些情況下是可用的,這取決于系統架構和大頁面的大小。如果大頁面支持遷移,從ZONE_MOVABLE內存域分配總是啟用的,會忽略?hugepages_treat_as_movable參數的值。換句話說,?hugepages_treat_as_movable參數只對不支持遷移的大頁面有效。
? 假設在你的系統中大頁面不能遷移,這個參數的一個用例是用戶可以通過啟用從ZONE_MOVABLE內存域分配大頁面的特性,讓大頁面池擴展性更好。這是因為在ZONE_MOVABLE內存域,頁面的回收、遷移和壓縮工作的更好,也更容易獲得連續的內存塊。注意,為不能遷移的大頁面使用ZONE_MOVABLE會損害內存熱移除等特性,因此需要用戶自己來權衡。
12.?lowmem_reserve_ratio
? 在有高端內存的機器上,從低端內存域給應用層進程分配內存是很危險的,因為這些內存可以通過mlock()系統鎖定,或者變成不可用的swap空間。在有大量高端內存的機器上,缺少可以回收的低端內存是致命的。因此如果可以使用高端內存,Linux頁面分配器不會使用低端內存。這意味著,內核會保護一定數量的低端內存,避免被用戶空間鎖定。
? 這個參數同樣可以適用于16M的ISA DMA區域,如果可以使用低端或高端內存,則不會使用該區域。
? lowmem_reserve_ratio參數決定了內核保護這些低端內存域的強度。預留的內存值和lowmem_reserve_ratio數組中的值是倒數關系,如果值是256,則代表1/256,即為0.39%的zone內存大小。如果想要預留更多頁,應該設更小一點的值。更多的信息參考?這里?。
13.max_map_count
? 進程中內存映射區域的最大數量。在調用malloc,直接調用mmap和mprotect和加載共享庫時會產生?內存映射區域?。雖然大多數程序需要的內存映射區域不超過1000個,但是特定的程序,特別是malloc調試器,可能需要很多,例如每次分配都會產生一到兩個內存映射區域。默認值是65536。
14.memory_failure_early_kill
? 該參數控制在某個內核無法處理的內存錯誤發生(由硬件檢測到)時,如何來殺死進程。在某些情況下(例如內存頁在磁盤上仍然有一個有效的副本),內核會透明地處理錯誤,不會影響任何程序。但是如果沒有任何其他的副本,內核會殺死進程避免內存錯誤的影響擴大。
? 1:一旦內存錯誤被檢測到,殺死所有和被損壞的、不能恢復的內存頁相關的進程。注意,這里不支持幾種類型的頁面,例如內核內部分配的數據或者swap緩存,但是對用戶層的大多數頁面都支持。
? 0:從所有相關的進程中取消對被損壞頁面的映射,只殺死試圖訪問該頁面的進程。
? 殺死進程是通過發送SIGBUS信號,進程可以通過捕捉這個信號來處理。
? 只有在支持先進的機器檢查處理機制的架構或平臺上才能使用該特性,依賴于硬件的能力。
? 程序可以調用prctl系統調用的PR_MCE_KILL命令來重置這個配置。
15.?memory_failure_recovery
? 啟用內存錯誤恢復(如果平臺支持的話)
1:嘗試恢復? 0:當發生內存錯誤時panic
16.min_free_kbytes
? 這個參數用來指定強制Linux VM保留的內存區域的最小值,單位是kb。VM會使用這個參數的值來計算系統中每個低端內存域的watermark[WMARK_MIN]值。每個低端內存域都會根據這個參數保留一定數量的空閑內存頁。
? 一部分少量的內存用來滿足PF_MEMALLOC類型的內存分配請求。如果進程設置了PF_MEMALLOC標志,表示不能讓這個進程分配內存失敗,可以分配保留的內存。并不是所有進程都有的。kswapd、direct reclaim的process等在回收的時候會設置這個標志,因為回收的時候它們還要為自己分配一些內存。有了PF_MEMALLOC標志,它們就可以獲得保留的低端內存。
? 如果設置的值小于1024KB,系統很容易崩潰,在負載較高時很容易死鎖。如果設置的值太大,系統會經常OOM。
17.min_slab_ratio
? 該參數只在NUMA內核中才有效,它是一個相對于每個內存域所有頁面的百分比。
? 如果一個內存域中可以回收的slab頁面所占的百分比(應該是相對于當前內存域的所有頁面)超過min_slab_ratio,在回收區的slabs會被回收。這樣可以確保即使在很少執行全局回收的NUMA系統中,slab的增長也是可控的。
? 注意,slab的回收在單個內存域或節點中發生。回收slab內存的進程現在并不是特定于某個節點,回收可能不及時。
? 默認的百分比是5。
18.min_unmapped_ratio
? 該參數只在NUMA內核中有效,它是一個相對于每個內存域所有頁面的百分比。
? 只有在當前內存域中處于zone_reclaim_mode允許回收狀態的內存頁所占的百分比超過min_unmapped_ratio時,內存域才會執行回收操作。
? 如果zone_reclaim_mode的值是4,這個百分比(應該是百分比對應的頁面數量)和所有基于文件的未映射頁數比較,包括swapcache頁和tmpfs文件。否則,只考慮基于普通文件的未映射頁,不包括tmpfs文件。
? 默認的百分比是1。
19.?mmap_min_addr
? 該參數定義了用戶進程能夠映射的最低內存地址。由于最開始的幾個內存頁面用于處理內核空引用錯誤,這些頁面不允許寫入。該參數的默認值是0,表示安全模塊不需要強制保護最開始的頁面。如果設置為64K,可以保證大多數的程序運行正常,避免比較隱蔽的內核BUG。
20.?oom_dump_tasks
? 如果啟用,在內核執行OOM-killing時會打印系統內進程的信息(不包括內核線程),信息包括pid、uid、tgid、vm size、rss、nr_ptes,swapents,oom_score_adj和進程名稱。這些信息可以幫助找出為什么OOM killer被執行,找到導致OOM的進程,以及了解為什么進程會被選中。
? 如果將參數置為0,不會打印系統內進程的信息。對于有數千個進程的大型系統來說,打印每個進程的內存狀態信息并不可行。這些信息可能并不需要,因此不應該在OOM的情況下犧牲性能來打印這些信息。
? 如果設置為非零值,任何時候只要發生OOM killer,都會打印系統內進程的信息。
? 默認值是1(啟用)。
21.?oom_kill_allocating_task
? 控制在OOM時是否殺死觸發OOM的進程。
? 如果設置為0,OOM killer會掃描進程列表,選擇一個進程來殺死。通常都會選擇消耗內存內存最多的進程,殺死這樣的進程后可以釋放大量的內存。
? 如果設置為非零值,OOM killer只會簡單地將觸發OOM的進程殺死,避免遍歷進程列表(代價比較大)。
? 如果panic_on_oom被設置,則會忽略oom_kill_allocating_task的值。
默認值是0。22.page-cluster
? 該參數控制一次寫入或讀出swap分區的頁面數量。它是一個對數值,如果設置為0,表示1頁;如果設置為1,表示2頁;如果設置為2,則表示4頁。如果設置為0,則表示完全禁止預讀取。
? 默認值是3(一次8頁)。如果swap比較頻繁,調整該值的收效不大。
? 該參數的值越小,在處理最初的頁面錯誤時延遲會越低。但如果隨后的頁面錯誤對應的頁面也是在連續的頁面中,則會有I/O延遲。
23.panic_on_oom
? 控制內核在OOM時是否panic。
? 如果設置為0,內核會殺死內存占用過多的進程。通常殺死內存占用最多的進程,系統就會恢復。
? 如果設置為1,在發生OOM時,內核會panic。然而,如果一個進程通過內存策略或進程綁定限制了可以使用的節點,并且這些節點的內存已經耗盡,oom-killer可能會殺死一個進程來釋放內存。在這種情況下,內核不會panic,因為其他節點的內存可能還有空閑,這意味著整個系統的內存狀況還沒有處于崩潰狀態。
? 如果設置為2,在發生OOM時總是會強制panic,即使在上面討論的情況下也一樣。即使在memory cgroup限制下發生的OOM,整個系統也會panic。
默認值是0。? 將該參數設置為1或2,通常用于集群的故障切換。選擇何種方式,取決于你的故障切換策略。
? panic_on_oom=2和kdump一起使用,可以給你更多的信息,便于定位發生OOM的原因。
24.stat_interval
? VM統計信息更新的時間間隔,默認值是1s。
25.swappiness? 該參數控制是否使用swap分區,以及使用的比例。設置的值越大,內核會越傾向于使用swap。如果設置為0,內核只有在看空閑的和基于文件的內存頁數量小于內存域的高水位線(應該指的是watermark[high])時才開始swap。
默認值是60。26.vfs_cache_pressure
? 控制內核回收用于dentry和inode cache內存的傾向。
? 默認值是100,內核會根據pagecache和swapcache的回收情況,讓dentry和inode cache的內存占用量保持在一個相對公平的百分比上。減小vfs_cache_pressure會讓內核更傾向于保留dentry和inode cache。當vfs_cache_pressure等于0,在內存緊張時,內核也不會回收dentry和inode cache,這容易導致OOM。如果vfs_cache_pressure的值超過100,內核會更傾向于回收dentry和inode cache。
27.zone_reclaim_mode
? 該參數只有在啟用CONFIG_NUMA選項時才有效。
???zone_reclaim_mode用來控制在內存域OOM時,如何來回收內存。如果設置為0,則禁止內存域回收,從系統中其他內存域或節點來滿足內存分配請求。
? 這個參數可以使用下面的值通過或運算來設置:
???? 1???????? = 啟用內存域回收
???? 2???????? =??刷臟頁回收內存
???? 4???????? = 通過swap回收內存
? 如果檢測到從其他內存域分配內存會造成性能下降,啟動的時候會將zone_reclaim_mode設置為1。頁面分配器在從節點分配頁面前,會先回收容易重用的頁面(當前未使用的pagecache頁面)。
? 如果系統是用作文件服務器,所有的內存都可以用作緩存磁盤上的文件,這種情況下關閉內存域回收是有好處的,緩存的作用要比數據的局部性作用大。
? 通過刷臟頁進行內存域回收,會阻止寫入大量數據的進程在其他節點上產生臟頁。如果內存域填滿了,會刷出臟頁釋放內存,因此可以使進程節流。這可能會降低單個進程的性能,因為它不能使用系統所有的內存來緩沖寫入的數據,但是使用其他節點的進程不會受到影響。
? 通過swap釋放內存可以將分配嚴格限制在本地節點,除非明確使用了特定的內存策略或綁定設置來覆蓋這個設置。
總結
以上是生活随笔為你收集整理的/proc/sys/vm虚拟内存参数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python 利用numpy进行数据分析
- 下一篇: logstash 利用drop 丢弃过滤