Web服务器压力测试
1. 概念和指标
在《构建高性能WEB站点》一书中,准确和形象地用排队的场景解释了衡量web服务器性能的指标。简单来说,我们可以从2个角度看一个服务器的性能:
1)从用户角度:用户A访问服务器S时,用户A并不关心是否有其他人同时在访问服务器S,他只关心从他发出请求到收到请求的时间。这个时间主要由两部分构成:数据在网络上的传输时间和网卡吐出数据时间(带宽)、服务器处理请求的时间(从数据到达服务器到数据从服务器吐出)。第一部分时间和服务器没啥关系,第二部分可以用来衡量服务器的性能。对于单个用户而言,他对一个请求的总时间是有要求的,0.1秒会让他觉得很快,1秒会觉得一般,3秒会觉得慢。
2)从服务器角度:服务器S在某一时刻收到N个用户请求,是一个一个处理呢?还是一批一批处理呢?这个是由服务器自己决定的。如果是一个一个出来,那排在队头的用户就可以在较短的时间内处理完,排在队尾就要等久一些。如果是N个人同时处理,那么大家的等待时间就差不多。如果我们不关心用户处理时间的方差,那就可以用平均处理时间来衡量,服务器1秒钟之内服务了n个用户请求,那么平均每个用户就等待了1/n秒。但从用户角度,我们不能忽略方差,用户有其等待时间的上限。
在上面的描述中,单个用户处理时间称为响应时间
,服务器同一时刻处理的最大用户数称为并发数
,服务器一秒钟处理的用户请求数称为QPS(TPS,TPS有时候指每秒事务数)
。这三者的关系是:TPS = 并发数 / 响应时间
。可见,当TPS固定时,并发数增高,响应时间也会增高。因此,并发数并不是越高越好,实际上,并发数是指在用户可接受的响应时间情况下,能达到的最大值,此时一般TPS也达到了最大值。所以,TPS和并发数随便取一个都可以衡量服务器的性能。
三者之间的关系可见下图:
横坐标是并发用户数。绿线是CPU使用率;紫线是吞吐量,即QPS;蓝线是时延。
2. 测试工具
2.1 简单的ab
ab
是apache服务器附带的一个工具。。测试命令:ab [options] [http://]hostname[:port]/path
,常用命令:
ab -c 10 -n 100 http://www.google.com/ #其中-c是并发数,-n是总请求数
输出数据解释:
Server Software: gws #web服务器名称
Server Hostname: www.google.com
Server Port: 80
Document Path: /
Document Length: 11175 bytes # 页面大小
Concurrency Level: 10 # 并发数
Time taken for tests: 0.558 seconds #总共测试市场
Complete requests: 100 #总共请求数
Failed requests: 92 #失败的请求数
(Connect: 0, Receive: 0, Length: 92, Exceptions: 0)
Write errors: 0
Total transferred: 1194594 bytes # 网络传输数据总大小
HTML transferred: 1118094 bytes
Requests per second: 179.18 [#/sec] (mean) # TPS
Time per request: 55.809 [ms] (mean) # 请求平均响应时间
Time per request: 5.581 [ms] (mean, across all concurrent requests)
Transfer rate: 2090.32 [Kbytes/sec] received # 网速
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 3 2.4 3 13
Processing: 41 52 14.3 49 132
Waiting: 40 47 14.3 44 128
Total: 42 54 14.6 52 132 # 请求平均响应时间
Percentage of the requests served within a certain time (ms)
50% 52
66% 54
75% 57
80% 58
90% 64
95% 66
98% 125
99% 132
100% 132 (longest request)
在linux下进行大并发数测试时:ulimit -n 80000
ab加个-k
的选项可以使得并发数高很多,使用keepalive特性,但它会导致测试结果不准确,因为模拟大量用户访问时,所有人都是用自己的tcp连接来请求,而不是共用一个tcp连接。很不错的测试经历 话说还来,长连接可以认为是忽略了网络负载之后,服务器本身比较真实的性能。
post数据方式
参考:https://gist.github.com/kelvinn/6a1c51b8976acf25bd78
2.2 JMeter
JMeter是Java编写的非常强大的测试工具,目测可以代替Load runner了。和tomcat一样,是跨平台绿色软件,从这里下载解压运行bin/jmeter
就可以了。下面仅编写最简单的使用,还有好多高级功能没有尝试。
最简单的http压测(和ab一样)
啓动JMeter之后,在测试计划上点击右键,增加Threads-线程组,然后点击线程组,修改线程数为10,循环次数为10,然后在线程组上面点击右键,增加Sampler-HTTP请求,然后点击HTTP请求,将整个请求URL(例如http://www.google.com/ )填入到路径属性中。然后,再右键点击测试计划,增加监听器–聚合报告和监听器–察看结果树。
最后,点击工具栏的啓动按钮。在察看结果树
中可以看到每一次http请求的详细信息,聚合报告
可以查看到总的概括。
其它
JMeter+BadBoy就可以实现RunLoader模拟用户操作的功能。不错的视频教程。
在命令行下执行jmeter:先通过gui界面配置好测试计划,并保存为*.jmx文件。然后在linux环境下执行:
./jmeter.sh -n -t *.jmx -l ~/test.jtl # 其中-n指定不用gui,-t指定jmx的位置,-l指定输出文件的位置
执行完成之后,在gui界面新建一个任何一种Listener(监听器),在监听器配置界面中,预览文件选中jtl文件就可以打开看结果。经测试,有没有gui测试结果数据差不多!
2.3 其它测试工具
http_load、webbench(最多可以模拟3万个并发连接去测试网站的负载能力,个人感觉要比Apache自带的ab压力测试工具好。–张宴)、Siege
3. 常见问题
TIME_WAIT导致Cannot assign requested address
解决办法:
修改/etc/sysctl.conf
net.ipv4.tcp_timestamps=1 #开启对于TCP时间戳的支持,若该项设置为0,则下面一项设置不起作用
net.ipv4.tcp_tw_recycle=1 #表示开启TCP连接中TIME-WAIT sockets的快速回收
生效:执行sysctl -p