写了一个简单的http benchmark脚本

apache benchmark只能测一个单一url,我用shell写了一个benchmark脚本,支持并发测试,指定参数,不过没有对响应时间和ret code做统计,适用在服务器端做精确统计的情况。


#! /bin/bash



concurrency=50
workdirectory=/tmp/httpbenchmark_workdir/
inputurlfile=


function usage() {
  echo "Http Benchmark is used for sending http request in pararrel."
  echo "Usage: ./http_benchmark.sh [-c int] [-i string] [-w string]"
  echo "-c: Specify concurrency number.(Default: 50)"
  echo "-i: Specify input file, if it's empty,then read from standard input.(Default: \"\")"
  echo "-w: Specify work directory.(Default: \"/tmp/httpbenchmark_workdir/\")"
}


function thread_run() {
  fileno=$1
  while read url
  do
    curl $url -s -o /dev/null
  done < ${workdirectory}/spilits_${fileno}.lst 
}


while getopts 'c:i:w:h' OPTION
do
  case $OPTION in
    c) concurrency="$OPTARG"
       ;;
    i) inputurlfile="$OPTARG"
       ;;
    w) workdirectory="$OPTARG"
       ;;
    h) usage
       exit 0
       ;;
    ?) usage
       exit 1
       ;;
  esac
done
shift $((OPTIND - 1)) 


echo "Concurrency=${concurrency}"
echo "Workdirectory=${workdirectory}"
echo "InputUrlFile=${inputurlfile}"
rm -rf $workdirectory
mkdir -p $workdirectory


# split url list.
echo "Begin splitting urls..."
lineno=0
if [ -z $inputurlfile ]; then
  while read line
  do
    # as the 'split' command differs between different distribution, we do it manually.
    if [ -n $line ]; then
      fileno=`expr $lineno % $concurrency`
      echo $line >> ${workdirectory}/spilits_${fileno}.lst
      let lineno=$lineno+1
    fi
  done
else
  while read line
  do
    # as the 'split' command differs between different distribution, we do it manually.
    if [ -n $line ]; then
      fileno=`expr $lineno % $concurrency`
      echo $line >> ${workdirectory}/spilits_${fileno}.lst
      let lineno=$lineno+1
    fi
  done < $inputurlfile
fi
echo "Splitting done."


# 'curl' in pararrel.
for i in `seq 1 $concurrency`
do
  let pos=$i-1
  thread_run $pos &
done


# wait
echo "Waiting subprocesses joined.."
wait
echo "Benchmark finished!Please inspect server log."


# clean work directory.

rm -rf $workdirectory


后记:实际上这个脚本成了反例,因为在对搜索后端进行仅仅50并发的压测时发现超过一半的curl返回7即不能连接主机,同时测试的客户端机器cpu负载很高,推测这种方式类似于多线程,无阻塞方式下载,把系统资源全耗进去了。应该用select/poll/epoll方式单线程方式,使用http_load进行测试就很理想。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值