最近有個(gè)測(cè)試項(xiàng)目攘宙,是針對(duì)云平臺(tái)的數(shù)據(jù)庫(kù)連接穩(wěn)定性測(cè)試颂跨,一般做穩(wěn)定性測(cè)試想到的工具是Loadrunner祈惶,因?yàn)椤俺墒旆€(wěn)定”柒瓣,但是這么重量級(jí)的工具不適合搬到云平臺(tái)上開(kāi)展測(cè)試。于是就想到了Jmeter撵枢,Jmeter是優(yōu)秀的開(kāi)源測(cè)試工具民晒,但是其穩(wěn)定性還有待驗(yàn)證。
? ? ? ?首先將Jmeter輕量包(免安裝)上傳到云平臺(tái)锄禽,這次肯定是要分布式測(cè)試了(因?yàn)橐獪y(cè)試20臺(tái)虛擬機(jī)與阿里Mysql連接的穩(wěn)定性)潜必,每一臺(tái)虛擬機(jī)都部署上JDK和Jmeter,并啟動(dòng)jmeter-server沃但。主控機(jī)的jmeter肯定不能用GUI模式調(diào)用了(要是那樣的話不得內(nèi)存溢出或卡到死)磁滚,直接通過(guò)以下命令調(diào)用(好處就不說(shuō)了):
jmeterHome3.1\bin\jmeter -n -t jmeterHome3.1\bin\MysqlTest.jmx -R 10.2.116.116,10.2.116.118,[省略后面的IP] -l DashReport\log-20180413.csv -e -o DashReport\htmlReport-20180413
對(duì)于遠(yuǎn)程負(fù)載機(jī)較多的情況,就可以在jmeter-server文件上配置宵晚,然后用 -r (上面是用-R)來(lái)表示啟動(dòng)遠(yuǎn)程壓力機(jī)恨旱。上面的命令除了生成報(bào)告日志csv,還有通過(guò)DashReport自動(dòng)生成視圖報(bào)告坝疼。關(guān)于如何產(chǎn)生DashReport可視化測(cè)試報(bào)告,可以參考我的另一篇文章 Jmeter和Ant的html報(bào)告優(yōu)化及Dashboard Report介紹【https://blog.csdn.net/smooth00/article/details/78728060】谆沃。
? ? ? ?按理到這一步钝凶,就達(dá)到我的要求了,但是經(jīng)過(guò)實(shí)際操作后發(fā)現(xiàn)問(wèn)題的嚴(yán)峻性了,那就是隨著測(cè)試時(shí)間的延長(zhǎng)(不到4小時(shí))耕陷,發(fā)現(xiàn)log-20180413.csv報(bào)告文件越來(lái)越大掂名,當(dāng)超過(guò)1G后,問(wèn)題就暴露了哟沫,這么大的監(jiān)控日志如何轉(zhuǎn)換成html報(bào)告(實(shí)際上只有最近1個(gè)小時(shí)的監(jiān)控?cái)?shù)據(jù)能夠轉(zhuǎn)換饺蔑,再長(zhǎng)時(shí)間的就處理不過(guò)來(lái)了,更別提我要進(jìn)行跨天的測(cè)試監(jiān)控)嗜诀,另外一個(gè)嚴(yán)峻的問(wèn)題是猾警,隨著測(cè)試文件的越來(lái)越大,對(duì)Jmeter造成了挑戰(zhàn)隆敢,這就是最大的不穩(wěn)定因素发皿,磁盤(pán)的讀寫(xiě)瓶頸,隨時(shí)都可能讓它崩潰拂蝎。(注:這個(gè)問(wèn)題在Windows下表現(xiàn)尤為明顯穴墅,在Linux下就算產(chǎn)生再大的報(bào)告文件也不至于讓Jmeter出現(xiàn)運(yùn)行異常,但是最終要將超過(guò)幾個(gè)G的報(bào)告轉(zhuǎn)為html報(bào)告也會(huì)是件要命的事温自,需要找個(gè)內(nèi)存高的機(jī)器專(zhuān)門(mén)用來(lái)轉(zhuǎn)換html報(bào)告)
? ? ? ? 這時(shí)候我的想法就是如何將測(cè)試監(jiān)控日志保存到數(shù)據(jù)庫(kù)玄货,第一個(gè)方案就是通過(guò)Beanshell來(lái)計(jì)算JDBC請(qǐng)求的響應(yīng)時(shí)間,分別通過(guò)BeanShell PreProcessor和BeanShell PostProcessor來(lái)獲取請(qǐng)求前和請(qǐng)求后的時(shí)間戳悼泌,然后相減算出時(shí)間差:
import java.util.Date;
long planDate2 = System.currentTimeMillis();//planDate是在PreProcessor生成的時(shí)間戳
long conTime=planDate2-Long.valueOf(vars.get("planDate")).longValue();
vars.put("connTime",conTime.toString());
?同時(shí)獲取每臺(tái)壓力機(jī)的IP
String addr = InetAddress.getLocalHost().getHostAddress();//獲得各個(gè)壓力機(jī)IP
vars.put("addrIP",addr);
? ? ? ?然后把請(qǐng)求的響應(yīng)時(shí)間松捉、壓力機(jī)IP、請(qǐng)求開(kāi)始的時(shí)間戳券躁,把這些數(shù)據(jù)通過(guò)JDBC的insert請(qǐng)求插入到數(shù)據(jù)庫(kù)表中惩坑,作為監(jiān)控?cái)?shù)據(jù),然后通過(guò)可視化平臺(tái)展現(xiàn)出來(lái)(我用的是我們APM工具當(dāng)中的自定義輪詢(xún)查詢(xún)的方式)也拜,展現(xiàn)效果如下:
? ? ? ?按理這樣也算達(dá)到我的目的了以舒,但是接著又出現(xiàn)一個(gè)新問(wèn)題,就是這種輪詢(xún)展現(xiàn)的方式過(guò)于機(jī)械化慢哈,因?yàn)檩喸?xún)的時(shí)間是1分種一次蔓钟,精度上不夠,又不能靈活的選擇監(jiān)控時(shí)間段卵贱,這樣隨著測(cè)試時(shí)間的拉長(zhǎng)滥沫,測(cè)試曲線圖密度越來(lái)越大,最后就不直觀了键俱。而且還有個(gè)更嚴(yán)重的問(wèn)題兰绣,如果Jmeter出問(wèn)題了,也沒(méi)法第一時(shí)間發(fā)現(xiàn)和排查编振。
? ? ? ?看來(lái)我的想法跟實(shí)際還是有不小差距缀辩,上網(wǎng)專(zhuān)門(mén)查了一下,發(fā)現(xiàn)Jmeter其實(shí)是有相關(guān)的功能的,即 Jmeter + Grafana + InfluxDB的方式臀玄,于是我又開(kāi)始用最短的時(shí)間瓢阴,配置了InfluxDB、Grafana(開(kāi)始以為這個(gè)部署過(guò)程會(huì)很長(zhǎng)健无,沒(méi)想到這兩工具也是輕量化的荣恐,不用安裝也能運(yùn)行)。
1累贤、下載叠穆,grafana-5.0.4.windows-x64.zip和influxdb-1.5.1_windows_amd64.zip,為什么下載Windows版本畦浓,主要是因?yàn)閼械迷贚inux下配置痹束,先用順Windows下的再說(shuō)。
(1)到官網(wǎng)下載influxdb讶请,https://portal.influxdata.com/downloads祷嘶,說(shuō)是要翻墻下,其實(shí)也不用夺溢,只要右鍵查看網(wǎng)站源碼论巍,就能看到下載鏈接:
(2)到官網(wǎng)下載grafana,https://grafana.com/grafana/download?platform=windows
2风响、直接解壓嘉汰,就可以開(kāi)始配置和使用
(1)針對(duì)influxdb,修改influxdb.conf文件(jmeter通過(guò)2003端口連)
[[graphite]]
? enabled = true
? database = "jmeter"
? bind-address = ":2003"
? protocol = "tcp"
? consistency-level = "one"
把http的8086端口的注釋也去掉(grafana通過(guò)8086端口連)
[http]
? # Determines whether HTTP endpoint is enabled.
? enabled = true
? # The bind address used by the HTTP service.
? bind-address = ":8086"
啟動(dòng)influxdb状勤,通過(guò)CMD到influxdb的目錄下鞋怀,直接命令?influxd -config influxdb.conf 啟動(dòng)
(2)針對(duì)Jmeter,添加“監(jiān)聽(tīng)器 -> Backend Listener”持搜,并配置“Backend Listener”,主要配置Host密似,如下圖:
? ? ?以上的配置,跟默認(rèn)情況不一樣的是葫盼,將summaryOnly設(shè)為false残腌,useRegexpForSamplersList設(shè)為true,并配置了samplersList的正則表達(dá)試為JDBC.*贫导,目的是可以監(jiān)聽(tīng)所有以JDBC名稱(chēng)開(kāi)頭的Request請(qǐng)求抛猫。
(3)針對(duì)grafana,很簡(jiǎn)單孩灯,到Grafana安裝目錄中的bin目錄下闺金,雙擊grafana-server.exe啟動(dòng)程序
訪問(wèn)http://localhost:3000,用admin(密碼admin)登錄峰档,開(kāi)始配置:
第一步掖看、配置數(shù)據(jù)庫(kù)匣距,在設(shè)置-->Data Sources,添加哎壳,配置以下畫(huà)圈的部分就可以了,然后直接保存通過(guò)
第二步尚卫,在面板中添加Graph归榕,選擇Data Source為jmeter,在查詢(xún)條件中吱涉,選擇你要監(jiān)控的指標(biāo)刹泄,可以添選多個(gè)指標(biāo)
配置好了,就能看到圖了怎爵。如果看不到圖特石,請(qǐng)用Jmeter多發(fā)幾次請(qǐng)求”盍矗可以選擇最右上角的監(jiān)控時(shí)間段來(lái)精確化的監(jiān)控指定時(shí)間段的測(cè)試數(shù)據(jù):
? ? ? ?以上是我配置后產(chǎn)生的監(jiān)控效果圖姆蘸,由于可以實(shí)時(shí)監(jiān)控,查看歷史監(jiān)控芙委,按15分種逞敷、半小時(shí)、1小時(shí)灌侣、1天的不同時(shí)段展現(xiàn)推捐,很好的解決了我要求長(zhǎng)時(shí)間監(jiān)控測(cè)試的目的。測(cè)試數(shù)據(jù)不再通過(guò)文件保存侧啼,避免了磁盤(pán)IO限制的問(wèn)題牛柒,也解決了測(cè)試時(shí)間過(guò)長(zhǎng),報(bào)告無(wú)法讀取和展現(xiàn)的問(wèn)題痊乾。
另外用這種測(cè)試模式皮壁,我們還可以達(dá)到Jmeter分布式集群的去中心化,讓Master不再負(fù)責(zé)各節(jié)點(diǎn)測(cè)試數(shù)據(jù)的收集和處理(交給influxdb來(lái)完成)符喝,只專(zhuān)注于slave的調(diào)度闪彼,甚至可以進(jìn)行多master-slave部署,由Jenkins進(jìn)行同步調(diào)度測(cè)試协饲。
附:幾種我們常用的監(jiān)控指標(biāo):
為了能方便的同時(shí)啟動(dòng)influxDB和Grafana畏腕,我專(zhuān)門(mén)寫(xiě)了啟動(dòng)腳本,有兩份茉稠,一份是windows版的描馅,一份是Linux版的
Windows版的啟動(dòng)腳本:
@echo off
startcmd /k""%~dp0influxdb-1.5.1/influxd.exe" -config "%~dp0influxdb-1.5.1/influxdb.conf""
cd"%~dp0grafana-5.0.4\bin"
startcmd /k"grafana-server.exe"
Linux版的啟動(dòng)腳本(為了后臺(tái)運(yùn)行并且避免進(jìn)程沖突,linux版的寫(xiě)的比較復(fù)雜一些):
#!/bin/bash
# Author:zheng
# Date:2018-04-18
InstanceCount=1
Cur_Dir=$(cd"$(dirname "$0")";pwd)
influxdb_v=influxdb-1.5.1
grafana_v=grafana-5.0.4
chmod -R 777$Cur_Dir/$influxdb_v/bin
chmod -R 777$Cur_Dir/$grafana_v/bin
echo-n `date +'%Y-%m-%d %H:%M:%S'`
echo"----Current directory is "$PWD
# 檢查$ProcessName實(shí)例是否已經(jīng)存在
#while [ 1 ] ; do
#$PROCESS_NUM獲取指定進(jìn)程名的數(shù)目
PROCESS_NUM=`ps -ef | grep"influxd"| grep -v"grep"| wc -l`
if[$PROCESS_NUM-lt$InstanceCount];
then
StopCount=`expr$InstanceCount-$PROCESS_NUM`
echo-n `date +'%Y-%m-%d %H:%M:%S'`
echo"----influxd service [total$StopCount] was not started."
echo-n `date +'%Y-%m-%d %H:%M:%S'`
echo"----Starting influxd service[total$StopCount] ."
(nohup$Cur_Dir/$influxdb_v/bin/influxd -config$Cur_Dir/$influxdb_v/influxdb.conf) >>/dev/null 2>&1 &
else
PROCESS_PID=`pidof -s influxd | awk'{print $1}'`
echo-n `date +'%Y-%m-%d %H:%M:%S'`
echo"---kill influxd [pid$PROCESS_PID]"
pidof -s influxd | awk'{print $1}'| xargskill-9
sleep 2
echo"----Restart influxd service[total$InstanceCount]."
(nohup$Cur_Dir/$influxdb_v/bin/influxd -config$Cur_Dir/$influxdb_v/influxdb.conf) >>/dev/null 2>&1 &
fi
PROCESS_NUM=`ps -ef | grep"grafana-server"| grep -v"grep"| wc -l`
if[$PROCESS_NUM-lt$InstanceCount];
then
StopCount=`expr$InstanceCount-$PROCESS_NUM`
echo-n `date +'%Y-%m-%d %H:%M:%S'`
echo"----grafana service [total$StopCount] was not started."
echo-n `date +'%Y-%m-%d %H:%M:%S'`
echo"----Starting grafana service[total$StopCount] ."
cd$Cur_Dir/$grafana_v/bin
(nohup ./grafana-server) >>/dev/null 2>&1 &
else
PROCESS_PID=`pidof -s grafana-server | awk'{print $1}'`
echo-n `date +'%Y-%m-%d %H:%M:%S'`
echo"---kill grafana-server [pid$PROCESS_PID]"
pidof -s grafana-server | awk'{print $1}'| xargskill-9
sleep 2
echo"----Restart grafana service[total$InstanceCount]."
cd$Cur_Dir/$grafana_v/bin
(nohup ./grafana-server) >>/dev/null 2>&1 &
fi
sleep 2
Grafana作為一款輕量級(jí)的報(bào)表工具而线,功能還是很強(qiáng)大的铭污,以下是我配置的指標(biāo)效果圖(有點(diǎn)花哨):
補(bǔ)充說(shuō)明:
針對(duì)Jmeter的Backend Listener如果在implementation選項(xiàng)中選擇第二項(xiàng)恋日,我們將會(huì)得到不一樣的監(jiān)控效果:
重新配置一下參數(shù):
?再次發(fā)起測(cè)試,我們會(huì)發(fā)現(xiàn)influxDB的表結(jié)構(gòu)出現(xiàn)了變化嘹狞,變成單獨(dú)創(chuàng)建一個(gè)總的jmeter表(原來(lái)的方式是一個(gè)統(tǒng)計(jì)指標(biāo)創(chuàng)建一張表岂膳,會(huì)有很多張表):
這樣的表信息量大,可以方便構(gòu)建更直觀的監(jiān)控視圖:
測(cè)試監(jiān)控完全依賴(lài)端口的連通性,請(qǐng)確保2003和8086端口的通達(dá)涧偷,否則監(jiān)控不到數(shù)據(jù)時(shí)簸喂,也不會(huì)有相關(guān)的報(bào)錯(cuò)提示。