首页 > Web > 吞吐率——我们需要了解什么
2011六月9

吞吐率——我们需要了解什么

我们一般使用单位时间内服务器处理的请求数来描述WEB服务器的并发处理能力——吞吐率(Throughput),单位是 reqs/s

我们一般使用压力测试,来统计WEB服务器的吞吐率。其包括如下条件:

  1. 同一时间,到底有多少人奇迹般的一起向服务器发送请求——并发用户数
  2. 上面那些用户,一共向你的服务器发送了多少请求?——总请求数
  3. 这些人,疯了般的管你要啥东西呢?——请求资源描述

让机器更好的干活,让老板更省钱

我们怎么才能让机器更好的干活?我们需要多少机器才能更好的满足我们的要求?

  1. 一台机器,完成所有的请求——省钱了,我们是穷人,我们只有一台机器。用户会在漫长的等待后,冷笑着走开。然后老板也会告诉你“滚蛋”
  2. 一百台机器,完成所有的请求——用户很开心,老板很疯狂。“奶奶个熊滴,听人说十台机器就够了,你用了一百台,另九十台你想架魔兽私服啊?”。于是,你也走人了。

综上,我们需要知道何时才能让最合适数量的资源,来完成我们的需求。

这里面,我们需要掌握两个情况,我们的机器最多能同时满足多少用户;以及我们一共有多少用户!

时间就是生命

时间就是生命,当我们渐渐老去时,我们应该把握住生命中的第一分钟,或者冲动,或者寻找冲动。

有些跑题了,我想说的是“时间就是生命”!

在压力测试的过程中,我们需要关心的时间指标有两种:

  1. 用户平均请求等待时间——主要用于衡量服务器在一定并发用户数的情况下,对于单个用户的服务质量。
  2. 服务器平均请求处理时间——用于衡量服务器的整体服务质量

ab 压力测试

关于压力测试,之前使用过siege——《第一次使用siege 第一次压力测试》

今天再简单介绍一下ab:ab是Apache自带的压力测试工具。我们先来看一下版本:

simaopig@simaopig-desktop:/usr/local/apache2/bin$ ./ab -V
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

其简单使用过程如下:

simaopig@simaopig-desktop:/usr/local/apache2/bin$ ./ab -n1000 -c10 http://localhost/test.html
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking localhost (be patient)
Completed 100 requests
Completed 200 requests
Completed 300 requests
Completed 400 requests
Completed 500 requests
Completed 600 requests
Completed 700 requests
Completed 800 requests
Completed 900 requests
Completed 1000 requests
Finished 1000 requests


Server Software:        Apache/2.2.15
Server Hostname:        localhost
Server Port:            80

Document Path:          /test.html
Document Length:        77 bytes

