Linux 使用Siege进行WEB压力测试

原创 tiangr  2016-10-01 20:09  阅读 135 次

Siege(英文意思是围攻)是一个压力测试和评测工具,最早使用的压力测试工具是 apache 的 ab(apache benchmark) , apache ab 做重复压力测试不错,但是每次只能测试一个链接,如何测试一组链接(比如从日志中导出的1个小时的日志,做真实压力测试),后来找到了这个: Siege 是一个压力测试和评测工具,设计用于WEB开发这评估应用在压力下的承受能力:可以根据配置对一个WEB站点进行多用户的并发访问,记录每个用户所有请求过程的相应时间,并在一定数量的并发访问下重复进行。

说明

ab的主要弱点在于它不能让你模拟一个更加真实的请求分布——例如你想通过设置一个请求的列表来在这些列表之间来回测试,而siege就可以。

安装

siege需要自己从 joedog.org 上自己下载,然后编译:

wget ftp://sid.joedog.org/pub/siege/siege-latest.tar.gz

./configure --prefix=/usr/local/siege  --mandir=/usr/local/man
make
# 转到超级用户
make install

注意在configure的时候,一定要设置mandir参数,否则当你通过 man siege查看siege帮助的时候会看不到他的manual. 安装完成后,运行bin中的siege_config命令来创建.siege文件之后,你可以通过 ./siege -C 命令来查看当前配置 最简单的使用命令:

./siege http://localhost/
#用来测试本地主页

安装包

Debian/Ubuntu

apt-get install siege

CentOS

yum install siege

参数介绍

-V
–version
打印版本信息

-h
–help
查看帮助

-C
-config
打印当前配置。此选项读取你的".siegerc"文件然后打印配置。你可以通过"$HOME/.siegerc"文件来修改这些设置。如果还没有".siegerc"配置文件,你可以执行命令"siege.config"来创建。

-A, —user-agent=”text” 设置请求的User-Agent

-v
-verbose
输出。如果使用此选项运行"siege","siege"将会打印出事务信息。这包括了HTTP协议类型,返回的状态码以及请求页面:
"HTTP/1.1 200 OK: /cgi-bin/whoohoo.cgi?first=Homer&last=simpson"
此项经常用于程序在执行大量URLs时来实时显示进度图形或者internet模式

-C,或–config 在屏幕上打印显示出当前的配置,配置是包括在他的配置文件HOME/.siegerc

-g URL
–get URL
发送一个GET请求。从server上拉取头部信息和显示HTTP事务,对于web调试非常有用。

-c NUM
–concurrent=NUM
设置并发的用户(连接)数量. 默认的连接数量可以到"~/.siegerc"中查看,指令为"concurrent = x"。比如"-c10",设置并发10个连接

-i
–internet
此选项需要连接一个包含很多URLs的配置文件,Siege会在文件中随机选取URL,模拟访问。Much like you can’t tell the users of your website which pages they can view, you have no control over which pages siege will hit in internet mode. With this option set, there is no guarantee that every page in the file will be hit.

-r NUM
(repetitions),重复数量,即每个连接发出的请求数量,设置这个的话,就不需要设置-t了。对应.siegerc配置文件中的reps = x指令

-t NUM
(time),持续时间,即测试持续时间,在NUM时间后结束,单位默认为分,比如-t10,那么测试时间为10分钟,-t10s,则测试时间为10秒钟。对应.siegerc中的指令为time = x指令

-b
(benchmark),基准测试,如果设置这个参数的话,那么delay时间为0。man siege中有一句话这样说:
it's not recommanded that you use this option while load testing.
说明基准测试和load testing 是完全不同的,至于有什么不同,可以阅读BenchMarkingVSLoadTestingVSPerformance.

-f url.txt
(file),,默认为urls.txt,位于siege 安装目录下的etc/urls.txt。对应.siegerc配置文件中的file = x指令
其他比较关注的测试方法,比如我想使用Keep-Alive方式进行测试,可以在.siegerc配置文件中进行修改,将connect = close改为 connect = keep-alive
另外您还可以通过-H HEADER参数来设置请求header。

– l
–log
This option instructs siege to log the statistics to SIEGE_HOME/var/siege.log. Each new statistics set is appended to the log.

– m MESSAGE
–mark=MESSAGE

This option allows you to mark the log file with a separator, to differentiate your log file entries with header information. It is not necessary to use both the -m option and the -l option. -m assumes -l so it marks and logs the transaction. If the MESSAGE has spaces in it, make sure that you put it in quotes.

-d NUM
–delay=NUM
Each siege simulated user is delayed for a random number of seconds between one and NUM. If you are benchmarking performance, it is recommended that you use a 1 second delay ( -d1 ). The default value is three (3 ). This delay allows for the transactions to stagger rather then to allow them to pound the server in waves.

