VM參數簡介


block_dump

Linux 內核里提供了一個 block_dump 參數用來把 block 讀寫(WRITE/READ)狀況轉存(dump)到日志里,這樣可以通過 dmesg 命令來查看。

該參數表示是否打開Block Debug模式,用於記錄所有的讀寫及Dirty Block寫回動作。 缺省設置:0,表示禁用Block Debug

將這個值設置為非零值,則在dmesg里記錄各進程的block IO狀況

dirty_background_bytes

當臟頁所占的內存數量超過dirty_background_bytes時,內核的pdflush線程開始回寫臟頁。

dirty_background_ratio

默認值 :10

參數意義:當臟頁所占的百分比(相對於所有可用內存,即空閑內存頁+可回收內存頁)達到dirty_background_ratio時內核的pdflush線程開始回寫臟頁。增大會使用更多內存用於緩沖,可以提高系統的讀寫性能。當需要持續、恆定的寫入場合時,應該降低該數值。

注意:dirty_background_bytes參數和dirty_background_ratio參數是相對的,只能指定其中一個。當其中一個參數文件被寫入時,會立即開始計算臟頁限制,並且會將另一個參數的值清零。

dirty_bytes

當臟頁所占的內存數量達到dirty_bytes時,執行磁盤寫操作的進程自己開始回寫臟數據。

  注意:dirty_bytes參數和dirty_ratio參數是相對的,只能指定其中一個。當其中一個參數文件被寫入時,會立即開始計算臟頁限制,並且會將另一個參數的值清零

dirty_ratio

默認值:40

參數意義:當臟頁所占的百分比(相對於所有可用內存,即空閑內存頁+可回收內存頁)達到dirty_ratio時,進程pdflush會自己開始回寫臟數據。增大會使用更多系統內存用於緩沖,可以提高系統的讀寫性能。當需要持續、恆定的寫入場合時,應該降低該數值。

dirty_background_ratio與dirty_ratio比較

dirty_ratio是屬於強制性的回寫,也就是說當一個內存區的臟頁達到這個比例時就會觸發內核內存管理把臟頁強制回寫的流程,但dirty_background_ratio是屬於軟性的行為,因為這是透過pdflush內核線程進行的流程,可以在后台執行對這些臟頁面回寫,並不會因此影響到當下正在執行中的過程。 所以看Linux內核中預設的比例是臟頁達到5%的比例時就會先透過pdflush內核線程進行回寫,當臟頁達到10%比例時,就等於是一個很嚴重的狀況,此時就會在平衡臟頁面流程中觸發強制的回寫,讓系統可以回復到原本預設合理的狀態。

dirty_expire_centisecs

默認值:2999參數意義:用來指定內存中數據是多長時間才算臟(dirty)數據。指定的值是按100算做一秒計算。只有當超過這個值后,才會觸發內核進程pdflush將dirty數據寫到磁盤。

dirty_writeback_centisecs

默認值:499這個參數會觸發pdflush回寫進程定期喚醒並將old數據寫到磁盤。每次的喚醒的間隔,是以數字100算做1秒。如果將這項值設為500就相當5秒喚醒pdflush進程。如果將這項值設為0就表示完全禁止定期回寫數據。

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命令。

注:這個只能是手動釋放

laptop_mode

Linux 內核在 I/O 系統上支持一種“筆記本模式”。在“筆記本模式”下,內核更智能的使用 I/O 系統,它會盡量使磁盤處於低能耗的狀態下。“筆記本模式”會將許多的 I/O 操作組織在一起,一次完成,而在每次的磁盤 I/O 之間是默認長達 10 分鍾的非活動期,這樣會大大減少磁盤啟動的次數。為了完成這么長時間的非活動期,內核就要在一次活動期時完成盡可能多的 I/O 任務。在一次活動期間,要完成大量的預讀,然后將所有的緩沖同步。在非活動期間,寫操作會被阻擋在內存中(讀操作如果無法在 Cache 中滿足,則無法阻擋,因為用戶無法忍受這么長時間的延遲)。

 0:表示沒有啟用

