記憶體效能評估(四)
一、虛擬記憶體簡介
虛擬記憶體是使用磁碟作為 RAM 的擴充使得可用記憶體的有效大小得到相應增加。 核心會將當前記憶體中未被使用的塊的內容寫入硬碟以此來騰出記憶體空間。 當上面的內容再次需要被用到時,它們將被重新讀入記憶體。這些對使用者完全透明;在 linux 下執行的程式只會看到有大量記憶體空間可用而不會去管它們的一部分時不時的從硬碟讀取。 當然, 硬碟的讀寫操作速度比記憶體慢上千倍, 所以這個程式的執行速度也不會很快。 這個被用作虛擬記憶體的硬碟空間稱作交換空間(swap space) 。
1)虛擬記憶體頁
虛擬記憶體被分成頁,在 X86 架構下的每個虛擬記憶體頁大小為 4KB,
當核心由記憶體向磁碟讀寫資料時,是以頁為單位。核心會把記憶體頁寫入 swap 空間和檔案系統。盤讀寫資料時,是以頁為單位。核心會把記憶體頁寫入 swap 空間和檔案系統。
2)核心記憶體分頁
記憶體分頁是一個常見的動作, 不能和記憶體交換相混淆。 記憶體分頁是在正常間隔下同步記憶體中資訊至磁碟的過程。 隨著時間的增長, 應用會不斷耗盡記憶體, 有時候核心必須掃描記憶體並回收被分配給其他應用的空閒頁面。
3)頁幀回收演算法(PFRA)
PFRA 負責回收記憶體。PFRA 根據頁型別來判斷是否被回收,記憶體頁有以下型別:
* 不可被回收——locked,kernel,reserved 被鎖、核心、保留頁
* 可交換——無名記憶體頁
* 可同步——被磁碟同步的頁面
* 可丟棄——靜態頁,廢棄頁
除了不可被回收型別外其他均可被 PFRA 回收。PFRA 具有兩個主要功能,一個是 kswapd核心程式,一個是“Low On Memory Reclaiming”功能。
4)kswapd
kswapd 守護程式負責確保記憶體保持可用空閒空間。它監測核心中的 pages_high 和pages_low 標記,如果空閒記憶體空間值小於 pages_low 值,kswwapd 程式開始掃描並嘗試每次回收 32 個頁面,如此重複直至空閒記憶體空間大於 pages_high 值。
kswapd 程式履行以下操作:
* 假如頁面未改變,它將該頁面放入 free list。
* 假如頁面發生改變且被檔案系統回寫,它將頁面內容寫入磁碟。
* 假如頁面發生改變且未被檔案系統回寫(無名頁) ,它將頁面內容寫入 swap 裝置。
5)pdflush 核心分頁
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Redis效能篇(四)Redis記憶體碎片Redis記憶體
- 系統效能評價---效能評估
- android效能評測與優化-記憶體Android優化記憶體
- 機器學習筆記之效能評估指標機器學習筆記指標
- JuiceFS 效能評估指南UI
- Linux效能評估工具Linux
- 網路效能評估(六)
- TimesTen記憶體資料庫評估和計算表大小及碎片記憶體資料庫
- 記憶體效能分析工具記憶體
- 效能優化-使用 RAIL 模型評估效能優化AI模型
- AIX 5.3主機效能評估AI
- Android 效能優化(四)之記憶體優化實戰Android優化記憶體
- Rust非同步框架的效能評估Rust非同步框架
- Linux伺服器效能評估Linux伺服器
- Arm64記憶體模型、記憶體型別、效能與DMA記憶體模型型別
- 程式的記憶體四區模型記憶體模型
- JavaScript之記憶體洩漏【四】JavaScript記憶體
- ORACLE 記憶體管理 之四 SGAOracle記憶體
- Unity效能分析(三)記憶體分析Unity記憶體
- <<SAP記憶體計算——HANA>> 書評記憶體
- 軟體體系結構評估
- AIX系統磁碟I/O效能評估AI
- OBC充電機測試效能評估
- 評估類、評估類別、評估級別關係
- Android效能優化篇之記憶體優化--記憶體洩漏Android優化記憶體
- DDR4記憶體頻率2400和3000的區別 高頻記憶體與低頻記憶體效能效能對比記憶體
- 柯氏四級培訓評估模式(轉載)模式
- 高效能記憶體快取 ristretto記憶體快取
- JVM效能調優,記憶體分析工具JVM記憶體
- 記憶體洩露例項分析 -- Android記憶體優化第四彈記憶體洩露Android優化
- 資料庫效能需求分析及評估模型資料庫模型
- web伺服器效能評估和監視Web伺服器
- 多通道負載測試和效能評估?負載
- 在ASP.NET Core中用HttpClient(四)——提高效能和優化記憶體ASP.NETHTTPclient優化記憶體
- (四) 一文搞懂 JMM - 記憶體模型記憶體模型
- Ebiquity報告:重新評估媒體UI
- Linux 效能優化之 記憶體 篇Linux優化記憶體
- iOS 使用Instruments優化記憶體效能iOS優化記憶體