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进行测试就很理想。