記憶體效能評估(四)

紫翼龍王夜發表於2015-04-08

一、虛擬記憶體簡介

       虛擬記憶體是使用磁碟作為 RAM 的擴充使得可用記憶體的有效大小得到相應增加。 核心會將當前記憶體中未被使用的塊的內容寫入硬碟以此來騰出記憶體空間。 當上面的內容再次需要被用到時,它們將被重新讀入記憶體。這些對使用者完全透明;在 linux 下執行的程式只會看到有大量記憶體空間可用而不會去管它們的一部分時不時的從硬碟讀取。 當然, 硬碟的讀寫操作速度比記憶體慢上千倍, 所以這個程式的執行速度也不會很快。 這個被用作虛擬記憶體的硬碟空間稱作交換空間(swap space) 。

1)虛擬記憶體頁

虛擬記憶體被分成頁,在 X86 架構下的每個虛擬記憶體頁大小為 4KB,

當核心由記憶體向磁碟讀寫資料時,是以頁為單位。核心會把記憶體頁寫入 swap 空間和檔案系統。盤讀寫資料時,是以頁為單位。核心會把記憶體頁寫入 swap 空間和檔案系統。

2)核心記憶體分頁

記憶體分頁是一個常見的動作, 不能和記憶體交換相混淆。 記憶體分頁是在正常間隔下同步記憶體中資訊至磁碟的過程。 隨著時間的增長, 應用會不斷耗盡記憶體, 有時候核心必須掃描記憶體並回收被分配給其他應用的空閒頁面。