SIEGE is an http regressive testing and benchmarking utility. It was designed to let web developers measure the performance of their code under duress, to see how it will stand up to load on the internet. It lets the user hit a webserver with a configurable number of concurrent simulated users. Those users place the webserver "under siege." The duration of the siege is measured in transactions, the sum of simulated users and the number of times each simulated user repeats the process of hitting the server. Thus 20 concurrent users 50 times is 1000 transactions, the length of the test.

siegerc设定档说明:

verbose :要不要显示过程。
display-id :显示过程的时候,要不要显示模拟user的id
show-logfile :跑完之后要不要显示log资讯
logging :要不要log到档案
logfile :要log到档案的话,档名是什么
protocol :HTTP通讯协定( HTTP/1.1或HTTP/1.0 两者择一)
connection :keep-alive表示模拟成persistent connection(写close则反之)
concurrent :模拟有几个user来冲
time :跑多久之后停止( H=hours, M=minutes, S=seconds)
reps :每一个concurrent冲几次。
file :多个目的url情形下的url档案位置。
url :单一url情形下的指定url
delay :非benchmakr行况下,每个模拟user随机延迟0到这个数字(单位:秒)。
timeout :socket connection timeout(单位:秒)。
failures :socket失败次数(timeouts, connection failures)到达这个数字就停下来。
internet :随机从urls.txt抓出url,否则从urls.txt循序。
benchmark :跑benchmark模式的话,siege将不会在每个connection间delay,适合拿来做load testing.
user-agent :送出的agent识别
login :WWW-Authenticate login( login = jdfulmer:topsecret:Admin )(非form based)
username,password :也是login用的(非form based)
Login URL :每一个模拟user都必需经过的第一个login url( form based)
proxy-host,proxy-port,proxy-login :使用proxy的话要填这个。(proxy-login: jeff:secret:corporate)
follow-location :redirection support
zero-data-ok :接不接受zero-length data
chunked :HTTP/1.1需要chunked encoding

使用样例:

1. 任务列表:www.chedong.com.url文件

http://www.chedong.com/tech/
http://www.chedong.com/tech/acdsee.html
http://www.chedong.com/tech/ant.html
http://www.chedong.com/tech/apache_install.html
http://www.chedong.com/tech/awstats.html
http://www.chedong.com/tech/cache.html
http://www.chedong.com/tech/click.html
http://www.chedong.com/tech/cms.html
http://www.chedong.com/tech/compress.html
http://www.chedong.com/tech/cvs_card.html
http://www.chedong.com/tech/default.html
http://www.chedong.com/tech/dev.html
http://www.chedong.com/tech/gnu.html
....
siege -c 20 -r 2 -f www.chedong.com.url

参数说明:

  • -c 20 并发20个用户
  • -r 2 重复循环2次
  • -f www.chedong.com.url 任务列表:URL列表

Siege >= 2.06版本, 支持 POST 和 GET 请求. GET 请求如上所示, 但是POST请求需要POST关键词.

http://homer.whoohoo.com/cgi-bin/hello.pl POST name=homer
http://homer.whoohoo.com/haha.jsp POST word=doh!&scope=ALL

当没有使用URL参数[ -u URL | –url=URL ]调用Siege时,siege将在文件中查找URLs。将其读进内存并允许这些URLs。正常情况,Siege从文件开头按顺序执行URL。如果你指定了internet[ -i | –internet ]模式,它将采取随机执行的方式。使用 [ -f FILE | –file=FILE ]参数来替代包含URLs的指定文件。

2. 变量

Siege >= 2.57版本, siege 支持在文件.siegercurls.txt中申明和使用变量。Siege变量的使用语法和UNIX SHELL类似。你可以使用$() 或 ${}:

PROT=https://
$(PROT)eos.joedog.org/siege/index.php
$(PROT)eos.joedog.org/wacky/index.php
$(PROT)eos.joedog.org/scout/index.php
$(PROT)eos.joedog.org/libping/index.php
$(PROT)eos.joedog.org/gunner/index.php

Now, in order to switch between https and http, you need only edit one line in the entire file.

3. 输出样例

** Siege 2.59
** Preparing 20 concurrent users for battle. 这次“战斗”准备了20个并发用户
The server is now under siege.. done. 服务在“围攻”测试中:
Transactions: 40 hits 完成40次处理
Availability: 100.00 % 成功率
Elapsed time: 7.67 secs 总共用时
Data transferred: 877340 bytes 共数据传输:877340字节
Response time: 1.65 secs 相应用时1.65秒:显示网络连接的速度
Transaction rate: 5.22 trans/sec 平均每秒完成5.22次处理:表示服务器后台处理的速度
Throughput: 114385.92 bytes/sec 平均每秒传送数据:114385.92字节
Concurrency: 8.59 最高并发数 8.59
Successful transactions: 40 成功处理次数
Failed transactions: 0 失败处理次数
注意:由于速度很快,可能会达不到并发速度很高就已经完成。Response time显示的是测试机器和被测试服务器之间网络链接状况。Transaction rate则表示服务器端任务处理的完成速度。

