标签:
先说下问题产生的背景,因为要做压力测试,频繁使用ab命令,需要测试好多项,每项测试要做10遍以上,测试完了还要画测试结果曲线,又因为公司内网不稳定,测十遍都找不到个准确值,所以只能在别人下班时测试。但是问题是,一旦服务器改了配置,就要把所有测试再做一遍,而且只能晚上测,而且只能晚上测,而且只能晚上测。。。重要的事情说三遍。所以我想啊,晚上测试,白头干啥?于是白天写脚本了,晚上运行一下,早上来看结果,做做曲线图。
ab命令是一个很好的网站压力测试工具,
在mac下,查看帮助为 man ab
在linux下,查看帮助为 ab --help
简单实用方式为
ab -n 10000 -c 1 ‘http://172.20.15.73:8080/sqltest/csp!cspexecute.ies‘
n为次数,c为并发数
注意,如果url有参数,需要用单引号 ‘ 包裹,具体原因自己看shell教程
脚本主要分为两部分,一是shell代码,调用ab命令,二是java代码,处理返回结果。(按说吧,我应该再写一部分用js画个图什么的,不过懒了,等写了再补充吧)
脚本的目录结果如下
MacBook:speedTest in$ ls -R
javaTest speedTest.sh
./javaTest:
selectText.class selectText.java
第一部分,shell代码
#!/bin/sh
#产生数组
makeArray(){
tomcatArray=(
"http://172.20.15.73/csp!"
"http://172.20.15.73:8080/sqltest/csp!"
)
tomcat=${tomcatArray[$1]}
modeArray=(
‘ab -n 5000 -c 1 ‘
‘ab -n 10000 -c 1000 ‘
)
linkArray=(
"cspexecute.ies"
"cspjson.ies"
"cspGetUser.ies?id=8"
"cspUpdateUser.ies?id=8"
"jdbcEruptGetUser.ies?id=8"
"jdbcEruptUpdateUser.ies?id=8"
)
}
#根据当前时间产生文件夹来保存测试结果
prodir(){
dateArray=(`date`)
dirName=./result/${dateArray[1]}${dateArray[2]}_${dateArray[4]}_$1
mkdir -p $dirName
}
#主测试函数
doTest(){
makeArray $1;
prodir $1;
for link in ${linkArray[@]}
do
{
local textName=${dirName}/${link}.txt
echo $textName;
for((j=0;j<${#modeArray[@]};j++))
do
{
temString1="=====================测试${modeArray[${j}]}--${link}==========================="
echo "${temString1}\n" >> $textName
for((i=1;i<11;i++));do
{
temString2="=====================第 ${i} 次==========================="
echo "$temString1 \n $temString2 \n"
#temString3=""
temString3=`${modeArray[${j}]}${tomcat}${link}`
echo "$temString3"
echo "$temString2 \n $temString3" >> $textName
sleep 10
}
done
}
done
# 每一个连接测试完串行和并发之后,将其结果里的访问速度提取出来,放到simpleResult.text里面
java javaTest/selectText $textName $dirName/simpleResult.txt
}
done
}
if [ $# != 1 ]
then
echo "脚本使用方式为speedTest number0"
echo "number0的值为0是默认配置的tomcat,1是1000线程的tomcat"
echo "number0的值设置为自己写ab的链接时,默认循环10次"
else
# 如果result文件夹不存在,那么新建result文件夹来存放测试结果
# file="./result"
# if [ ! -e $file ]
# then
# mkdir $file
# fi
# 如果selectText.class不存在,编译selectText.java
# file="./java/selectText.class"
#
# if [ ! -e $file ]
# then
# javac selectText.java
# fi
# 执行主测试函数
doTest $1;
fi
这里说一下执行时遇到的一个问题,时常遇到 Operation timed out (60)这个问题:
apr_socket_recv: Operation timed out (60)
This is ApacheBench, Version 2.3 <$Revision: 1663405 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
但是单独执行ab命令时,没遇到过,所以把单次测试时 -n 10000 改为了-n 5000网上查了,没结果,自以为是连接超时,结果加了 -s 120 参数,依然报错。也许是mac的ox系统的原因。等在centos上测试了再来补充。
在centos上测试运行了两天,没有报 Operation timed out (60)这个错误。mac上报错,应该是ox系统是原因。
第二部分 java代码
package javaTest;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.RandomAccessFile;
public class selectText {
public static void main(String[] args) throws IOException {
if(args.length!=2){
System.out.println("请输入参数: java selectText 输入路径 输出路径");
return;
}
File inFile = new File(args[0]);
BufferedReader in = null;
try {
FileInputStream inStream = new FileInputStream(inFile);
in = new BufferedReader(new InputStreamReader(inStream));
RandomAccessFile randomFile = new RandomAccessFile(args[1], "rw");
long fileLength = randomFile.length();
randomFile.seek(fileLength);
randomFile.write(("输入文件:"+args[0]+"\n").getBytes());
String line;
while ((line = in.readLine()) != null) {
if(line.contains("Requests per second:")||line.contains("测试")){
System.out.println(line);
randomFile.write((line+"\n").getBytes());
}
}
randomFile.write((args[0]+"测试结束\n\n\n").getBytes());
randomFile.close();
inStream.close();
System.out.println(args[0]+"转换完成");
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
运行时,执行 ./speedTest.sh 1
重复调用ab命令的shell代码和整理ab结果的java代码
标签:
原文地址:http://blog.csdn.net/u014426603/article/details/51350655