VM參數簡介

block_dumpnode

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_ratioapp

默認值 :10性能

參數意義:當髒頁所佔的百分比(相對於全部可用內存,即空閒內存頁+可回收內存頁)達到dirty_background_ratio時內核的pdflush線程開始回寫髒頁。增大會使用更多內存用於緩衝,能夠提升系統的讀寫性能。當須要持續、恆定的寫入場合時,應該下降該數值。ui

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

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進磁盤後才能從新開始。

相關文章
相關標籤/搜索