为了方便增量压力测试,siege还包含了一些辅助工具: bombardment (1) 是一个辅助工具:用于按照增量用户压力测试: 使用样例:bombardment urlfile.txt 5 3 4 1 初始化URL列表:urlfile.txt 初始化为:5个用户 每次增加:3个用户 运行:4次 每个客户端之间的延迟为:1秒

4.完整实例

siege -c 300 -r 100 -f url.txt

说明:-c是并发量,-r是重复次数。url.txt就是一个文本文件,里面是要测试的url,url.txt每行都是一个url。

urls.txt文件是很多行待测试URL的列表以换行符断开,格式为:

[protocol://]host.domain.com[:port][path/to/file]

url.txt内容:

http://192.168.80.166/01.jpg
http://192.168.80.166/02.jpg
http://192.168.80.166/03.jpg
http://192.168.80.166/04.jpg
http://192.168.80.166/05.jpg
http://192.168.80.166/06.jpg

结果说明:

** SIEGE 2.72
** Preparing 10 concurrent users for battle.
The server is now under siege..      done.

Transactions:                 300 hits  #已完成的事务总署
Availability:              100.00 %   #完成的成功率
Elapsed time:                0.08 secs   #总共使用的时间
Data transferred:            0.94 MB   #响应中数据的总大小
Response time:                0.00 secs   #显示网络连接的速度
Transaction rate:         3750.00 trans/sec  #平均每秒完成的事务数
Throughput:               11.79 MB/sec  #平均每秒传送的数据量
Concurrency:                8.50  #实际最高并发链接数
Successful transactions:         300  #成功处理的次数
Failed transactions:               0    #失败处理的次数
Longest transaction:            0.01   #最长事务处理的时间
Shortest transaction:            0.00   #最短事务处理时间

常用的siege命令举例

  • 200个并发对www.google.com发送请求100次

siege -c 200 -r 100 http://www.google.com

  • 在urls.txt中列出所有的网址

siege -c 200 -r 100 -f urls.txt

  • 随机选取urls.txt中列出所有的网址

siege -c 200 -r 100 -f urls.txt -i

  • delay=0,更准确的压力测试,而不是功能测试

siege -c 200 -r 100 -f urls.txt -i -b

  • 指定http请求头 文档类型

siege -H "Content-Type:application/json" -c 200 -r 100 -f urls.txt -i -b

5. 输出成CSV格式:

siege2csv.pl (1)
siege2csv.pl将bombardment的输出变成CSV格式:
Time Data Transferred Response Time Transaction Rate Throughput Concurrency Code 200 (note that this is horribly broken.)
242 60.22 603064 0.02 4.02 10014.35 0.08
605 59.98 1507660 0.01 10.09 25136.05 0.12
938 59.98 2337496 0.02 15.64 38971.26 0.26
1157 60 2883244 0.04 19.28 48054.07 0.78

参考: 开源测试工具:http://www.opensourcetesting.org/performance.php

6.总结

  • 发送post请求时,url格式为:http://www.xxxx.com/ POST p1=v1&p2=v2
  • 如果url中含有空格和中文,要先进行url编码,否则siege发送的请求url不准确
  • siege自身感觉也是有瓶颈的,并发数最大也就1000,再提高就会报下面这样的错误

[error] socket: unable to connect sock.c:222: Operation already in progress socket: connection timed out

这样最终导致测试结果怎么都没法超过2W每秒的请求,所以就把siege -c 1000 -r 100 -i -b -f url.txt 放到shell中并发执行

#!/bin/bash
user_agent="Siege 1.0"
siege_rc="siege.rc"
concurrent=150
repet=200
siege_single_urls="singleurl.txt"
siege_prefix_urls="prefixurl.txt"

for i in {1..10}
do
siege -c $concurrent -r $repet -i -b -f $siege_single_urls -R $siege_rc -A "$user_agent" &;
done

参考文档

http://t.cn/Rt8w7Se

http://www.ha97.com/4663.html

http://longmu.blog.51cto.com/431337/943008

特别提示:本站资源全部免费下载,因服务器需经费维护,文中部分外链点击后会进入广告,请耐心等待5秒即可跳过广告进入目标页面。如遇页面外链打不开或下载地址失效,您可以在评论中指出错误,或扫描页面底部二维码。
本文地址:http://www.tiangr.com/linux-shi-yong-siege-jin-xing-web-ya-li-ce-shi.html
版权声明:本文为原创文章,版权归 tiangr 所有,欢迎分享本文,转载请保留出处!

发表评论


表情