用Jmeter进行同步压测(多线程模型)、会生成result.jtl结果文件,需要进一步分析结果文件,来统计想要的数据。我一般使用shell脚本进行分析。
result.jtl
timeStamp,elapsed,label,responseCode,responseMessage,threadName,dataType,success,failureMessage,bytes,sentBytes,grpThreads,allThreads,Latency,IdleTime,Connect 1497267773069,139,pay,2017061219425306104ngelB0111202,线程组 1-2,true,46,0 1497267848112,141,2017061219425306104aefto0111004,45,0 1497267944837,145,2017061219425306104yuXae0111206,42,0 @H_404_16@ |
对类似上述的日志中进行分析,目标需求是统计:请求总数(total number)、最小响应时间(MINRT)、平均相应时间(AVGRT)、最大相应时间(MAX RT)、响应时间分布:90%、99.5%、99.9%、99.99%、99.999%、吞吐量(TPS)、最耗时间的topN交易流水等。
第一步:首先因为压测时,压测客户端会与服务器建立TCP连接(三次握手),以及服务端线程池的预热启动,需要消耗比较长的时间。因此我们在压测结果文件result.jtl中将前N行去掉,不予统计。
sed -i '1,1000d' result.jtl@H_404_16@ |
第二步:统计从第一次请求完成,到最后一次请求结束,整个压测过程的总时间(result.jtl中的timeStamp记录了该请求响应的时间戳),在本次案例中即为1497267944837 - 1497267773069得到的时间(ms)。
cat result.jtl | awk '{print $1}' | awk -F "," '{print $1}' > totalTime.log begin=`head -1 totalTime.log` end=`tail -1 totalTime.log` timeCost=`awk -v x=$end -v y=$begin 'BEGIN{printf "%.2d\n",(x-y)/1000}'` @H_404_16@ |
第三步:统计每条请求的响应时间,elapsed为响应时间、responseMessage为交易流水ID
cat result.jtl | awk '{print $1}' | awk -F "," '{print $2}' > timeCostDetails.log cat result.jtl | awk '{print $1}' | awk -F "," '{print $2,$5}' > timeCostID.log @H_404_16@ |
第四步:对timeCostDetails.log文件进行排序
sort -ntimeCostDetails.log > sort_timeCostDetails.log@H_404_16@ |
第五步:统计交易总数
line=`cat timeCostDetails.log | wc -l` @H_404_16@ |
第六步:统计TPS
tps=`awk -v x=$line -v y=$timeCost 'BEGIN{printf "%.2d\n",x/y}'`@H_404_16@ |
第七步:统计AVG、MIN、MAX RT
avg=`cat sort_timeCostDetails.log | awk '{sum+=$1}END{print "",sum/'$line'}'` "ms" min=`head -l sort_timeCostDetails.log` "ms" max=`tail -l sort_timeCostDetails.log` "ms" @H_404_16@ |
第八步:统计响应时间分布,下面例子为响应时间为80ms~90ms以及90ms~100ms的分布情况
cattimeCostDetails.log | awk '$1>80&&$1<=90{a+=1}$1>90&&$1<=100{b+=1}END{print "80ms ~ 90ms",a,a/'$line' "\n 90ms ~ 100ms",b,b/'$line'}'@H_404_16@ |
第九步:统计99%,99.9%响应时间分布(实际上为正向排序后,第99分位以及99.9分位对应的值)
percent99=0.99 percent999=0.999 aa=`awk -v x=$line -v y="$percent99" 'BEGIN{printf "%.2d\n",x*y}'` bb=`awk -v x=$line -v y="$percent999" 'BEGIN{printf "%.2d\n",x*y}'` echo "99%: " `sed -n "$aa"p sort_timeCostDetails.log` "ms" echo "99.9%: " `sed -n "$bb"p sort_timeCostDetails.log` "ms" @H_404_16@ |
将上述相关命令封装成shell脚本exec.sh,通过执行exec.sh result.jtl即可将相关结果分析出来,得到详细的性能报告。