一宴凉、前言
對(duì)于運(yùn)維工程師來(lái)說(shuō)誊锭,需要對(duì)自己維護(hù)的服務(wù)器性能瓶頸了如指掌,比如我當(dāng)前的架構(gòu)每秒并發(fā)是多少弥锄,我服務(wù)器最大能接受的并發(fā)是多少丧靡,是什么導(dǎo)致我的性能有問(wèn)題;如果當(dāng)前架構(gòu)快達(dá)到性能瓶頸了籽暇,是橫向擴(kuò)容性能提升大温治,還是縱向擴(kuò)容性能提升大。
如果需要了解這些信息图仓,需要在兩方面下功夫,一個(gè)是對(duì)服務(wù)器進(jìn)行性能測(cè)試但绕,一個(gè)是對(duì)服務(wù)器進(jìn)行性能監(jiān)控救崔。
通過(guò)對(duì)服務(wù)器進(jìn)行性能測(cè)試:我們可以了解到當(dāng)前架構(gòu)的性能瓶頸惶看,還可以對(duì)架構(gòu)橫向擴(kuò)容和縱向擴(kuò)容來(lái)進(jìn)行測(cè)試,對(duì)后期的架構(gòu)擴(kuò)容提供數(shù)據(jù)參考六孵。
通過(guò)對(duì)服務(wù)器進(jìn)行性能監(jiān)控:我們可以了解當(dāng)前服務(wù)器的CPU纬黎、內(nèi)存、IO等資源是否耗盡劫窒,我們可以在監(jiān)控系統(tǒng)添加觸發(fā)器本今,一旦服務(wù)器資源在快要達(dá)到瓶頸的時(shí)候,我們可以觸發(fā)一個(gè)報(bào)警讓運(yùn)維人員來(lái)處理主巍,也可以觸發(fā)一個(gè)讓架構(gòu)進(jìn)行自動(dòng)化擴(kuò)容(如果是云平臺(tái)冠息,直接調(diào)用api創(chuàng)建主機(jī),ansible部署應(yīng)用和程序)
二孕索、Jmeter分布式壓測(cè)介紹
在工作中使用jmeter做大并發(fā)壓力測(cè)試的場(chǎng)景下逛艰,單機(jī)受限內(nèi)存、CPU搞旭、網(wǎng)絡(luò)IO散怖,會(huì)出現(xiàn)服務(wù)器壓力還沒(méi)有上去,但是壓測(cè)服務(wù)器已經(jīng)由于模擬的壓力太大死機(jī)了肄渗。為了讓jmeter工具提供更強(qiáng)大的負(fù)載能力镇眷,jmeter提供了多臺(tái)機(jī)器同時(shí)產(chǎn)生負(fù)載的機(jī)制。
原理:比如我在jmeter server配置線程數(shù)為10翎嫡,循環(huán)次數(shù)為100欠动,也就是會(huì)對(duì)測(cè)試服務(wù)器發(fā)起1000次請(qǐng)求,我有3臺(tái)agent服務(wù)器钝的,如果我在server端選擇遠(yuǎn)程啟動(dòng)壓力測(cè)試翁垂,那么每臺(tái)agent都會(huì)對(duì)測(cè)試服務(wù)器發(fā)起10100次請(qǐng)求,那么這次壓力測(cè)試產(chǎn)生的請(qǐng)求就是10100*3=3000
三硝桩、Jmeter分布式壓測(cè)環(huán)境搭建
3.1.搭建前說(shuō)明
服務(wù)器環(huán)境說(shuō)明:做性能測(cè)試可以直接在在云平臺(tái)按需購(gòu)買壓力機(jī)沿猜,一旦測(cè)試結(jié)束釋放壓力機(jī)即可。
分布式環(huán)境壓力服務(wù)器要求:
需要server(控制機(jī))和agent(壓力機(jī))碗脊,agent搭建在linux(centos 6.5)服務(wù)器環(huán)境下啼肩,server搭建在windows(server 2012)環(huán)境下。
壓力測(cè)試瓶頸大都在帶寬上面衙伶,需要保證壓力機(jī)的帶寬要比服務(wù)器的帶寬高祈坠,不然壓力上不去。
需要保證agent和server都在一個(gè)網(wǎng)絡(luò)中矢劲,且在多網(wǎng)卡環(huán)境需要保證啟動(dòng)的網(wǎng)卡都在一個(gè)網(wǎng)段赦拘。
需要保證server和agent之間的時(shí)間同步。
關(guān)閉防火墻芬沉。
3.2.Windows部署jmeter
(1)部署jdk環(huán)境,配置path變量
(2)直接去官網(wǎng)下載最新的二進(jìn)制源碼包即可躺同。
(3)解壓jmeter到指定目錄阁猜,設(shè)置path變量,安裝完成之后蹋艺,在命令行運(yùn)行jmeter命令剃袍,如果可以正常啟動(dòng)jmeter,說(shuō)明環(huán)境配置ok捎谨。
3.3.Linux部署jmeter
1)下載安裝
wget http://mirrors.tuna.tsinghua.edu.cn/apache//jmeter/binaries/apache-jmeter-3.1.zip
unzip apache-jmeter-3.1.zip -d /usr/local/
cd /usr/local/
ln -s apache-jmeter-3.1/ jmeter
2)配置啟動(dòng)腳本
#!/bin/bash
# chkconfig: 345 26 74
# description: jmeter agent
myip=`ifconfig eth0 |awk '/inet addr/{gsub(/addr:/,"");print $2}'`
cmd="/usr/local/jmeter/bin/jmeter-server -Djava.rmi.server.hostname=$myip"
start(){
$cmd &
}
stop(){
jmeter_pid=`ps aux | grep jmeter-server | grep -v grep | awk '{print $2}'`
for pid in $jmeter_pid;do
kill -9 $pid
done
}
act=$1
case $act in
'start')
start;;
'stop')
stop;;
'restart')
stop
sleep 2
start;;
*)
echo '[start|stop|restart]';;
esac
3)啟動(dòng)jmeter agent服務(wù)民效,驗(yàn)證是否監(jiān)聽(tīng)1099端口
[root@jmeter-agent-01 ~]# /etc/init.d/jmeter-agent start
[root@jmeter-agent-01 ~]# netstat -lntp | grep 1099
tcp 0 0 0.0.0.0:1099 0.0.0.0:* LISTEN 414/java
3.4.分布式環(huán)境配置
1)確保server和agnet安裝正確。
2)Agent啟動(dòng)涛救,并監(jiān)聽(tīng)1099端口畏邢。
3)在server機(jī)器的jmeter安裝目錄下bin目錄下,找到properties文件州叠,修改遠(yuǎn)程主機(jī)選項(xiàng)棵红,添加3個(gè)agent服務(wù)器的地址。
4)啟動(dòng)jmeter server咧栗,多網(wǎng)卡模式需要指定IP地址啟動(dòng)
jmeter -Djava.rmi.server.hostname=192.168.10.61
5)驗(yàn)證分布式環(huán)境是否搭建成功
1逆甜、jmeter啟動(dòng)之后在如下選項(xiàng)中,會(huì)出現(xiàn)你添加的遠(yuǎn)程主機(jī)列表
2、創(chuàng)建一個(gè)請(qǐng)求測(cè)試:創(chuàng)建一個(gè)訪問(wèn)百度的請(qǐng)求致板,訪問(wèn)次數(shù)為一次交煞,配置如下:
直接點(diǎn)擊啟動(dòng),是jmeter server機(jī)器發(fā)起一次請(qǐng)求斟或,結(jié)果如下
請(qǐng)求所有之前的請(qǐng)求數(shù)據(jù)之后素征,在選擇遠(yuǎn)程全部啟動(dòng),查請(qǐng)求就是三次,也就是每個(gè)agent服務(wù)器按照著server的配置,請(qǐng)求了一次抡锈。
如果你的環(huán)境在選擇全部啟動(dòng)之后,沒(méi)有報(bào)錯(cuò)端蛆,且發(fā)起請(qǐng)求數(shù)量和agent服務(wù)器數(shù)量一致,說(shuō)明jmeter分布式壓力測(cè)試環(huán)境搭建成功酥泛,可以進(jìn)行測(cè)試了今豆。
四、Jmeter斷言
4.1.斷言介紹
jmeter斷言常用有兩種柔袁,一種是響應(yīng)斷言呆躲,一種是響應(yīng)時(shí)間斷言,如果響應(yīng)內(nèi)容不滿足斷言的配置捶索,則認(rèn)為這次的請(qǐng)求是失敗的插掂。
響應(yīng)斷言:判斷響應(yīng)內(nèi)容是否包含指定的字符信息,用于判斷api接口返回內(nèi)容是否正確。
響應(yīng)時(shí)間斷言:判斷響應(yīng)時(shí)間辅甥,是否超過(guò)預(yù)期的時(shí)間箩祥,用于判斷api接口返回時(shí)間是否超過(guò)預(yù)期。
4.2.斷言配置
1)修改http為實(shí)際的api測(cè)試請(qǐng)求肆氓。
2)斷言添加方式:右擊測(cè)試計(jì)劃的http請(qǐng)求,選擇添加à斷言à添加響應(yīng)斷言和斷言持續(xù)時(shí)間底瓣。
3)配置響應(yīng)斷言:我們接口正常返回code值為2000谢揪,如果接口返回code值不是2000表示接口異常,為了測(cè)試捐凭,這里修改為接口返回code值不為2222則表示訪問(wèn)失敗拨扶。
4)配置斷言響應(yīng)時(shí)間:設(shè)置請(qǐng)求接口時(shí)間超過(guò)1毫秒,則認(rèn)為請(qǐng)求失敗茁肠。
5)驗(yàn)證斷言配置:發(fā)起http請(qǐng)求患民,由于返回內(nèi)容code值不為2222,以及訪問(wèn)時(shí)間超過(guò)1毫秒垦梆,所以認(rèn)為訪問(wèn)失敗匹颤。
五、Jmeter變量配置(參數(shù)化)
使用變量的場(chǎng)景舉例:我們需要測(cè)試性能的曲線模型托猩,也就是由輕壓力慢慢變?yōu)橹貕毫τ”停瑏?lái)測(cè)試我們的性能拐點(diǎn),這個(gè)時(shí)候jmeter就需要配置多個(gè)線程組京腥,每個(gè)線程組需要設(shè)置http請(qǐng)求赦肃。由于每次測(cè)試性能的曲線模型都是同一個(gè)接口,所以每次修改接口都需要修改http請(qǐng)求公浪,這個(gè)時(shí)候如果使用了變量他宛,就意味著每次修改api只需要修改api的變量即可。
在測(cè)試計(jì)劃中設(shè)置參數(shù):
引用:
六欠气、測(cè)試中的監(jiān)控
6.1.并發(fā)測(cè)試監(jiān)控
并發(fā)測(cè)試直接發(fā)起指定數(shù)量的請(qǐng)求厅各,比如一起發(fā)起10萬(wàn)請(qǐng)求看一下系統(tǒng)的處理能力,這個(gè)時(shí)候如果需要服務(wù)器的資源使用信息晃琳,就不能使用比如zabbix監(jiān)控系統(tǒng)了讯检,因?yàn)橐话闾幚?0萬(wàn)請(qǐng)求,對(duì)于我們來(lái)說(shuō)20秒可以處理完畢卫旱,但是zabbix數(shù)據(jù)采集是每分鐘一次人灼,這樣采集到的數(shù)據(jù)明顯是不準(zhǔn)的,這樣就需要通過(guò)系統(tǒng)自帶的監(jiān)控命令顾翼,來(lái)實(shí)時(shí)查詢服務(wù)器的性能投放,比如可以通過(guò)dstat或者glances等動(dòng)態(tài)監(jiān)控命令來(lái)分析系統(tǒng)的性能。
補(bǔ)充:不是測(cè)試每一個(gè)接口都需要進(jìn)行這樣的實(shí)時(shí)監(jiān)控适贸,比如過(guò)測(cè)試我的大部分接口TPS可達(dá)5000灸芳,但是其中一個(gè)接口只能達(dá)到2000這個(gè)時(shí)候就需要在測(cè)試的時(shí)候?qū)崟r(shí)監(jiān)控涝桅,看一下到底是什么原因?qū)е滦阅苌喜蝗ァJ怯捎诜祷財(cái)?shù)據(jù)太大導(dǎo)致網(wǎng)絡(luò)帶寬被占滿烙样;還是sql執(zhí)行時(shí)間太長(zhǎng)導(dǎo)致數(shù)據(jù)庫(kù)負(fù)載高冯遂,還是代碼有問(wèn)題導(dǎo)致web服務(wù)cpu占用高。
6.2 穩(wěn)定性測(cè)試監(jiān)控
穩(wěn)定性測(cè)試就是持續(xù)不斷模擬指定數(shù)量請(qǐng)求谒获,來(lái)訪問(wèn)服務(wù)器蛤肌,比如我每秒向測(cè)試服務(wù)器發(fā)起4000請(qǐng)求,持續(xù)12小時(shí)批狱,來(lái)看看服務(wù)器會(huì)出現(xiàn)什么情況裸准,這個(gè)時(shí)候就需要用到zabbix來(lái)進(jìn)行監(jiān)控了,下面是我做性能測(cè)試的部分監(jiān)控接口赔硫,包含tomcat每秒請(qǐng)求炒俱,服務(wù)器入口流量,整個(gè)集群每分鐘請(qǐng)求的http狀態(tài)碼統(tǒng)計(jì)爪膊,還有服務(wù)器資源使用信息权悟。