Linux System and Performance Monitoring(Memory篇)

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 應用中,虛擬內存在高負荷狀況下的環境

[root @monitor ~ ] # vmstat 3 -S m
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------
r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
2  1     53   1077     23    511    0    0     9   217    6    6  2  1 93  4  0
0  1     53    762     24    817    0    0 49843 74592 1506 12141  1  9 49 42  0
0  6     53    531     24   1020    0    0 33057 143940 1392 2181  0  7 22 70  0
0  6     53    272     24   1284    0    0 42965 32768 1425 1068  0  6  0 94  0
1  4     53     56     24   1505    0    0 36091 39288 1387  980  0  5  0 94  0
0  6     53     54      6   1536    0    0 47065   424 1452 1171  0  8  0 92  0
0  6     53     26      7   1485    0    0 31433 247209 1358  961  5 12  0 84  0
0  6     53     49      7   1471    0    0 30111 43053 1355 1015  0  6  0 94  0
0  6     53     48      7   1477    0    0 43436 32768 1427 1097  0  7 34 59  0
0  6     53     51      7   1481    0    0 35235 43349 1371  979  0  7 49 44  0
0  6     53     54      6   1488    0    0 42411 43179 1425 1081  0  8 49 43  0
0  6     53     53      5   1499    0    0 36560 43349 1386  983  0  7 23 70  0

根據觀察值,咱們能夠獲得如下結論:

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老是繁忙中,那就意味着內存已經不足,須要升級了.

相關文章
相關標籤/搜索