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;蓝线是时延。

更多参考:博客1 博客2

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

文档更新时间: 2018-12-18 10:43   作者:nick