码迷,mamicode.com
首页 > 编程语言 > 详细

重复调用ab命令的shell代码和整理ab结果的java代码

时间:2016-05-12 19:21:45      阅读:322      评论:0      收藏:0      [点我收藏+]

标签:

先说下问题产生的背景,因为要做压力测试,频繁使用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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!