-
零.引言我們對被測應用進行性能測試時,除了關注吞吐量、響應時間等應用自身的表現外,對應用運作所涉及的伺服器資源的使用情況,也是非常重要的方面,通過實時監控,可以準确的把握不同測試場景下伺服器資源消耗情況的變化,對于應用性能分析有着重要的作用,同時也是調整測試場景設計的重要依據。對于使用JMeter執行性能測試的朋友,可能大都知道jmeter-plugins中就有用于伺服器資源監控的插件PerfMon Metrics Collector,同時也有不少同學會選擇類似nmon的獨立監控方案。之是以決定寫這篇文章,一是因為在使用JMeter作為性能測試工具的情況下,使用專為其設計的插件會更友善,二是對于普通網際網路公司的性能測試方案,這款插件所提供的功能已經可以滿足其資源監控方面的大多數需求,而最重要的一點,是在技術群裡發現雖然很多同學知道或者在用這款插件,但是對于一些概念和細節,并不了解,導緻不能很好的滿足自己的需求,而現在網絡上介紹這款插件的部落格文章,大都是Quick Start式的入門文章,并不能解答這些同學的疑問。
注:本文使用的JMeter版本為目前最新release版本3.2。壹.基礎本來PerfMon插件的安裝部署不是本文的重點,但為了保持文章的完整性,這裡還是進行簡單的介紹。有基礎的同學可以跳過。使用PerfMon進行伺服器資源監控的方案由兩部分來實作
- ServerAgent,部署在被測伺服器,負責資源耗用資料的采集,其功能實作主要基于hyperic的SIGAR。
- PerfMon Listener,以插件形式內建到JMeter,作為其中一個Listener。
- 1.1 ServerAgent部署
- 前提:ServerAgent運作需要jre1.4以上版本支援。
- 下載下傳:從官方下載下傳
- 部署:将下載下傳的
放置到被測伺服器,解壓後,直接運作.zip
(Linux)/startAgent.sh
(Windows)即可,與JMeter進行資料傳輸時使用簡單的文本協定,預設使用TCP協定,預設端口4444。當然,在Linux,我們通常将其放在背景運作,比如用nohup。startAgent.bat
- 驗證:為了保證測試過程的順暢,我們可以先行确認JMeter壓力機與被測伺服器上部署的ServerAgent的通信是否正常。一個簡便的方法是在JMeter壓力機使用telnet像ServerAgent發送"test",如
,連通後,輸入telnet 192.168.18.10 4444
,正常情況下ServerAgent會輸出類似test
的日志。INFO 2017-07-29 23:10:52.430 [kg.apc.p] (): Yep, we received the 'test' command
可以在運作腳本時添加
--tcp-port xxx
來指定端口,如
$ ./startAgent.sh --tcp-port 3450
,需要注意的是此時JMeterPerfMon插件使用時也需要對綁定端口進行對應修改。更多資訊可以參考下載下傳頁的官方文檔。
1.2 PerfMon插件使用
- 安裝:JMeter3.0之後,有兩種方式安裝jmeter-plugins所包含的插件。
- 使用:如圖2所示,在Listener中選擇PerfMon插件,添加到測試計劃中,然後參考圖3進行配置,包括配置部署了ServerAgent的被測伺服器的IP、ServerAgent使用的端口、要擷取和展示的資源項等。測試啟動後
- 第一種方式:到jmeter-plugins官網搜尋
并下載下傳,将得到的jar包放置于JMeter安裝目錄的PerfMon
路徑下,重新開機JMeter,從Listener中選擇使用插件。lib/ext/

