標籤:des style blog http io color ar os 使用
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進磁碟後才能重新開始。
VM參數簡介