Siege是Linux下的一个web系统的压力测试工具,支持多链接,支持get和post请求,可以对web系统进行多并发下持续请求的压力测试。
安装 Siege
01
02
03
04
|
#wgethttp://www.joedog.org/pub/siege/siege-latest.tar.gz
#tar -xzvf siege-latest.tar.gz
#./configure; make
#make install
|
Siege命令常用参数
-c 200 指定并发数200
-r 5 指定测试的次数5
-f urls.txt 制定url的文件
-i internet系统,随机发送url
-b 请求无需等待 delay=0
-t 5 持续测试5分钟
# -r和-t一般不同时使用
常用的siege命令举例
# 200个并发对http://www.google.com发送请求100次
01
|
siege -c 200 -r 100 http:
//www
.google.com
|
# 在urls.txt中列出所有的网址
01
|
siege -c 200 -r 100 -f urls.txt
|
# 随机选取urls.txt中列出所有的网址
01
|
siege -c 200 -r 100 -f urls.txt -i
|
# delay=0,更准确的压力测试,而不是功能测试
01
|
siege -c 200 -r 100 -f urls.txt -i -b
|
# 指定http请求头 文档类型
01
|
siege -H
"Content-Type:application/json"
-c 200 -r 100 -f urls.txt -i -b
|
Siege输出结果说明
Transactions: 总共测试次数
Availability: 成功次数百分比
Elapsed time: 总共耗时多少秒
Data transferred: 总共数据传输
Response time: 等到响应耗时
Transaction rate: 平均每秒处理请求数
Throughput: 吞吐率
Concurrency: 最高并发
Successful transactions: 成功的请求数
Failed transactions: 失败的请求数
Siege使用的一些总结
1,发送post请求时,url格式为:http://www.xxxx.com/ POST p1=v1&p2=v2
2,如果url中含有空格和中文,要先进行url编码,否则siege发送的请求url不准确
添加
siege -C 可以查看相关的配置参数,可以自行修改,比如是否显示log,超时时间
SIEGE
官方网站http://www.joedog.org/
概述
Siege是一个多线程http负载测试和基准测试工具。它有3种操作模式:
-
Regression(when invoked by bombardment)Siege从配置文件中读取URLs,按递归方式,逐个发送请求
-
Internetsimulation (Siege从配置文件中读取URLs,随机选取URL发送请求)
-
Bruteforce (在命令行上写上一个单独的URL,发送请求)
安装
$wget http://www.joedog.org/pub/siege/siege-2.70.tar.gz
$tar zxvf siege-2.70.tar.gz
$./configure
$make
$sudo make install
调用
Siege以命令行方式使用,调用格式如下:
-
siege[options]
-
siege[options] [url]
-
siege-g [url]
Siege的选项说明:
-V , --version
打印siege的版本信息
-h , --help
打印帮助信息
-C , --config
打印当前配置。这个选项读取.siegerc并打印。你可以通过编辑$HOME/.siegerc修改配置。如果没有这个文件,你可以运行siege.config(/usr/local/bin/siege.config
)来生成此文件。
-v , --verbose
打印详细信息。包含请求的协议、响应码、请求的URL
-gURL , --get URL
获得一个HTTP事务。导出headers和显示HTTP交易。对于debug有所帮助。
-cNUM , --concurrent=NUM
并发用户数(必需参数)。
-i , --internet
此选项配合URLs的配置文件使用。每个虚拟用户每次请求的URL是随机从配置文件的获取。
-tNUMm , --time=NUMm
设置测试运行的时间。单位S\M\H代表秒\分\时。单位大小写不敏感。数字和单位之间不要有空格。
-fFILE , --file=FILE
被测试的URLs配置文件。默认$SIEGE_HOME/etc/urls.txt
-l , --log
记录统计信息到$SIEGE_HOME/var/siege.log
-m MESSAGE , --mark=MESSAGE
此选项允许你使用分隔符标记日志文件。没必要与'-l'同时使用。
-dNUM , --delay=NUM
TimeDELAY, random delay before each requst between 1 and NUM. (NOTCOUNTED IN STATS)
-b , --benchmark
BENCHMARK, runs the test with NO DELAY for throughput benchmarking.负载测试时不推荐使用。
-H HEADER , --header=HEADER
HEADER,该选项允许你添加额外的头信息。
R SIEGERC , --rc=SIEGERC
设置运行参数配置文件。默认$HOME/.siegerc
-A "User Agent" ,--user-agent="User Agent"
AGENT,定制客户端信息。
URL格式
支持的格式:
[protocol://]host.domain.xxx [:port] [/path/file]
host.domain.xxx/filePOST field=value&field2=value2
host/file POST
在命令行上输入URL时,最好用引号括起来。目前支持http和https两种协议。没有写明协议,默认http
当一次测试中需要多个URL时,可以将URLs放到一个单独的文件中。默认$SIEGE_HOME/etc/urls.txt
例如:urls.txt
#这里表述注释,一行一个URL
http://homer.whoohoo.com/index.html
http://homer.whoohoo.com/howto.jsp
http://Go.whoohoo.com/cgi-bin/q.cgi?scope=a
http://go.whoohoo.com/cgi-bin/q.cgiPOST scope=a
http://homer.whoohoo.com/my.jspPOST a=1&b=2
# POST文件
www.haha.com/aha.jspPOST
www.haha.com/parser.jspPOST <./my.txt
Siege一次性将文件读入内存,按照文件中顺序发送请求。[-i]选项可以随机发送URL请求。
在文件中,我们可以设置和引用变量。先定义后引用原则。一个变量一行,类似于shell变量,引用时用$()或者${},如
HOST =homer.whoohoo.com
http://${HOST}/index.html
如果变量不存在,则表示空字符串。
测试报告
测试结果会打印在屏幕上,格式如下
** Siege 2.70
** Preparing100 concurrent users for battle.
Theserver is now under siege...done
Transactions: 339 hits
Availability: 93.39 %
Elapsedtime: 67.47 secs
Datatransferred: 4273708 bytes
Responsetime: 8.25 secs
Transactionrate: 5.02 trans/sec
Throughput: 63342.34 bytes/sec
Concurrency: 41.47
Successfultransactions: 337
Failedtransactions: 26
Longesttransaction: 17.77 secs
Shortesttransaction: 0.37 secs
各项含义说明:
Transactions
The number ofserver hits.一般等于num1* num2 (-c num1 -r num2) 。有时会超过这个值,例如重定向会算做2次hit。
Availability
服务器成功处理的socket连接的百分比。这个数字不包含400和500级别的错误。
Elapsed time
本次测试所消耗的时间。
Data transferred
传输数据的总和。它包含header和content,所以数字可能会大于服务端的数字。如果使用[-i]选项,因为每次请求的URL是从urls.txt中随机选取的,所以这个值每次运行都会不同。
Response time
平均响应时间。
Transaction rate
这个就是TPS。
Throughput
从server到模拟用户的每秒传输数据量[bytes],即吞吐率。
Concurrency
同时连接数平均值。该值的上升伴随着服务器性能的下降。
Successful transactions
服务器响应code<400的请求次数。
Failed transactions
服务器响应code>=400,加上处理失败的socket连接(包含timeout)的数量。
测试举例
测试数值设计,设计测试场景时,最好根据实际情况分析线上日志得出需要的测试标准。webalizer这是一个免费得日志分析工具,也可以自己编写脚本分析。
Case1 -c100 -d5(5秒内点击率100)
Case2 -c200 -d5(5秒内点击率200)
Case3 -c300 -d5(5秒内点击率300)
Case4 -c400 -d5(5秒内点击率400)
Case5 -c100 -d1 (5秒内点击率500,这里与上面设置方法稍有区别)
平均响应时间(Y--秒X--百Vusers)
TPS(Y--TPS X--百Vusers)
求教:Concurrency(这个是我目前没搞明白的,网上那些人也没弄明白,所有人都翻译为并发用户数,然而-cnum中的参数也是翻译也并发用户数,那这两个怎么区别了)
concurrency |
case编号 |
1.9 |
1 |
3.27 |
2 |
5.73 |
3 |
7.98 |
4 |
8.92 |
5 |
备注:我理解为类似于集合点那种同时提交的概念,不知对错。
测试环境设置
Siege在GNU/Linuxkernel 2.6.x上运行可能会僵死,原因可能与NPTL有关。解决方式可以设置LD_ASSUME_KERNEL=2.4.1,运行方式如下
$ LD_ASSUME_KERNEL=2.4.1 siege -c20 -r 100 -f urls.txt
Siege支持Netscapecookie,但不支持RFC2965 cookies.
在同一台机器上实现多IP测试(来自RobertHartman)
-
添加IP别名。例子:
!/bin/sh
fori in `seq 1 254` do
ifconfigeth0:$i 192.168.1.$i;
done
-
ReverseNAT with iptables.例如
iptables-t nat -A POSTROUTING -o eth0 -j SNAT --to 192.168.1.1-192.168.1.254
NOTES:This method can be used for Class B address spaces as well withproper masking on the eth0 interface. Robert tested this to work with2500+ IPs on a single ethernet card. You can contact Robert viaemail: "robert at roberthartman dot net"
系统优化设置
sysctl-w net.ipv4.tcp_tw_reuse=1表示开启重用,允许将TIME-WAITSockets重新用于新的TCP连接,默认为0,表示关闭。
sysctl-w net.ipv4.tcp_tw_recycle=1表示开启TCP连接中TIME-WAITSockets的快速回收,默认为0,表示关闭。
sysctl-w net.ipv4.tcp_fin_timeout=30参数tcp_fin_timeout是套接字关闭时,保持FIN-WAIT-2状态的时间。
ulimit-n查看单个进程可以openfiles的数量。修改方式:
1.按照最大打开文件数量的需求设置系统,并且通过检查/proc/sys/fs/file-max文件来确认最大打开文件数已经被正确设置。
#cat /proc/sys/fs/file-max
如果设置值太小,修改文件/etc/sysctl.conf的变量到合适的值。这样会在每次重启之后生效。如果设置值够大,跳过下步。
#echo 20000 > /proc/sys/fs/file-max
编辑文件/etc/sysctl.conf,插入下行。fs.file-max= 20000
2.在/etc/security/limits.conf文件中设置最大打开文件数,下面是一行提示:
#
添加如下这行。* - nofile 20000
这行设置了每个用户的默认打开文件数为20000。注意"nofile"项有两个可能的限制措施。就是
备注
有时我们会遇到-c1000以上出现timeout(排除server端原因),这可能是siege引起的,单个进程所启动的线程数限制。可以使用shell调用方式,多进程运行。
#!/bin/sh
if[ "$1" == "-h" ] || [ "$1" == "--help"] ;then
echo"benchmarktest.sh [process num=3] [url] [request num=300][time=30s]";
exit1;
fi
iftest $1 ; then
num=$1;
else
num=3;
fi
iftest $2 ; then
url=$2;
else
url="http://www.baidu.com";
fi
iftest $3 ; then
re=$3;
else
re=300;
fi
iftest $4 ; then
time=$4;
else
time="30s";
fi
for((i=1; i<=$num; i=i+1))
do
#echo$num;
`nohup/home/space/yingfm/siege/bin/siege -c $re -t $time $url >/dev/null &`;
echo$i;
done