圖1 插件下載下傳
- 第二種方式:使用Plugins Manager,不過由于國内衆所周知的原因,很多同學可能遇到網絡不通不能展示插件的問題,這裡就不展開了,可參考我之前的文章:JMeter性能測試3.0時代之-全新JMeter插件管理
圖2 使用PerfMon插件
圖3 配置
- 資料觀察和儲存:在使用GUI模式進行調試時,測試啟動後,可以直接在對應視窗觀察到根據采集資料描繪的圖形。而要在使用NO GUI模式正式執行測試後,檢視監控資料,可以在設計測試計劃時在圖3的
位置配置資料要儲存的位址,它和儲存JMeter測試主資料的方式一樣,需要注意的是不要和JMeter測試主資料儲存到同一個檔案。在測試執行完成後,再在插件界面載入這個檔案,即可顯示監控資料的圖形展示。Filename
貳.進階
從同僚、技術群友們那裡,我了解到有不少同學對于PerfMon插件展示的各個名額資料的含義,特别是機關并不是特别明确,是以先講一下這部分。另外對于資料曲線圖的展示,也有一些點值得說明。
2.1 名額
關于監控名額資料的疑惑,大多可以從PerfMon插件的
Metric parameter
設定界面找到答案。我們知道對于伺服器如CPU、記憶體等每一個監控名額類型,都有多種資料從不同次元來展現資源使用情況,比如對于CPU,在Linux系統用
top
指令,就可以看
idle
、
user
system
等資料。
對于PerfMon插件,可以通過
Metric parameter
來設定某種資源具體要收集和展示的資料,隻是它的入口并不是很醒目,如下圖4右上的紅色箭頭所指,需要輕按兩下輸入框後,點選最後邊的按鈕打開,打開的界面如圖4中級紅色箭頭所指,雖然每種名額的具體配置項不同,但結構相同,都分為
Primary Metrics
Additional Metrics
等等,Primary是官方認為常用的,通常也是實際工作中更關心,更具有參考意義的名額項,Additional則是在一些特殊場景可能需要了解的名額項。
圖4 監控名額參數設定
這裡先簡單說一下幾種主要的資源類型的名額項,對應的圖就不貼了,太占篇幅,影響閱讀:
- CPU:
- 對于各名額項,數值都是代表百分比,比如預設配置(
)下在曲線圖中看到某個時間的數值是30,即代表此時總的cpu使用時間占比為30%。combined
- 有兩點比較有用的地方值得說明:一是在Scope區域,可以通過Per Process選項來擷取指定程序的CPU使用情況,二是在CPU Cores區域,我們可以選擇監控指定的單個Core。
- Memory:
- 各名額項中,
(預設)和usedperc
兩項的數值代表與總記憶體的百分比,其餘名額項的數值都是指記憶體大小,選中對應想,可以看到freeperc
區域機關配置将變為可用,通常Mb會比較适合觀察。Metric Unit
- 同樣,也可以選擇監控指定程序的資料
- Disk I/O:
-
(預設)的數值代表等待I/O隊列長度,queue
reads
分别代表每秒處理的讀/寫次數,writes
readbytes
顧名思義,代表每秒讀/寫的資料量,機關同樣在writebytes
區域配置,通常Mb會比較适合觀察。Metric Unit
- 如果有挂載多個儲存設備,可以在
區域指定要監控的裝置。Filesystem Filter
剩下的,就不一一說明了,參考前面幾項,我覺得了解其他資源類型的配置應該沒有問題了,至于具體名額項的含義,首先用不到的可以暫時不去了解,如果想要了解,請善用搜尋。
2.2 曲線圖
- 使用政策:
- 如果測試場景的測試執行時間較長,采集的監控資料量比較大,為了在GUI模式檢視曲線圖時更友善、快捷,建議将各個監控名額項單獨使用一個PerfMon監聽器,進而配置不同的名額項資料存儲到不同的檔案中,測試執行完畢後,載入資料和資料檢視都會更快。
- 如果預計資料量不會太大,可以以伺服器為機關來劃分PerfMon監聽器。這樣可以友善的觀察到整個測試過程中,某台伺服器各項資源使用情況的變化趨勢
- 對于分布式服務、為了友善觀察各個節點的負載分布、負載變化趨勢,可以考慮将同類型的節點放置到同一個PerfMon監聽器,以便對比觀察
- 數值:
- 當一個PerfMon監聽器中展示多種名額項的資料時,為了曲線圖的可觀察性,插件會自動進行優化,如圖5所示,我們看到在CPU項和記憶體項都有個x10,代表曲線圖中展示的數值是在采集到的真實數值上放大了10倍,目的是為了保證不同資料項在同一坐标系中展示時,各項都變化趨勢都能夠被觀察到。 圖5 曲線圖
JMeter性能測試-伺服器資源監控插件詳解
- 曲線圖配置:
- 插件界面的
标簽頁可以調整要在曲線圖中展示的名額項Rows
-
标簽頁中常用的有:Setting
-
用于配置曲線圖x軸表示相對時間(測試開始時為0)還是實際系統時間。use relative times
-
預設勾選,則會有上一節講數值時提到的展示資料自動放大的功能,取消勾選則全部展示采集的實際數值。Auto-zoom rows for best fit
-
:勾選後可以設定曲線圖展示的采樣點數量,我們的測試報告會有不同的角色檢視,其中一些角色可能不具備也不需要對監控資料的細節了解能力,此時我們提供的監控曲線圖應該是易讀的,如果按照實際的所有采樣點來渲染出曲線圖,可能會有很多偏離趨勢的噪點資料,這對于不了解的人來說可能會有很多疑惑,是以當我們有了分析結論,最後報告呈現的時候,可以考慮通過調整采樣點,來讓曲線圖更好的展示資源使用趨勢,消除其他不必要的資訊。Limit number of points in row to xx points
圖6 曲線圖配置JMeter性能測試-伺服器資源監控插件詳解 -
,實際上我更多會選擇不勾選,不勾選的情況下,插件在描繪曲線圖的時候,會根據數值大小自動調整Y軸最大值,以達到更佳可讀性,如圖7和圖8,分别是不勾選,和勾選後設定最大值為100時的曲線圖效果,顯然圖7可以更容易的觀察到變化的細節。不過與上一項類似,可能在對外出具報告時,為了更少的解釋說明,可能需要某個指定的數值。Force maximum Y axis value to xx
圖7 不自定義Y軸JMeter性能測試-伺服器資源監控插件詳解 圖8 自定義Y軸JMeter性能測試-伺服器資源監控插件詳解
2.3 自定義名額
- EXEC
- 在插件界面選擇名額類型時,可以看到一個
選型,該選項允許我們在後面的Metric parameter中配置一個指令語句(該語句最終應該輸出單個數值),測試執行時,ServerAgent将執行該指令,同時插件将接收ServerAgent捕獲的輸出數值。EXEC
- 文法規則:EXEC所配置的語句需要按照一定的規則來填寫,先是給出指令的執行程式的位置,然後将具體的指令以及指令的參數作為,指令和指令參數都需要用冒号":"來隔開。比如
/bin/sh:-c:free |grep Mem |awk '{pring $7}'
-
,代表指令的執行程式/bin/sh
-
,即-c
的/bin/sh
選型,有-c選型的情況下,将從後面的字元串按一定規則解析為指令和指令參數-c
- 可以看到有用冒号分隔了執行程式/選型參數/指令語句
- 對于windows,也類似,如
C\:\Windows\System32\cmd.exe:/c:echo %RANDOM%
- TAIL
- 如同Linux的
指令,讀取檔案的最後一行,用在這裡,需要檔案每一行隻包含一個單獨的數值。借助tail,我們可以通過自定義腳本監控任意名額,隻需要腳本的輸出滿足要求即可。tail
- 顯而易見,TAIL後面的參數就是配置要讀取的檔案的位址,測試執行時,ServerAgent将根據配置讀取所在伺服器的指定檔案。
叁.總結
本文先簡單的講解了JMeter性能測試資源監控插件的部署,然後從現有名額、曲線圖和自定義名額三個方面講解了插件使用過程中比較使用的細節問題,希望通過本文,讓大家能靈活運用這款插件來快速實作自己的測試需求。
。
每天一點點,感受自己存在的意義。