非0:表示啟用

legacy_va_layout

該文件表示是否使用最新的32位共享內存mmap()系統調用,Linux支持的共享內存分配方式包括mmap(),Posix,System VIPC。
0,使用最新32位mmap()系統調用。
1,使用2.4內核提供的系統調用。

lowmem_reserve_ratio

保留的lowmem,3列分別為DMA/normal/HighMem

在有高端內存的機器上,從低端內存域給應用層進程分配內存是很危險的,因為這些內存可以通過mlock()系統鎖定,或者變成不可用的swap空間。在有大量高端內存的機器上,缺少可以回收的低端內存是致命的。因此如果可以使用高端內存,Linux頁面分配器不會使用低端內存。這意味着,內核會保護一定數量的低端內存,避免被用戶空間鎖定。

  這個參數同樣可以適用於16M的ISA DMA區域,如果可以使用低端或高端內存,則不會使用該區域。

  lowmem_reserve_ratio參數決定了內核保護這些低端內存域的強度。預留的內存值和lowmem_reserve_ratio數組中的值是倒數關系,如果值是256,則代表1/256,即為0.39%的zone內存大小。如果想要預留更多頁,應該設更小一點的值。

min_free_kbytes

這個參數用來指定強制Linux VM保留的內存區域的最小值,單位是kb。VM會使用這個參數的值來計算系統中每個低端內存域的watermark[WMARK_MIN]值。每個低端內存域都會根據這個參數保留一定數量的空閑內存頁。

  一部分少量的內存用來滿足PF_MEMALLOC類型的內存分配請求。如果進程設置了PF_MEMALLOC標志,表示不能讓這個進程分配內存失敗,可以分配保留的內存。並不是所有進程都有的。kswapd、direct reclaim的process等在回收的時候會設置這個標志,因為回收的時候它們還要為自己分配一些內存。有了PF_MEMALLOC標志,它們就可以獲得保留的低端內存。

  如果設置的值小於1024KB,系統很容易崩潰,在負載較高時很容易死鎖。如果設置的值太大,系統會經常OOM。

max_map_count

進程中內存映射區域的最大數量。在調用malloc,直接調用mmap和mprotect和加載共享庫時會產生內存映射區域。雖然大多數程序需要的內存映射區域不超過1000個,但是特定的程序,特別是malloc調試器,可能需要很多,例如每次分配都會產生一到兩個內存映射區域。默認值是65536。

mmap_min_addr

         指定用戶進程通過mmap可使用的最小虛擬內存地址,以避免其在低地址空間產生映射導致安全問題;如果非0,則不允許mmap到NULL頁,而此功能可在出現NULL指針時調試Kernel;mmap用於將文件映射至內存;該設置意味着禁止用戶進程訪問low 4k地址空間

nr_pdflush_threads

當前pdfflush線程數量,為read-only。

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(啟用)。

OOM killer(Out-Of-Memory killer):監控那些占用內存過大,尤其是瞬間很快消耗大量內存的進程,為了防止內存耗盡而內核會把該進程殺掉

oom_kill_allocating_task

控制在OOM時是否殺死觸發OOM的進程。

    如果設置為0,OOM killer會掃描進程列表,選擇一個進程來殺死。通常都會選擇消耗內存內存最多的進程,殺死這樣的進程后可以釋放大量的內存。

    如果設置為非零值,OOM killer只會簡單地將觸發OOM的進程殺死,避免遍歷進程列表(代價比較大)。如果panic_on_oom被設置,則會忽略oom_kill_allocating_task的值。

        默認值是0。

panic_on_oom

控制內核在OOM發生時時是否panic。

  如果設置為0,內核會殺死內存占用過多的進程。通常殺死內存占用最多的進程,系統就會恢復。

  如果設置為1,在發生OOM時,內核會panic。然而,如果一個進程通過內存策略或進程綁定限制了可以使用的節點,並且這些節點的內存已經耗盡,oom-killer可能會殺死一個進程來釋放內存。在這種情況下,內核不會panic,因為其他節點的內存可能還有空閑,這意味着整個系統的內存狀況還沒有處於崩潰狀態。

  如果設置為2,在發生OOM時總是會強制panic,即使在上面討論的情況下也一樣。即使在memory cgroup限制下發生的OOM,整個系統也會panic。

  默認值是0。

  將該參數設置為1或2,通常用於集群的故障切換。選擇何種方式,取決於你的故障切換策略。