3)頁幀回收演算法(PFRA

PFRA 負責回收記憶體。PFRA 根據頁型別來判斷是否被回收,記憶體頁有以下型別:
* 不可被回收——locked,kernel,reserved 被鎖、核心、保留頁
* 可交換——無名記憶體頁
* 可同步——被磁碟同步的頁面
* 可丟棄——靜態頁,廢棄頁
除了不可被回收型別外其他均可被 PFRA 回收。PFRA 具有兩個主要功能,一個是 kswapd核心程式,一個是“Low On Memory Reclaiming”功能。

4kswapd

kswapd 守護程式負責確保記憶體保持可用空閒空間。它監測核心中的 pages_high 和pages_low 標記,如果空閒記憶體空間值小於 pages_low 值,kswwapd 程式開始掃描並嘗試每次回收 32 個頁面,如此重複直至空閒記憶體空間大於 pages_high 值。
kswapd 程式履行以下操作:
* 假如頁面未改變,它將該頁面放入 free list。
* 假如頁面發生改變且被檔案系統回寫,它將頁面內容寫入磁碟。
* 假如頁面發生改變且未被檔案系統回寫(無名頁) ,它將頁面內容寫入 swap 裝置。

5pdflush 核心分頁

pdflush 守護程式負責同步所有與檔案系統相關的頁面至磁碟,換句話說,就是當一個檔案在記憶體中發生改變,pdflush 守護程式就將其回寫進磁碟。

當記憶體中的髒頁面數量超過 10% 時 pdflush 守護程式開始回寫,這個動作與核心的vm.dirty_background_ratio 引數值有關。
# sysctl -n vm.dirty_background_ratio10

多數情況下 pdflush 守護程式與 PFRA 之間是相互獨立的。除了常規的回收動作之外,當核心呼叫 LMR 演算法時,LMR 將強制 pdflush 進行髒頁面回收。
二、利用free指令監控記憶體

free是監控linux記憶體使用狀況最常用的指令,看下面的一個輸出:

[root@webserver ~]# free  -m

                total         used       free     shared    buffers     cached

Mem:       8111       7185        926          0       243           6299

-/+ buffers/cache:     643       7468

Swap:       8189          0         8189

     一般有這樣一個經驗公式:應用程式可用記憶體/系統實體記憶體>70%時,表示系統記憶體資源非常充足,不影響系統效能,應用程式可用記憶體/系統實體記憶體<20%時,表示系統記憶體資源緊缺,需要增加系統記憶體,20%

三、利用vmstat命令監控記憶體

vmstat 命令除了報告 CPU 的情況外還能檢視虛擬記憶體的使用情況,vmstat 輸出的以下區域與虛擬記憶體有關

[root@node1 ~]# vmstat 2 3

procs -----------memory----------  ---swap--  -----io---- --system--  -----cpu------

 r  b   swpd   free      buff  cache   si   so    bi    bo       in     cs     us sy  id  wa st

 0  0    0    162240   8304  67032   0    0    13    21   1007   23     0  1  98   0  0

 0  0    0    162240   8304  67032   0    0     1     0     1010   20     0  1  100 0  0

 0  0    0    162240   8304  67032   0    0     1     1     1009   18     0  1  99   0  0

 memory

         swpd列表示切換到記憶體交換區的記憶體數量(以k為單位)。如果swpd的值不為0,或者比較大,只要si、so的值長期為0,這種情況下一般不用擔心,不會影響系統效能。

         free列表示當前空閒的實體記憶體數量(以k為單位)

         buff列表示buffers cache的記憶體數量,一般對塊裝置的讀寫才需要緩衝。

         cache列表示page cached的記憶體數量,一般作為檔案系統cached,頻繁訪問的檔案都會被cached,如果cache值較大,說明cached的檔案數較多,如果此時IO中bi比較小,說明檔案系統效率比較好。

swap

si列表示由磁碟(交換分割槽)調入記憶體,也就是記憶體交換分割槽進入記憶體的數量。

so列表示由記憶體調入磁碟(交換分割槽),也就是記憶體進入記憶體交換分割槽的數量。

一般情況下,si、so的值都為0,如果si、so的值長期不為0,則表示系統記憶體不足。需要增加系統記憶體。

例如大規模IO寫入:

vmstat  3
procs memory swap io system cpu
 r  b swpd    free          buff       cache  si   so bi     bo    in    cs  us sy id wa
3 2 809192 261556 79760 886880 416 0 8244 751 426 863 17 3 6 75
0 3 809188 194916 79820 952900 307 0 21745 1005 1189 2590 34 6 12 48
0 3 809188 162212 79840 988920 95 0 12107 0 1801 2633 2 2 3 94
1 3 809268 88756 79924 1061424 260 28 18377 113 1142 1694 3 5 3 88
1 2 826284 17608 71240 1144180 100 6140 25839 16380 1528 1179 19 9 12 61
2 1 854780 17688 34140 1208980 1 9535 25557 30967 1764 2238 43 13 16 28
0 8 867528 17588 32332 1226392 31 4384 16524 27808 1490 1634 41 10 7 43
4 2 877372 17596 32372 1227532 213 3281 10912 3337 678 932 33 7 3 57
1 2 885980 17800 32408 1239160 204 2892 12347 12681 1033 982 40 12 2 46
5 2 900472 17980 32440 1253884 24 4851 17521 4856 934 1730 48 12 13 26
1 1 904404 17620 32492 1258928 15 1316 7647 15804 919 978 49 9 17 25
4 1 911192 17944 32540 1266724 37 2263 12907 3547 834 1421 47 14 20 20
1 1 919292 17876 31824 1275832 1 2745 16327 2747 617 1421 52 11 23 14
5 0 925216 17812 25008 1289320 12 1975 12760 3181 772 1254 50 10 21 19
0 5 932860 17736 21760 1300280 8 2556 15469 3873 825 1258 49 13 24 15
透過以上資料可得出以下結果:
* 大量的資料從磁碟讀入記憶體(bo) ,因 cache 值在不斷增長
* 儘管資料正不斷消耗記憶體,空閒空間仍保持在 17M 左右
* buff 值正不斷減少,說明 kswapd 正不斷回收記憶體
* swpd 值不斷增大,說明 kswapd 正將髒頁面內容寫入交換空間(so)

四、小結:

虛擬記憶體的效能監測包括以下步驟:
* 當系統利用記憶體快取超過磁碟快取,系統反應速度更快
* 除在有大量持續的交換空間和磁碟讀入動作情況下外, 空閒記憶體空間很少說明 cache得到了有效的利用
* 如果系統報告有持續的交換空間使用,說明記憶體不足

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/30129545/viewspace-1545369/,如需轉載,請註明出處,否則將追究法律責任。

相關文章