Concurrency Level:      10
Time taken for tests:   0.079 seconds
Complete requests:      1000
Failed requests:        0
Write errors:           0
Total transferred:      337000 bytes
HTML transferred:       77000 bytes
Requests per second:    12675.07 [#/sec] (mean)
Time per request:       0.789 [ms] (mean)
Time per request:       0.079 [ms] (mean, across all concurrent requests)
Transfer rate:          4171.39 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.1      0       2
Processing:     0    1   0.3      1       3
Waiting:        0    1   0.3      1       3
Total:          0    1   0.3      1       3

Percentage of the requests served within a certain time (ms)
  50%      1
  66%      1
  75%      1
  80%      1
  90%      1
  95%      1
  98%      2
  99%      2
 100%      3 (longest request)

ab的使用和返回的结果解释如下:

使用选项 意义
-n1000 表示总请求数为1000
-c10 表示并发用户数为10,即同时有10个用户发起请求
http://localhost/test.html 表示请求的目标URL
-t10 请求的超时响应时间,单位为秒


返回字段 字段意义
Server Software 测试的服务器的Web 服务器软件名,这里是Apache/2.2.15
Server Hostname 请求的URLK 主机部分名称, 这里值为localhost
Server Port 被测试的Web 服务器的端口号
Document Path 请求的URL中的根绝对路径
Document Length 表示HTTP响应数据的正文长度
Concurrency Level 表示并发用户数,这是我们压力测试时,传递过去的值 -c
Time taken for tests 表示所有这些请求被处理完成所花费的总时间
Complete requests 表示总请求数,我们压力测试时传递过去的参数 -n
Failed requests 表示失败的请求数,这里的失败是指请求在连接服务器/发送数据/接收数据等环节发生异常,以及无响应后点击鼠标中时的情况。超时时间可以使用-t设置
Total transferred 表示所有请求的响应数据长度总和,包含每个HTTP响应数据的头信息和正文数据的长度
HTML transferred 表示所有请求的响应数据中正文数据的总和,也就是减去Total transferred中HTTP响应数据中头信息的长度
Requests per second 这就是我们说滴吞吐率啊,等于 Complete requests / Time taken for tests 每秒钟,处理多少请求
Time per request 这便是我们说的,用户平均请求等待时间,等于 Time taken for tests / (Complete requests / Concurrency Level)
Time per request(across all concurrent requests) 这便是前面说的服务器平均请求处理时间,等于 Time taken for tests / Complete requests
正是吞详细地址的倒数,为:Time per request / Concurrency Level 每个请求花费了多少秒
Transfer rate 表示这些请求在单位时间内,从服务器获取的数据长度,等于:Total transferred / Time taken for tests
Percentage of the requests served within a certain time (ms) 这部分数据用于描述每个请求处理时间的分页情况,比如在以上测试结果中,99%都不超过1毫秒,100%都不超过3毫秒。这个时间为处理时间,是指前面的Time per request,即对于单个用户而言,平均每个请求处理的时间

文章作者:simaopig
本文地址:http://www.xiaoxiaozi.com/2011/06/09/2206/
版权所有 © 转载时必须以链接形式注明作者和原始出处!

9 Responses to “吞吐率——我们需要了解什么”

  1. #1 老饕 回复 | 引用 Post:2011-06-26 11:04

    看到了操作系统里的两个名词:等待时间 和响应时间~

    [回复]

  2. #2 老饕 回复 | 引用 Post:2011-07-03 17:59

    囧,偶的链接失踪了~

    [回复]

    Zeric 回复:

    我的也没了,不过我是整个站都没啦,而且很长段时间都没给小小子说,被K啦。哈哈。
    现在特地厚着脸皮再来申请链接,不知小小子给通过不。
    不过貌似小小子最近很忙啊,各种未更新。

    [回复]

    simaopig 回复:

    我在等你的新地址。:)

    [回复]

    Zeric 回复:

    到这来回复不就留了地址嘛。 :mrgreen:
    话说你侧边栏的链接是随机的啊,会影响权重吧。 :evil:
    再话说,友情链接内页消失了呢?

    P.S.:回复没邮件提醒的?你回复的这条我就没收到邮件。

    simaopig 回复:

    呃,不好意思,真不记得是啥时候咋就没了。。已经加上!

    [回复]

  3. #3 kyo 回复 | 引用 Post:2011-08-16 16:00

    -t 选项不是 “请求的超时响应时间” 吧.

    -t timelimit
    Maximum number of seconds to spend for benchmarking. This implies a -n 50000 internally. Use this to benchmark the server within a fixed
    total amount of time. Per default there is no timelimit.

    [回复]

  4. #4 ha 回复 | 引用 Post:2011-10-26 15:02

    有个问题。你测试的test.html这个文件有讲究吗(文件大小)
    如果测试php的并发性能怎么弄。
    之前我做测试时其实心里很没有底,主要原因是php脚本里很多时候会连接其他设备,像数据库啊,缓存服务器啊等
    就算是单纯的PHP,也有复杂脚本和简单脚本区别。
    最后,我选择了使用
    〈?php
    phpinfo();
    这样的脚本生成测试结果,我个人感觉这个不科学,不过没有想到更好办法。

    [回复]

  5. #5 simaopig 回复 | 引用 Post:2011-11-25 18:36

    @ha
    这个只是个例子。具体测试的时候空测phpinfo()意义不大,原因是只会算出你的框架的QPS。

    你需要知道的是你程序的各个接口可以达到一个什么情况,一般会模拟一些数据插入到数据库中,关闭MEM,然后走GET方法来测读。

    写呢就直接测写,看会达到多少 QPS。我现在也在学习中,感觉QA的兄弟们测起来更科学!

    [回复]

发表评论

:wink: :twisted: :roll: :oops: :mrgreen: :lol: :idea: :evil: :cry: :arrow: :?: :-| :-x :-o :-P :-D :-? :) :( :!: 8-O 8)