overcommit_memory

默認值為:0從內核文檔里得知,該參數有三個值,分別是:0:當用戶空間請求更多的的內存時,內核嘗試估算出剩余可用的內存。

1:當設這個參數值為1時,內核允許超量使用內存直到用完為止,主要用於科學計算

2:當設這個參數值為2時,內核會使用一個決不過量使用內存的算法,即系統整個內存地址空間不能超過swap+50%的RAM值,50%參數的設定是在overcommit_ratio中設定。

overcommit_ratio

默認值為:50這個參數值只有在vm.overcommit_memory=2的情況下,這個參數才會生效。該值為物理內存比率,當overcommit_memory=2時,進程可使用的swap空間不可超過PM * overcommit_ratio/100

page-cluster

該參數控制一次寫入或讀出swap分區的頁面數量。它是一個對數值,如果設置為0,表示1頁;如果設置為1,表示2頁;如果設置為2,則表示4頁。如果設置為0,則表示完全禁止預讀取。

  默認值是3(一次8頁)。如果swap比較頻繁,調整該值的收效不大。

  該參數的值越小,在處理最初的頁面錯誤時延遲會越低。但如果隨后的頁面錯誤對應的頁面也是在連續的頁面中,則會有I/O延遲。

percpu_pagelist_fraction

This is the fraction of pages at most (high mark pcp->high) in each zone that are allocated for each per cpu page list. 

The min value for this is 8.  It means that we don't allow more than 1/8th of pages in each zone to be allocated in any single per_cpu_pagelist.

 This entry only changes the value of hot per cpu pagelists.  User can specify a number like 100 to allocate 1/100th of each zone to each per cpu page list.

The batch value of each per cpu pagelist is also updated as a result.  It is set to pcp->high/4.  The upper limit of batch is (PAGE_SHIFT * 8)

The initial value is zero.  Kernel does not use this value at boot time to set the high water marks for each per cpu page list.  If the user writes '0' to this sysctl, it will revert to this default behavior.

stat_interval

VM信息更新頻率,默認每1秒更新一次

scan_unevictable_pages

非零:掃描所有可回收的節點放到回收列表里

Swappiness

該參數控制是否使用swap分區,以及使用的比例。設置的值越大,內核會越傾向於使用swap。如果設置為0,內核只有在看空閑的和基於文件的內存頁數量小於內存域的高水位線(應該指的是watermark[high])時才開始swap。

  默認值是60。

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。

 

下面是pdflush線程(用於下刷緩存)根據部分參數執行的過程

pdflush 的行為受/proc/sys/vm中的參數控制
/proc/sys/vm/dirty_writeback_centisecs(200):1/100秒,多長時間喚醒pdflush將緩存頁數據寫入磁盤。默認5秒喚醒2個或更多線程。

 

pdflush的第一件事是讀取
/proc/sys/vm/dirty_expire_centisecs(300)
1/100秒。臟數據的過期時間(舊數據),在下一個周期內被寫入磁盤。

 

第二件事是判斷內存是否到了要寫入磁盤的限額,有參數決定:
/proc/sys/vm/dirty_background_ratio(5:4G的大約是168M)
百分值,保留過期頁緩存的最大值。是以MmeFree+Cached-Mapped的值為基准的

 

以下參數也會影響到pdflush
/proc/sys/vm/dirty_ratio(default (10)
總內存的最大百分比,系統所能擁有的最大臟頁緩存的總量。超過這個值,開啟pdflush寫入磁盤。如果cached增長快於pdflush,那么整個系統在40%的時候遇到I/O瓶頸,所有的I/O都要等待cache被pdflush進磁盤后才能重新開始。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM