本文部分理論轉自Jmeter官網:https://jmeter-plugins.org/wiki/PerfMon/ ,並結合個人實踐編寫
一、介紹
在負載測試期間,了解加載服務器的運行狀況很重要。如果正確調度了負載,那么看到您是否定位集群也是很好的。為了解決這個問題,插件包現在支持服務器監控!使用它,您可以 在幾乎所有平台上監視CPU,內存,交換,磁盤I / O和網絡I / O!
某些指標允許指定特定對象進行監視,您可以指定 選擇器參數來僅監視此對象的值:
- 名稱,pid和ptql選擇器進程
- 核心選擇器,用於監視多核系統的特定CPU
- 文件系統的fs選擇器
- iface選擇器用於網絡接口
示例度量參數字符串:
### CPU ###
組合 - 測量總CPU使用量,等於100個空閑值
core = 2:用戶測量用戶進程系統中第三個核心的CPU使用率(核心編號從0開始)
name = java#2:用戶- 將監視用戶時間的第二個Java流程實例
pid = 14523:percent - 將使用PID 14523監視進程總CPU使用率百分比
name = httpd - 省略度量類型將使用默認'percent'
###磁盤IO ###
fs = / home:writes - 將監視/ home文件系統的寫操作數
###網絡IO ###
iface = eth0:tx - 將監視接口eth0的傳輸包速率
這是插件的外觀。它顯示負載測試中涉及的4台服務器的CPU使用情況:
二、收集指標
從版本0.5.0起,服務器代理工具支持收集超過75個系統度量。 查看完整列表。
1、(CPU指標)CPU Metrics
(匯總)Total
Primary
- combined
- idle
- system
- user
- iowait
Additional
- irq
- nice
- softirq
- stolen
(每個線程)Per Process
- percent
- total
- system
- user
2、(內存指標)Memory Metrics
Total
(主)Primary
- usedperc - relative memory usage in percents
- freeperc
- used
- free
(次)Additional
- actualfree自由
- actualused實際使用
- ram隨機存儲器
- total
Per Process
Primary
- resident
- virtual
- shared
Additional
- pagefaults
- majorfaults
- minorfaults
3、(磁盤I / O指標)Disk I/O Metrics
Primary
- queue
- reads
- writes
- readbytes
- writebytes
Additional
- available
- service
- files
- free
- freefiles
- total
- useperc
- used
4、(網絡I/O指標)Network I/O Metrics
Primary
- bytesrecv
- bytessent
- rx
- tx
Additional
- used
- speed
- rxdrops
- rxerr
- rxframe
- rxoverruns
- txcarrier
- txcollisions
- txdrops
- txerr
- txoverruns
5、JMX Metrics
由於版本0.5.2 Server Agent具有監視 Java虛擬機內部的一些JMX值的功能。要啟用JMX監控與一些特殊的屬性中啟用,像描述的則必須啟動Java 這里。這里使用JMX啟動時,最簡單(而不是安全)選項啟動Java:
java -Dcom.sun.management.jmxremote.port=4711 -Dcom.sun.management.jmxremote.authenticate=false \
-Dcom.sun.management.jmxremote.local.only=false -Dcom.sun.management.jmxremote.ssl=false
默認情況下,服務器代理將嘗試使用端口4711連接到localhost的JMX服務器。如果您在不同的主機/端口啟動JMX服務器或使用用戶名/密碼進行身份驗證,請使用以下附加參數:
- url=<hostname>\:<port>
- user=<username>
- password=<password>
Available JMX metric types:
- gc-time - 時間花費在垃圾回收中,毫秒 milliseconds (used method)
- memory-usage - heap memory used by VM, bytes (method used)內存使用 - VM使用的堆內存,字節
- memory-committed - heap memory committed by VM, bytes (method used)內存提交 - 由VM提交的堆內存,字節
- memorypool-usage - heap memory pool usage, bytes (method used)memorypool使用 - 堆內存池使用,字節
- memorypool-committed - heap memory pool committed size, bytes (method used)memorypool-committed - 堆內存池承諾大小,字節
- class-count - loaded class count in VM (used method)VM中的計數加載類計數
- compile-time - time spent in compilation, milliseconds (used method)編譯時花費在編譯時間,毫秒
例子:
gc-time - monitor GC time at localhost:4711 在本地主機上監視GC時間
memory-usage:url=somehost.com\:4715 - use alternative hostname/password 使用備用主機名/密碼
class-count:url=somehost.com\:4715:user=apc:password=SecurityPlease123 - some secure setup access 一些安全的安全訪問
6、(TCP指標)TCP Metrics
TCP指標表示TCP套接字狀態統計信息(如打開的端口)。
(主)Primary
- estab - established connections建立連接
- time_wait時間的等待
- close_wait關閉等待
(次)Additional
- bound 界
- close 關
- closing 關閉
- fin_wait1
- fin_wait2
- idle 空閑
- inbound 入站
- last_ack 最后一次回答
- listen 偵聽
- outbound 出站
- syn_recv
7、(交換指標)Swap Metrics
- used
- pagein
- pageout
- free
- total
8、(自定義指標)Custom Metrics
如果您在上述列表中找不到適當的指標,您可以設置采用自定義指標收集任何值
8.1(執行)EXEC
此度量類型將參數字符串解釋為要啟動的進程路徑和要傳遞給進程的參數。參數用冒號(不是空格)分隔,參見下面的例子。該過程必須打印到包含單數字度量值的標准輸出單行。
在大多數情況下,您需要啟動系統解釋器(cmd.exe,/ bin / sh)以運行復雜的參數化調用序列。
示例1:監視Linux 緩存的內存大小(以默認度量標准通過SIGAR lib不可用),使用免費實用程序輸出:
/bin/sh:-c:free | grep Mem | awk '{print $7}'
示例2:監視MySQL select查詢計數:
/bin/sh:-c:echo "show global status like 'Com_select'" | mysql -u root | awk ' $1 =="Com_select" {print $2}'
8.2(尾)TAIL
收集cutom度量的另一種方法是讀取文件末尾的行。尾部類型的度量參數是要讀取的文件的路徑。添加到文件的行必須包含單個數字度量。例:
123
342
333
297
三、怎么運行的
1、概念
除了Tomcat之外,JMeter無法通過默認服務器指標進行檢索。為了克服這種情況,我們開發了一個服務器代理,它將獲得JMeter的性能數據。代理使用SIGAR開源庫。它由Java公共部分和每個操作系統的本機庫組成。
2、安裝
服務器代理工具詳細描述放在這里。
其余插件需通過jmeter管理插件安裝或單獨尋找。本次實例部分通過jmeter管理插件下載,部分通過官網
本地Windows
這里需要6個jar
D:\apache-jmeter-3.2\lib\ext下放4個jar: JMeterPlugins-Standard.jar JMeterPlugins-Extras.jar jmeter-plugins-perfmon-2.1.jar jmeter-plugins-manager-0.12.jar D:\apache-jmeter-3.2\lib下放2個jar: perfmon-2.2.2.jar jmeter-plugins-cmn-jmeter-0.5.jar
2.1、訪問https://jmeter-plugins.org/downloads/old/ 下載紅色框的zip:JMeterPlugins-Standard-1.4.0.zip 和JMeterPlugins-Extras-1.4.0.zip
2.2、(1)解壓JMeterPlugins-Standard-1.4.0.zip到D:\谷歌下載目錄\JMeterPlugins-Standard-1.4.0,並把解壓后的文件D:\谷歌下載目錄\JMeterPlugins-Standard-1.4.0\lib\ext\JMeterPlugins-Standard.jar 復制黏貼到D:\apache-jmeter-3.2\lib\ext,注意是lib\ext下,不能放在lib
(2)解壓JMeterPlugins-Extras-1.4.0.zip到D:\谷歌下載目錄\JMeterPlugins-Extras-1.4.0,並把解壓后的文件D:\谷歌下載目錄\JMeterPlugins-Extras-1.4.0\lib\ext\JMeterPlugins-Extras.jar 復制黏貼到D:\apache-jmeter-3.2\lib\ext,注意是lib\ext下,不能放在lib
2.3、打開jmeter>選項>Plugins Manager(has upgrads),在彈框TAB Available Plugins找到PerfMon (Servers Performance Monitoring),在左側選擇框打鈎,點擊【Apply Changes and Restart Jmeter】。--安裝插件部分過於簡單,不截圖
安裝完畢后,在jmeter>選項>Plugins Manager(has upgrads)>Installed Plugins看到對應插件
此時,在D:\apache-jmeter-3.2\lib\ext看到以下jar,走到這里,踩了坑,單獨通過jmeter管理插件安裝插件Perfmon,漏了2個jar
2.4、安裝插件Perfmon,漏了2個jar。需自己去maven找到對應的jar,
(1)perfmon-2.2.2.jar 在http://www.mvnrepository.com/artifact/kg.apc/perfmon/2.2.2下載
(2)jmeter-plugins-cmn-jmeter-0.5.jar 在http://www.mvnrepository.com/artifact/kg.apc/jmeter-plugins-cmn-jmeter/0.5下載
2.5、下載perfmon-2.2.2.jar和jmeter-plugins-cmn-jmeter-0.5.jar后,放到D:\apache-jmeter-3.2\lib下
2.6、完成所有jar下載和復制到對應路徑后,重啟jmeter,重啟完畢后r,訪問添加>監聽器>jg@gc - PerfMon Metrics Collector,即為成功安裝插件
2.7、當需用jg@gc - PerfMon Metrics Collector來監控Linux服務時,打開bin/Jmeter.properties 修改 jmeter.save.saveservice.thread_counts=true
2.8、服務器:ServerAgent-2.2.1.zip, 3.51 MB, 2013年7月12日,下載次數:1178 性能監視器代理安裝在目標服務器上。ServerAgent下載地址:https://jmeter-plugins.org/wiki/PerfMonAgent/
不需要任何root / admin權限。通過遠程FTP工具,復制到服務器上某處將ServerAgent-XXXzip解壓縮。然后使用Unix上的startAgent.sh腳本或Windows 上的startAgent.bat腳本啟動代理。--注:本例子是放到Linux服務器,只需sh startAgent.sh
本次截圖使用Linux,此為解壓的圖
linux啟動代理,若直接使用默認端口,如下圖執行命令即可
[root@dev-dc ~]# cd /jmeter [root@dev-dc jmeter]# ls ServerAgent-2.2.1 [root@dev-dc jmeter]# cd ServerAgent-2.2.1/ [root@dev-dc ServerAgent-2.2.1]# ls CMDRunner.jar lib LICENSE ServerAgent.jar startAgent.bat startAgent.sh [root@dev-dc ServerAgent-2.2.1]# chmod a+x startAgent.sh [root@dev-dc ServerAgent-2.2.1]# ps -ef|grep ServerAgent root 6656 6551 0 08:53 pts/0 00:00:00 grep ServerAgent [root@dev-dc ServerAgent-2.2.1]# netstat -anp | grep 4444 [root@dev-dc ServerAgent-2.2.1]# ./startAgent.sh INFO 2017-11-17 08:55:22.081 [kg.apc.p] (): Binding UDP to 4444 INFO 2017-11-17 08:55:23.080 [kg.apc.p] (): Binding TCP to 4444 INFO 2017-11-17 08:55:23.104 [kg.apc.p] (): JP@GC Agent v2.2.0 started
截圖
如若不采用默認端口,先檢查4445端口有沒占用,netstat -anp | grep 4445,若無,使用命令定義4445端口:sh startAgent.sh --udp-port 4445 --tcp-port 4445
代理程序是用Java編寫的,所以需要JRE 1.4+來運行它。請注意可以創建自己的代理程序包,其中包含自己的JRE,因此不必在服務器上安裝Java(我們在Windows平台上進行了測試)。為此,只需在代理文件夾中創建一個JRE文件夾,然后復制一個安裝的JRE。將.bat文件中的java命令更改為java可執行文件的路徑,它將工作。
代理運行后,您可以使用PerfMon Metrics Collector Listener連接代理。可以添加多個服務器進行監控,一個圖形可以顯示多種指標(cpu,內存等),自動縮放行以便查看。
2.9客戶端配置,
2.10客戶端執行后,看結果
服務端:
客戶端:
2.11關閉服務器代理服務器,停止:>> sh startAgent.sh --udp-port 0 --auto-shutdown 若不行,直接Ctrl+C
代理關閉后,若客戶端Jmeter再執行時,模塊jp@gc - PerfMon Metrics Collector會報錯(執行時檢查服務器有沒正常開啟代理)
2.12補充一下linux某些建議(可不看)
要啟動代理,只需運行startAgent bat / sh文件即可。它將打開JMeter將連接並查詢指標的UDP / TCP服務器端口。一些信息將打印到標准輸出,通知您收集指標的問題(使用--loglevel參數調整的記錄詳細程度)。
可將偵聽端口指定為參數(0禁用偵聽),默認值為4444:
$ ./startAgent.sh --udp-port 0 --tcp-port 3450
INFO 2011-11-25 19:02:14.315 [kg.apc.p]():將TCP綁定到3450
啟動代理程序后,可以使用--auto-shutdown選項,以便在測試完成后自動停止。建議僅使用TCP連接使用此功能:
$ undera @ undera-HP:/ tmp / serverAgent $ ./startAgent.sh --udp-port 0 - 自動關機
INFO 2011-11-25 19:48:59.321 [kg.apc.p]():當所有客戶端斷開連接時,代理將關閉
INFO 2011-11-25 19:48:59.424 [kg.apc.p]():將TCP綁定到4444
可以使用--sysinfo選項查看可用的系統對象:
$ ./startAgent.sh --sysinfo
INFO 2011-11-25 19:51:25.517 [kg.apc.p]():***記錄可用進程***
INFO 2011-11-25 19:51:25.542 [kg.apc.p]():進程:pid = 24244 name = bash args = -bash
INFO 2011-11-25 19:51:25.543 [kg.apc.p]():進程:pid = 25086 name = dash args = / bin / sh ./startAgent.sh --sysinfo
INFO 2011-11-25 19:51:25.543 [kg.apc.p]():進程:pid = 25088 name = java args = java -jar ./CMDRunner.jar --tool PerfMonAgent --sysinfo
INFO 2011-11-25 19:51:25.549 [kg.apc.p]():***記錄可用的文件系統***
INFO 2011-11-25 19:51:25.551 [kg.apc.p]():文件系統:fs = / dev type = devtmpfs
INFO 2011-11-25 19:51:25.551 [kg.apc.p]():文件系統:fs = / type = ext4
INFO 2011-11-25 19:51:25.551 [kg.apc.p]():文件系統:fs = / var / run type = tmpfs
INFO 2011-11-25 19:51:25.551 [kg.apc.p]():文件系統:fs = / home type = ext4
INFO 2011-11-25 19:51:25.552 [kg.apc.p]():文件系統:fs = / var / lock type = tmpfs
INFO 2011-11-25 19:51:25.552 [kg.apc.p]():文件系統:fs = / proc type = proc
INFO 2011-11-25 19:51:25.553 [kg.apc.p]():***記錄可用的網絡接口***
INFO 2011-11-25 19:51:25.554 [kg.apc.p]():網絡接口:iface = lo addr = 127.0.0.1 type =本地環回
INFO 2011-11-25 19:51:25.554 [kg.apc.p]():網絡接口:iface = eth0 addr = 192.168.0.1 type =以太網
INFO 2011-11-25 19:51:25.555 [kg.apc.p]():***完成日志sysinfo ***
INFO 2011-11-25 19:51:25.555 [kg.apc.p]():將UDP綁定到4444
INFO 2011-11-25 19:51:26.560 [kg.apc.p]():將TCP綁定到4444
所述--interval <秒>參數可以用來改變指標收集頻率。
2.13使用服務器代理與其他應用程序
服務器代理使用簡單的明文協議,任何人都可以使用代理實現客戶端的功能,基於kg.apc.perfmon.client.Transport接口。如果有任何人有興趣,請在支持論壇上開始講話,我將介紹如何將第三方客戶端應用連接到代理。
erverAgent具有簡單的文本協議,可以在UDP和TCP傳輸上工作。大多數情況下都會使用TCP。
要與代理商進行第一次交談,請在本地開始。然后使用telnet實用程序連接到它:
user @ ubuntu:〜$ telnet localhost 4444
Trying 127.0.0.1 ...
Connected to localhost.
Escape character is '^]'.
如果連接成功,您應該在ServerAgent控制台日志中看到“接受新的TCP連接”消息。鍵入“test”,然后在telnet聊天中按Enter鍵,服務器應該用簡短的“Yep”回答:
test
Yes
鍵入“exit”:
exit
Connection closed by foreign host.--外部主機關閉連接。
發送命令行,服務器應答。命令行由命令組成,有時包含參數。參數與冒號的命令分開。
命令:
- exit - 終止當前客戶端會話,並關閉與代理的連接,無參數
- test - 測試服務器是否活着,沒有參數
- shutdown - 終止所有客戶端連接和關閉代理進程,無參數
- interval-“metrics”命令中使用的間隔 - 更改度量報告間隔,單個參數是以秒為單位的整數值。間隔可以在指標報告中間更改。示例:interval:5
- metrics - 啟動自動指標收集,參數是要收集的指標列表,如下所述。示例:metrics:cpu
- metrics-single-cell 單個度量收集迭代。示例:metrics-single:memory
四、JMeter屬性
- jmeterPlugin.perfmon.interval - 以毫秒為單位的度量采集間隔
- jmeterPlugin.perfmon.useUDP - true / false,啟用UDP連接后嘗試嘗試連接失敗的TCP連接
- jmeterPlugin.perfmon.label.useHostname - true / false,啟用“短”主機名,默認模式是([\ w \ - ] +)\ .. *
- jmeterPlugin.perfmon.label.useHostname.pattern - 字符串(轉義),提取主機名的正則表達式(第一組匹配)
- 例如默認模式將是:jmeterPlugin.perfmon.label.useHostname.pattern =([\ w \ - ] +)\ .. *
- 例如EC2的模式us-east / west子域匹配:jmeterPlugin.perfmon.label.useHostname.pattern =([\ w \ - ] + \。us-(east | west) - [0-9])*
- forcePerfmonFile - true / false,使其能夠使JMeter在當前目錄中使用perfmon度量寫入JTL文件