用shell脚本分析性能压测日志小记

原创
2017/06/13 13:15
阅读数 704

用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,0,0,46,46,0,0,0

1497267848112,141,pay,,2017061219425306104aefto0111004,线程组 1-2,,true,0,0,45,45,0,0,0

1497267944837,145,pay,,2017061219425306104yuXae0111206,线程组 1-2,,true,0,0,42,42,0,0,0

对类似上述的日志中进行分析,目标需求是统计:请求总数(total number)、最小响应时间(MINRT)、平均相应时间(AVG RT)、最大相应时间(MAX RT)、响应时间分布:90%、99.5%、99.9%、99.99%、99.999%、吞吐量(TPS)、最耗时间的topN交易流水等。

第一步:首先因为压测时,压测客户端会与服务器建立TCP连接(三次握手),以及服务端线程池的预热启动,需要消耗比较长的时间。因此我们在压测结果文件result.jtl中将前N行去掉,不予统计。

sed -i '1, 1000d' result.jtl

第二步:统计从第一次请求完成,到最后一次请求结束,整个压测过程的总时间(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}'`

第三步:统计每条请求的响应时间, 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

第四步:对timeCostDetails.log文件进行排序

sort -n timeCostDetails.log > sort_timeCostDetails.log

第五步:统计交易总数

line=`cat timeCostDetails.log | wc -l`

第六步:统计TPS

tps=`awk -v x=$line -v y=$timeCost 'BEGIN{printf "%.2d\n", x/y}'`

第七步:统计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"

第八步:统计响应时间分布,下面例子为响应时间为80ms~90ms以及90ms~100ms的分布情况

cat timeCostDetails.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'}'

第九步:统计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"

将上述相关命令封装成shell脚本exec.sh, 通过执行exec.sh result.jtl即可将相关结果分析出来,得到详细的性能报告。

展开阅读全文
打赏
1
6 收藏
分享
加载中
更多评论
打赏
0 评论
6 收藏
1
分享
返回顶部
顶部