本文参考自https://www.joedog.org/siege-manual
一、关于siege
siege, 基于HTTP协议的压力测试基础工具,web开发人员可以通过siege测试出他们的代码在因特网上所能承受的最大压力。Siege支持基本的认证、cookies、http、https以及ftp协议。用户可以自定义压力测试的力度。压测的总历时是所有模拟客户端重复请求服务器的次数总和,比如20个并发模拟客户端请求50次,则总共请求服务器1000次。性能报表统计压力测试的总历时、传输的数据量、服务器的响应时间、事务处理率、吞吐量、并发量、成功的请求数;这些统计结果会在压力测试结束的时候给出。Siege有3种模式:回归、互联网模拟、暴力。它可以从配置文件里读取大量的URL并采用增量的形式(回归模式)或者随机的形式(互联网模拟模式)发出请求;或者用户可以简单粗暴地在命令行上敲上单个URL(暴力模式)。
二、平台
Siege支持类Unix系统、新版BSD系统,不支持Windows系统。
笔者在本文中使用平台:
# uname -a
Linux localhost.localdomain 2.6.32-358.el6.x86_64 #1 SMP Tue Jan 29 11:47:41 EST 2013 x86_64 x86_64 x86_64 GNU/Linux
三、siege的安装
下载 wget http://download.joedog.org/siege/siege-latest.tar.gz
(笔者整理这篇文章的时候最新版本是siege-4.0.2.tar.gz,本文使用该版本)
解压 tar -zxvf siege-latest.tar.gz
cd siege-4.0.2
./configure --prefix=/home/soft/siege --mandir=/home/soft/siege/man --with-ssl=/usr/local/ssl
参数里的相关路径可以自定义
mkdir -p /home/soft/siege/etc
mkidr -p /home/soft/siege/var
make && make install
四、siege 的使用
启动命令形如 siege <options> 或者 siege <options> [url]
命令支持以下参数:
1. -V 或者 -version
打印版本信息
2. -h 或者 -help
打印帮助信息
3. -C 或者 -config
打印当前配置信息,它读取./siegerc 文件并且打印该文件的信息。你可以通过编辑/home/soft/siege/etc/siegerc 文件来自定义配置。如果你没有这个文件,你可以执行siege.config命令自行生成一个。
4. -v 或者 -verbose
输出详细信息。选择该参数后,siege会把事物信息打印到屏幕,包括HTTP协议类型、响应码、请求的页面,类似:HTTP/1.1 200 OK: /cgi-bin/whoohoo.cgi?first=Homer&last=simpson
在回归模式或互联网模式下请求大量的URL时,这个选项对于图形化压力测试的进度非常有用。
5. -g URL 或者 -get URL
发送HTTP GET请求。从服务器上获取请求头并且展示这个HTTP事物。对于web应用的调试很有用。
6. -c NUM 或者 -concurrent=NUM
模拟的并发客户端数量。用户使用这个参数自定义模拟访问服务器的客户端的数量NUM.这个数量只受限于计算机的可用资源,但是实际上几百个模拟客户端相当于很多倍同等数量的真实用户会话。你配置的这个数量代表了你的服务器要处理的事物数量,并不代表当前的并发会话数。另外值得注意的是,真实的用户是会花些时间去阅读他们请求的页面的。
7. -i 或者 -internet
这个参数是配合配置文件使用的,配置文件里填写了很多URL。配置了这个参数后,每个模拟客户端每次都会随机在这些URL里选择一个URL请求服务器。如同你无法告诉你的网站用户哪些网页他们可以访问,在互联网模拟模式下,你无法控制siege将请求哪个页面。配置了这个参数后,就无法保证配置文件里的每一个URL都会被请求了。
8. -t NUMm 或者 -time=NUMm
时间,允许你指定压力测试的运行时间。格式为 “NUMm”, NUM代表数量,m代表时间单位,可以是S(秒)、M(分钟)、H(小时). 比如 5S 代表5秒,10M 代表10分钟,2H 代表2小时。如果要运行压力测试一小时,-t 3600S 、-t 60M、 -t 1H 都是可以的。S、M、H不区分大小写。 官网说不能有空格,必须是-t3600S,但是经过我实际测试,有空格的-t 3600S 也是可以的。
9. -f FILE 或者 -file=FILE
默认配置文件是SIEGE_HOME/etc/urls.txt,里面包含了你所有的URL。你可以使用这个参数指定你自己的配置文件。
10. -l 或者 -log
该参数指定siege把统计结果记录到SIGE_HOME/var/siege.log中。每一个新的统计结果集都会被追加到日志文件后面。
11. -m MESSAGE或者 -mark=MESSAGE
该配置允许你用分隔符标记日志文件,你的日志文件在头信息上将会有所区别。没有必要同时使用-m和-l参数,因为-m参数是假定-l参数了的,所以它标记并且记录事物。如果MESSAGE里含有空格,请使用引号。
12. -d NUM 或者 -delay=NUM
Siege模拟的每个客户端将会随机延迟1到NUM秒。如果你是做基准性能测试,推荐你使用延迟1秒(-d1). 默认值3秒。这个参数使得所有的请求错开,而不是像浪一样冲击服务器。
13. 配置文件
从2.00版本开始,siege支持配置文件,你可以在这个配置文件里记录你的所有命令参数。如此,启动siege将会变得更加容易,并且还可以确保在一系列的启动中每一次启动都是使用的确切的一样的配置。那么它在哪里呢?配置文件名是.siegerc,他在SIEGE_HOME/etc/siegerc,如果你没有这个文件,可以使用siege.config命令生成该文件,该命令会在HOME目录生成一个模板文件。你再用文本编辑器编辑它即可。
14. URL格式
Siege能识别的URL格式:[protocol://][servername.domain.xxx][:portnumber][/directory/file]
目前,siege只支持http和https协议,默认http. Siege允许你偷懒,你可以只写servername. 于是假如你跟名为shemp的服务器在同一个域下,并且shemp配置在了你的hots文件里或者在DNS里,那么,siege -u shemp 将会请求 http://shemp.yourdomain.net/index.shtml(假设该服务器有index页面)。如果你想测试https服务器,就需要指定协议了。siege -u https://shemp 将会请求https://shemp.yourdomain.net/index.shtml
15. URL文件
为了运行回归模式的测试或者模拟有效的互联网模式,你将不得不运行所有的URL。为了完成这个,可以把所有的URL填写到配置文件里。默认的文件是SIEGE_HOME/etc/urls.txt.该文件里,每个URL占一行。
# comments behind hashes
http://homer.whoohoo.com/index.shtml
http://homer.whoohoo.com/howto.jsp
http://homer.whoohoo.com/cgi-bin/hello.pl?first=bart&last=simpson
# and on and on....
Siege-2.06以后,支持POST和GET两种请求方式。上述示例演示了GET请求的URL书写方式。但是POST方式需要指定POST关键字:
http://homer.whoohoo.com/cgi-bin/hello.pl POST name=homer
http://homer.whoohoo.com/haha.jsp POST word=doh!&scope=ALL
当使用siege并且未指定URL参数[-u URL | -url=URL]时,siege在文件里寻找URL。将它们读进内存然后请求这些URL。通常siege从文件起始位置开始顺序执行。如果你指定了参数 -i,那么它将会随机选择URL. 使用 -f FILE 参数可以指定自定义的配置文件。
16. 变量
从2.57版本开始,在.siegerc 和urls.txt 文件里,siege支持变量的声明和赋值。Siege使用变量的语法类似UNIX 的shell脚本。变量的定义形如 varname=value, 占一行。 使用$(varname)或者${varname}获取变量的值。
17. 日志文件
指定-l参数后,siege会把事物日志记录到SIEGE_HOME/var/siege.log。日志文件能让你处理历史记录。为了按照URL、server、协议等进行分组,-m “message” 需要被指定。这将把”message”标记到日志文件上。
18. 性能统计
性能统计包括压力测试的历时、传输的数据量、服务器的响应时间、事物处理率、吞吐量、并发量、请求成功的数量。这些量化的指标将在每一次运行结束后给出。
Ben: $ siege -u shemp.whoohoo.com/Admin.jsp -d1 -r10 -c25
..Siege 2.65 2006/05/11 23:42:16
..Preparing 25 concurrent users for battle.
The server is now under siege...done
Transactions: 250 hits
Elapsed time: 14.67 secs
Data transferred: 448000 bytes
Response time: 0.43 secs
Transaction rate: 17.04 trans/sec
Throughput: 30538.51 bytes/sec
Concurrency: 7.38
Status code 200: 250
Successful transactions: 250
Failed transactions: 0
Transactions是请求服务器的数量。25个模拟客户端,每个请求服务器10次,总共请求250次。
Elapsed time 是整个压力测试的历时时间。这个是从运行开始到结束的时间。示例中,整个压力测试使用了14.67秒。
Data transferred 所有模拟客户端传输的数据量,包含请求头和请求体。因为包含请求头,所以这个数量会比服务器给出的数量要偏大。在互联网模式下,每次压力测试的这个数量将会不同。
Response time 服务器的平均响应时间。
Transaction rate 服务器平均每秒能处理的事物数量,即Transactions/Elapsed time
Throughput 服务器平均每秒传输给所有客户端的比特数。
Concurrency 同时连接的平均数,该参数随着服务器性能的降低而升高。
Successful transaction 服务器响应码小于400的次数。重定向被认为是成功的请求。