5.0 Virtual Memory介紹算法
虛擬內存就是採用硬盤對物理內存進行擴展,因此對可用內存的增長是要相對在一個有效範圍內的.內核會寫當前未使用內存塊的內容到硬盤上,此時這部份內存被用於其它用途.當再一次須要原始內容時,此時再讀回到內存中.這對於用戶來講,是徹底透明的;在Linux 下運行的程序可以看到,也僅僅是大量的可用內存,同時也不會留意到,偶爾還有部分是駐留在磁盤上的.固然,在硬盤上進行讀和寫,都是很慢的(大約會慢上千倍),相對於使用真實內存的話,所以程序沒法運行的更快.用硬盤的一部分做爲Virtual Memory,這就被稱爲」swap space」(譯註:交換空間).緩存
5.1 Virtual Memory Pagesbash
虛擬內存被分爲不少 pages(譯註:頁),在X86架構中,每一個虛擬內存頁爲 4KB.當內核寫內存到磁盤或者讀磁盤到內存,這就是一次寫內存到頁的過程.內核一般是在swap 分區和文件系統之間進行這樣的操做.架構
5.2 Kernel Memory Pagingapp
內存分頁在正常狀況下老是活躍的,與memory swapping(譯註:內存交換)之間不要搞錯了.內存分頁是指內核會按期將內存中的數據同步到硬盤,這個過程就是Memory Paging.日復一日,應用最終將會消耗掉全部的內存空間.考慮到這點,內核就必須常常掃描內存空間而且收回其中未被使用的內存頁,而後再從新分配內存空間給其餘應用使用.運維
5.3 The Page Frame Reclaim Algorithm(PFRA)(譯註:頁框回收算法)ide
PFRA 就是OS 內核用來回收並釋放內存空間的算法.PFRA 選擇哪一個內存頁被釋放是基於內存頁類型的.頁類型有如下幾種:工具
Unreclaimable –鎖定的,內核保留的頁面
Swappable –匿名的內存頁
Syncable –經過硬盤文件備份的內存頁
Discardable –靜態頁和被丟棄的頁性能
除了第一種(Unreclaimable)以外其他的均可以被PFRA進行回收.學習
與PFRA 相關的,還包括kswapd 內核線程以及Low On Memory Reclaiming(LMR算法) 這2種進程和實現.
5.4 kswapd
kswapd 進程負責確保內存空間老是在被釋放中.它監控內核中的pages_high和pages_low閥值.若是空閒內存的數值低於 pages_low,則每次 kswapd 進程啓動掃描並嘗試釋放32個free pages.並一直重複這個過程,直到空閒內存的數值高於 pages_high.
kswapd 進程完成如下幾個操做:
1,若是該頁處於未修改狀態,則將該頁放置回空閒列表中.
2,若是該頁處於已修改狀態並可備份迴文件系統,則將頁內容寫入到磁盤.
3,若是該頁處於已修改狀態但沒有任何磁盤備份,則將頁內容寫入到swap device.
# ps -ef | grep kswapd
root 30 1 0 23:01 ? 00:00:00 [kswapd0]
5.5 Kernel Paging with pdflush
pdflush 進程負責將內存中的內容和文件系統進行同步操做.也就是說,當一個文件在內存中進行修改後, pdflush 將負責寫回到磁盤上.
# ps -ef | grep pdflush
root 28 3 0 23:01 ? 00:00:00 [pdflush]
root 29 3 0 23:01 ? 00:00:00 [pdflush]
當內存中存在10% 的髒頁,pdflush 將被啓動同步髒頁迴文件系統裏.這個參數值能夠經過 vm.dirty_background_ratio 來進行調整.
(譯註:
Q:什麼是髒頁?
A:因爲內存中頁緩存的緩存做用,寫操做實際上都是延遲的.當頁緩存中的數據比磁盤存儲的數據還要更新時,那麼該數據就被稱作髒頁.)
# sysctl -n vm.dirty_background_ratio
10
在多數環境下,Pdflush與PFRA是獨立運行的,當內核調用LMR時,LMR 就觸發pdflush將髒頁寫入到磁盤裏.
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
在2.4 內核下,一個高負荷的內存環境中,系統將遇到交換過程當中不斷的崩潰.這是由於PFRA 從一個運行進程中,偷取其中一個內存頁並嘗試使用.致使結果就是,這個進程若是要回收那個頁時,要是沒有就會嘗試再去偷取這個頁,這樣一來,就愈來愈糟糕了.在2.6 內核下,使用」Swap token」修復了這個BUG,用來防止PFRA 不斷從一個進程獲取同一個頁.
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
5.6 案例學習:大量的入口I/O
vmstat 工具報告裏除了CPU 使用狀況,還包括了虛擬內存.如下就是vmstat 輸出中關於虛擬內存的部分:
Table 2: The vmstat Memory Statistics
[在此處輸入文章標題]
賬戶 Jobkoo 運維博客
Field | Description |
Swapd | The amount of virtual memory in KB currently in use. As free memory reaches low thresholds, more data is paged to the swap device.
當前虛擬內存使用的總額(單位:KB).空閒內存達到最低的閥值時,更多的數據被轉換成頁到交換設備中. |
Free | The amount of physical RAM in kilobytes currently available to running applications.
當前內存中可用空間字節數. |
Buff | The amount of physical memory in kilobytes in the buffer cache as a result of read() and write() operations.
當前內存中用於read()和write()操做的緩衝區中緩存字節數 |
Cache | The amount of physical memory in kilobytes mapped into process address space.
當前內存中映射到進程地址空間字節數 |
So | The amount of data in kilobytes written to the swap disk.
寫入交換空間的字節數總額 |
Si | The amount of data in kilobytes written from the swap disk back into RAM.
從交換空間寫回內存的字節數總額 |
Bo | The amount of disk blocks paged out from the RAM to the filesystem or swap device.
磁盤塊頁面從內存到文件或交換設備的總額 |
Bi | The amount of disk blocks paged into RAM from the filesystem or swap device.
磁盤塊頁面從文件或交換設備到內存的總額 |
如下 vmstat 的輸出結果,就是演示一個在I/O 應用中,虛擬內存在高負荷狀況下的環境
根據觀察值,咱們能夠獲得如下結論:
1,大量的disk pages(bi)被寫入內存,很明顯在進程地址空間裏,數據緩存(cache)也在不斷的增加.
2,在這個時間點上,空閒內存(free) 始終保持在20~50MB,即便數據從硬盤讀入而在消耗RAM.
3,爲了維護空閒列表, kswapd 從讀/寫緩存區(buff)中獲取內存並分配到空閒列表裏.很明顯能夠看到buffer cache(buff) 在逐漸的減小中.
4, 同時kswapd 進程不斷的寫髒頁到swap device(so)時,很明顯虛擬內存的利用率是在逐漸的增長中(swpd).
5.7 結論
監控虛擬內存性能由如下幾個部分組成:
1,當系統中出現較少的頁錯誤,得到最好的響應時間,是由於memory caches(譯註:內存高速緩存)比disk caches更快(譯註:磁盤高速緩存).
2,較少的空閒內存,是件好事情,那意味着緩存的使用更有效率.除非在不斷的寫入swap device和disk.
3,若是系統不斷報告,swap device老是繁忙中,那就意味着內存已經不足,須要升級了.