[前言]:
ab(Apache benchmark)是一款常用的压力测试工具。简单易用。然而与hp load runner比起来就不那么顺手了。ab的命令行一次只能支持一次测试。相要批量执行不同的测试方式,并自动对指标进行分析,那么单靠手工运行ab,一定会累到像狗一样趴下。好了,问题来了,批量模式怎么实现,那就要靠我们强大的shell了。
测试的同学,让我来解放你的双手。全新的ab压力测试工具ab-test-tools.sh闪亮登场!! ^_^
[脚本说明]:
本脚本支持ab大多常用参数,如果你需要更多参数,可以通过修改本脚本,加入你想要的即可。本脚本的特色:
- 批量测试。注意,并不是简单的批量测试,你可以定测测试轮数,间隔时间。
- 阶梯并发增长定制测试,如并发从100到1000,每轮测5次等。
- 支持ab的post file模式,你只要在参数-P | –postfile中带上你的数据文件即可。
- 即时指标分析显示,本shell可以将ab中常用的指示即时分析出来,测试完成后即进告知你结果。
脚本说明:
命令格式:
ab-test-tools.sh
-N|–count 总请求数,缺省 : 5w
-C|–clients 并发数, 缺省 : 100
-R|–rounds 测试次数, 缺省 : 10 次
-S|-sleeptime 间隔时间, 缺省 : 10 秒
-I|–min 最小并发数, 缺省: 0
-X|–max 最大并发数,缺省: 0
-J|–step 次递增并发数
-R|–runtime 总体运行时间,设置此项时最大请求数为5w
-P|–postfile post数据文件路径
-U|–url 测试地址
[脚本代码]:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 |
#!/bin/bash echo '*==========================================================*' echo '| 本脚本工具基于ab(Apache benchmark),请先安装好ab, awk |' echo '| 注意: |' echo '| shell默认最大客户端数为1024 |' echo '| 如超出此限制,请使用管理员执行以下命令: |' echo '| ulimit -n 655350 |' echo '*==========================================================*' function usage() { echo ' 命令格式:' echo ' ab-test-tools.sh' echo ' -N|--count 总请求数,缺省 : 5w' echo ' -C|--clients 并发数, 缺省 : 100' echo ' -R|--rounds 测试次数, 缺省 : 10 次' echo ' -S|-sleeptime 间隔时间, 缺省 : 10 秒' echo ' -I|--min 最小并发数, 缺省: 0' echo ' -X|--max 最大并发数,缺省: 0' echo ' -J|--step 次递增并发数' echo ' -R|--runtime 总体运行时间,设置此项时最大请求数为5w' echo ' -P|--postfile post数据文件路径' echo ' -U|--url 测试地址' echo '' echo ' 测试输出结果*.out文件' exit; } # 定义默认参数量 # 总请求数 count=50000 # 并发数 clients=100O # 测试轮数 rounds=10 # 间隔时间 sleeptime=10 # 最小并发数 min=0 # 最大数发数 max=0 # 并发递增数 step=0 # 测试地址 url='' # 测试限制时间 runtime=0 # 传输数据 postfile='' ARGS=`getopt -a -o N:C:R:S:I:X:J:U:T:P:h -l count:,client:,round:,sleeptime:,min:,max:,step:,runtime:,postfile:,help -- "$@"` [ $? -ne 0 ] && usage eval set -- "${ARGS}" while true do case "$1" in -N|--count) count="$2" shift ;; -C|--client) clients="$2" shift ;; -R|--round) rounds="$2" shift ;; -S|--sleeptime) sleeptime="$2" shift ;; -I|--min) min="$2" shift ;; -X|--max) max="$2" shift ;; -J|--step) step="$2" shift ;; -U|--url) url="$2" shift ;; -T|--runtime) runtime="$2" shift ;; -P|--postfile) postfile="$2" shift ;; -h|--help) usage ;; --) shift break ;; esac shift done # 参数检查 if [ x$url = x ] then echo '请输入测试url,非文件/以为结束' exit fi flag=0 if [ $min != 0 -a $max != 0 ] then if [ $max -le $min ] then echo '最大并发数不能小于最小并发数' exit fi if [ $step -le 0 ] then echo '并发递增步长不能<=0' exit fi if [ $min -lt $max ] then flag=1 fi fi # 生成ab命令串 cmd="ab -k -r" # 数据文件 if [ x$postf != x ] then cmd="$cmd -p $postf" fi if [ x$tl != x -a $tl != 0 ] then max=50000; cmd="$cmd -t$tl" fi cmd="$cmd -n$count" echo '-----------------------------'; echo '测试参数'; echo " 总请求数:$count"; echo " 并发数:$clients"; echo " 重复次数:$rounds 次"; echo " 间隔时间:$sleeptime 秒"; echo " 测试地址:$url"; if [ $min != 0 ];then echo " 最小并发数:$min"; fi if [ $max != 0 ];then echo " 最大并发数:$max"; fi if [ $step != 0 ];then echo " 每轮并发递增:$step" fi # 指定输出文件名 datestr=`date +%Y%m%d%H%I%S` outfile="$datestr.out"; # runtest $cmd $outfile $rounds $sleeptime function runtest() { # 输出命令 echo ""; echo ' 当前执行命令:' echo " $cmd" echo '------------------------------' # 开始执行测试 cnt=1 while [ $cnt -le $rounds ]; do echo "第 $cnt 轮 开始" $cmd >> $outfile echo "\n\n" >> $outfile echo "第 $cnt 轮 结束" echo '----------------------------' cnt=$(($cnt+1)) if [ $cnt -le $rounds ]; then echo "等待 $sleeptime 秒" sleep $sleeptime fi done } temp=$cmd; if [ $flag != 0 ]; then cur=$min over=0 while [ $cur -le $max ] do cmd="$temp -c$cur $url" runtest $cmd $outfile $rounds $sleeptime cur=$(($cur+$step)) if [ $cur -ge $max -a $over != 1 ]; then cur=$max over=1 fi done else cmd="$cmd -c$clients $url" runtest $cmd $outfile $rounds $sleeptime fi # 分析结果 if [ -f $outfile ]; then echo '本次测试结果如下:' echo '+------+----------+----------+---------------+---------------+---------------+--------------------+--------------------+' echo '| 序号 | 总请求数 | 并发数 | 失败请求数 | 每秒事务数 | 平均事务(ms) | 并发平均事务数(ms) | 总体传输字节数 |' echo '+------+----------+----------+---------------+---------------+---------------+--------------------+--------------------+' comp=(`awk '/Complete requests/{print $NF}' $outfile`) concur=(`awk '/Concurrency Level:/{print $NF}' $outfile`) fail=(`awk '/Failed requests/{print $NF}' $outfile`) qps=(`awk '/Requests per second/{print $4F}' $outfile`) tpr=(`awk '/^Time per request:(.*)\(mean\)$/{print $4F}' $outfile`) tpr_c=(`awk '/Time per request(.*)(mean, across all concurrent requests)/{print $4F}' $outfile`) trate=(`awk '/Transfer rate/{print $3F}' $outfile`) for ((i=0; i<${#comp[@]}; i++)) do echo -n "|" printf '%6s' $(($i+1)) printf "|" printf '%10s' ${comp[i]} printf '|' printf '%10s' ${concur[i]} printf '|' printf '%15s' ${fail[i]} printf '|' printf '%15s' ${qps[i]} printf '|' printf '%15s' ${tpr[i]} printf '|' printf '%20s' ${tpr_c[i]} printf '|' printf '%20s' ${trate[i]} printf '|' echo ''; echo '+-----+----------+----------+---------------+---------------+---------------+--------------------+--------------------+' done echo '' fi |
[测试示例]:
./ab_test_tool.sh -N2000 -R 2 -I 100 -X 1000 -J 100 -S 5 -U http://www.zzstudio.net/
[注意事项]:
- 每次测试结果以“yymmddhhiiss.out”存放在脚本所在目录,因此请保持脚本目录可写。
- ab的所有输出结果均可在.out中查到。测试结果只是展示部份指标,需要详细的可以在.out文件中查看
- 查看使用帮助可使用-h/–help。
- linux终端默认1024限制,如需大于此数,请使用管理员执行:”ulimit -n 655350″
- 本脚本未经时间检验,如有BUG,请及进反馈。