架构高性能网站秘笈(一)——了解衡量网站性能的指标

服务器如何发送数据?

  1. 服务器程序将需要发送的数据写入该程序的内存空间中;
  2. 服务器程序通过操作系统的接口向内核发出系统调用;
  3. 系统内核将用户态内存空间中的数据复制到内核缓冲区中去,然后通知网卡过来取;此后CPU转而做其他处理;
  4. 网卡到CPU指定的内核缓冲区中将数据复制到网卡缓冲区中;
  5. 网卡将字节转换成二进制位,再以电信号的形式输出至网络。

注意:数据在计算机内部的复制是按照总线的宽度来复制的。比如在32位的操作系统中,数据每次都复制32位。 
总线就像是一条32/64车道的马路,数据在计算机中是以0/1的形式存储,每次复制每条车道只能走一个0/1,因此每次只能同时复制32个0/1. 

数据在网线中的速度

网络传输介质有光缆和铜缆,在光缆中电信号的传输速度为2.3x10^8m/s,在铜缆中传输速度为2.0x10^8m/s。 
光的传播速度为3.0x10^8m/s,但由于光缆采用反射机制传播,并不是直射,因此电信号实际走的路程要比直线长很多,因此在光缆中的传播速度只有2.0x10^8m/s。 

什么是带宽?

带宽的定义

带宽的定义:数据的发送速率。

带宽的单位

100Mbps = 100M bit per second 
平时所说的100M带宽指的是100M比特每秒, 
100Mbps = 12.5MBps

注意:我们平时所说的“100M”指的是100MB,而带宽的单位是Mb,而1MB = 8Mb。因此,运营商所说的“百兆宽带”其实是“12.5兆宽带”,呵呵。 

什么影响了数据发送速度(带宽)?

  1. 数据的发送速度由接收方的接收速度决定。在数据链路层中,为了确保数据在接收过程中不发生丢失,因此接收方要告诉发送方目前发送速度是否合理。若接收方来不及收,就会告诉发送方,让它慢点发。因此,数据的发送速度(即带宽)由接收方的接收速度决定。
  2. 与传播介质的并行度有关。传输介质可以看成是多车道马路,数据由0/1组成,每股车道每次只能容纳一个0/1。因此,如果马路的车道增多,那么每次发送的0/1也就增多,从而提高了发送速度(即带宽). 

运营商为什么要限制带宽?

我们的服务器会通过一个交换机连入互联网,互联网由无数个路由器和主机构成,路由器负责数据包的存储转发,将数据包根据目的地址途径一个个路由器,最终投递到目的主机中。

由于一个交换机往往有多个服务器接入,服务器们都会将需要发送的数据首先发给交换机,再由交换机发给路由器,这些数据先存储在路由器的缓存中,然后路由器根据先后顺序逐个转发。所以,如果服务器发送数据的速度过快,路由器缓存满了,那接下来的数据就会丢失,因此需要限制服务器向路由器发送数据的速度,即限制服务器的带宽。而这个限制由接入服务器的交换机完成。通过上文可知,交换机只要控制接收速度,就能限制服务器的发送速度。 

什么是共享带宽?什么是独享带宽?

1.独享带宽 
如果一个路由器的出口带宽为100Mbps,并且同一个广播域内有10台主机,交换机只要将每台主机的最大出口带宽限制为10Mbps,那么不管在任何情况下每台主机的最大出口带宽为10Mbps。这就是独享带宽。独享带宽不会受到同一个广播域内其他主机的影响,任何时候最大出口带宽均为10Mbps。

2.共享带宽 
假设一个路由器的出口带宽仍为100Mbps,但运营商为了挣更多钱,使同一个广播域内有多于10个主机接入,那么每台主机的平均最大带宽就小于10Mbps,此时即使交换机仍然将每台主机的最大出口带宽限制为10Mbps,但当主机都有较大的网络通信时,就无法保证每台主机都有10Mbps的最大带宽,此时就会相互竞争带宽。

综上所述,独享10M带宽能保证服务器的最大出口带宽在任何情况下都为10Mbps,不会受到同一广播域内的其他主机影响;而共享10M带宽只能保证在同一广播域内的其他主机通信空闲时,才能达到最大10Mbps的出口带宽。 

什么是响应时间?

响应时间是指从数据包的第一个0/1离开服务器开始,到最后一个0/1被客户端接收为止的这段时间。

响应时间 = 发送时间+传输时间+处理时间

  • 发送时间:从发送数据包的第一个0/1开始,到发完最后一个0/1为止的这段时间。 
    发送时间=数据包比特数/带宽
  • 传输时间:数据在通信线路中的传输时间。 
    传输时间=传输距离/传输速度 
    (传输速度近似为2x10^8m/s)
  • 处理时间:数据在各个路由器中存储转发的时间。 
    处理时间比较难以计算。

响应时间=(数据包比特数/带宽)+(传输距离/传输速度)+处理时间

下载速度=数据的字节数/响应时间 

什么是吞吐率?

吞吐率:服务器单位时间内处理请求的个数。 
单位:reqs/s

吞吐率用来衡量服务器处理请求的能力。

当请求非常少的时候吞吐率并不高,因为此时服务器的性能还没有体现出来。那么随着请求的不断增多,吞吐率会随之上升,但当并发请求数上升到某一个临界点时,吞吐率不升反降。那个临界点就是服务器吞吐率的最大值,也叫最大吞吐率。

若我们的网站有促销活动前,可以通过上述方法来估计服务器的最大吞吐率,从而能判断服务器能否顶住促销带来的压力。 

什么是并发数?什么是并发用户数?

要搞清楚并发数和并发用户数的区别,首先需要了解HTTP协议。

HTTP协议是一种应用层协议,它本身是无连接的,也就是客户端与服务器每完成一次数据交互就需要断开连接,下次通信时重新建立连接。但是HTTP1.1中有一个keep-alive字段,它使得通信双方在完成一次通信后仍然保持一定时长的连接。若该时间内客户端又想与服务器通信,那么无需再创建新的连接,只需重用刚才的连接即可,这样能提高通信的效率,减少额外的开销。

  • 并发数:客户端向服务器请求的次数。不论是否延用已创建的连接,只要客户端向服务器提出请求,就算一个并发数。
  • 并发用户数:创建TCP连接的个数。如果一个浏览器延用了已创建的连接向服务器发送了10次请求,那么只算一个并发用户数。

注意:现在的浏览器支持多线程,可以同时与服务器建立多个TCP连接,因此一个用户可能会导致多个并发用户数。所以“并发用户数”和“用户数”不能完全画等号,这点需要注意! 

平均请求等待时间 和 服务器平均请求处理时间

平均请求等待时间:用户从点击一个按钮,到新的页面加载完毕所需的时间。

服务器平均请求处理时间:服务器从等待队列中取出一个请求开始,到处理完该请求所需的时间。

综上所述:平均请求处理时间是站在用户角度,是用来衡量用户体验的好坏的指标。 
而服务器平均请求处理时间是衡量服务器性能好坏的指标,其实就是吞吐率的倒数。

注意:平均请求等待时间 和 服务器平均请求处理时间不成正比关系! 
平均请求等待时间=请求传输时间+请求等待时间+请求处理时间 
服务器平均请求处理时间=请求处理时间 
由此可知,在请求数很少的情况下,浏览器发来的请求无需等待,直接被服务器处理,那么请求等待时间和服务器请求处理时间成正比关系;但在请求异常多的时候,请求到来速度远远大于服务器处理请求的速度,那么很多请求将会在等待队列中挤压,此时即使服务器处理请求的能力很强(即服务器平均请求处理时间很短),但用户的等待时间依然很长,此时用户等待时间与服务器请求处理时间不成正比。 

使用Apache Bench进行压力测试

我们使用Apache服务器的Apache Bench(简称ab)对网站进行压力测试。ab简单易用,关键可以直接在服务器本地发起测试,这样我们可以获取不包括传输时间的服务器处理时间。通过服务器处理时间就可以知道服务器的性能。

1. 压力测试命令

<code class="language-shell hljs avrasm has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">ab -n100 -c10 http://www<span class="hljs-preprocessor" style="margin: 0px; padding: 0px; color: rgb(68, 68, 68); box-sizing: border-box;">.acmcoder</span><span class="hljs-preprocessor" style="margin: 0px; padding: 0px; color: rgb(68, 68, 68); box-sizing: border-box;">.com</span>/index<span class="hljs-preprocessor" style="margin: 0px; padding: 0px; color: rgb(68, 68, 68); box-sizing: border-box;">.php</span></code><ul class="pre-numbering" style="margin: 0px; padding: 6px 0px 40px; box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="margin: 0px; padding: 0px 5px; box-sizing: border-box;">1</li></ul>

2. 测试结果解析

<code class="language-shell hljs livecodeserver has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">Server Software:        openresty <span class="hljs-comment" style="margin: 0px; padding: 0px; color: rgb(136, 0, 0); box-sizing: border-box;">#服务器软件</span>
Server Hostname:        www.acmcoder.com <span class="hljs-comment" style="margin: 0px; padding: 0px; color: rgb(136, 0, 0); box-sizing: border-box;">#测试的网址</span>
Server Port:            <span class="hljs-number" style="margin: 0px; padding: 0px; color: rgb(0, 102, 102); box-sizing: border-box;">80</span> <span class="hljs-comment" style="margin: 0px; padding: 0px; color: rgb(136, 0, 0); box-sizing: border-box;">#访问的端口号</span>

Document Path:          /index.php <span class="hljs-comment" style="margin: 0px; padding: 0px; color: rgb(136, 0, 0); box-sizing: border-box;">#测试的网页</span>
Document Length:        <span class="hljs-number" style="margin: 0px; padding: 0px; color: rgb(0, 102, 102); box-sizing: border-box;">162</span> <span class="hljs-keyword" style="margin: 0px; padding: 0px; color: rgb(0, 0, 136); box-sizing: border-box;">bytes</span> <span class="hljs-comment" style="margin: 0px; padding: 0px; color: rgb(136, 0, 0); box-sizing: border-box;">#HTTP响应信息的正文长度</span>

Concurrency Level:      <span class="hljs-number" style="margin: 0px; padding: 0px; color: rgb(0, 102, 102); box-sizing: border-box;">10</span> <span class="hljs-comment" style="margin: 0px; padding: 0px; color: rgb(136, 0, 0); box-sizing: border-box;">#并发用户数</span>
Time taken <span class="hljs-keyword" style="margin: 0px; padding: 0px; color: rgb(0, 0, 136); box-sizing: border-box;">for</span> tests:   <span class="hljs-number" style="margin: 0px; padding: 0px; color: rgb(0, 102, 102); box-sizing: border-box;">1.497209</span> <span class="hljs-built_in" style="margin: 0px; padding: 0px; color: rgb(102, 0, 102); box-sizing: border-box;">seconds</span> <span class="hljs-comment" style="margin: 0px; padding: 0px; color: rgb(136, 0, 0); box-sizing: border-box;">#测试所花费的时间</span>
Complete requests:      <span class="hljs-number" style="margin: 0px; padding: 0px; color: rgb(0, 102, 102); box-sizing: border-box;">100</span> <span class="hljs-comment" style="margin: 0px; padding: 0px; color: rgb(136, 0, 0); box-sizing: border-box;">#总请求数</span>
Failed requests:        <span class="hljs-number" style="margin: 0px; padding: 0px; color: rgb(0, 102, 102); box-sizing: border-box;">0</span> <span class="hljs-comment" style="margin: 0px; padding: 0px; color: rgb(136, 0, 0); box-sizing: border-box;">#失败的请求数(响应码非2xx的请求由Non-2xx responses记录)</span>
Write errors:           <span class="hljs-number" style="margin: 0px; padding: 0px; color: rgb(0, 102, 102); box-sizing: border-box;">0</span> 
Non-<span class="hljs-number" style="margin: 0px; padding: 0px; color: rgb(0, 102, 102); box-sizing: border-box;">2</span>xx responses:      <span class="hljs-number" style="margin: 0px; padding: 0px; color: rgb(0, 102, 102); box-sizing: border-box;">100</span> <span class="hljs-comment" style="margin: 0px; padding: 0px; color: rgb(136, 0, 0); box-sizing: border-box;">#HTTP响应头中状态码非2xx的响应个数</span>
Total transferred:      <span class="hljs-number" style="margin: 0px; padding: 0px; color: rgb(0, 102, 102); box-sizing: border-box;">32400</span> <span class="hljs-keyword" style="margin: 0px; padding: 0px; color: rgb(0, 0, 136); box-sizing: border-box;">bytes</span> <span class="hljs-comment" style="margin: 0px; padding: 0px; color: rgb(136, 0, 0); box-sizing: border-box;">#总的响应数据长度,包括HTTP响应的头和正文数据,但不包括请求数据。</span>
HTML transferred:       <span class="hljs-number" style="margin: 0px; padding: 0px; color: rgb(0, 102, 102); box-sizing: border-box;">16200</span> <span class="hljs-keyword" style="margin: 0px; padding: 0px; color: rgb(0, 0, 136); box-sizing: border-box;">bytes</span> <span class="hljs-comment" style="margin: 0px; padding: 0px; color: rgb(136, 0, 0); box-sizing: border-box;">#HTTP响应中正文数据的长度。</span>
Requests per <span class="hljs-keyword" style="margin: 0px; padding: 0px; color: rgb(0, 0, 136); box-sizing: border-box;">second</span>:    <span class="hljs-number" style="margin: 0px; padding: 0px; color: rgb(0, 102, 102); box-sizing: border-box;">66.79</span> [<span class="hljs-comment" style="margin: 0px; padding: 0px; color: rgb(136, 0, 0); box-sizing: border-box;">#/sec] (mean) #吞吐率</span>
Time per request:       <span class="hljs-number" style="margin: 0px; padding: 0px; color: rgb(0, 102, 102); box-sizing: border-box;">149.721</span> [ms] (mean) <span class="hljs-comment" style="margin: 0px; padding: 0px; color: rgb(136, 0, 0); box-sizing: border-box;">#用户平均请求等待时间</span>
Time per request:       <span class="hljs-number" style="margin: 0px; padding: 0px; color: rgb(0, 102, 102); box-sizing: border-box;">14.972</span> [ms] (mean, across all concurrent requests) <span class="hljs-comment" style="margin: 0px; padding: 0px; color: rgb(136, 0, 0); box-sizing: border-box;">#服务器平均请求处理时间</span>
Transfer rate:          <span class="hljs-number" style="margin: 0px; padding: 0px; color: rgb(0, 102, 102); box-sizing: border-box;">20.71</span> [Kbytes/<span class="hljs-built_in" style="margin: 0px; padding: 0px; color: rgb(102, 0, 102); box-sizing: border-box;">sec</span>] received <span class="hljs-comment" style="margin: 0px; padding: 0px; color: rgb(136, 0, 0); box-sizing: border-box;">#服务器的数据传输速度(在极限情况下该数据即为服务器出口带宽)</span>

Connection Times (ms)
              <span class="hljs-built_in" style="margin: 0px; padding: 0px; color: rgb(102, 0, 102); box-sizing: border-box;">min</span>  mean[+/-sd] <span class="hljs-built_in" style="margin: 0px; padding: 0px; color: rgb(102, 0, 102); box-sizing: border-box;">median</span>   <span class="hljs-built_in" style="margin: 0px; padding: 0px; color: rgb(102, 0, 102); box-sizing: border-box;">max</span>
Connect:       <span class="hljs-number" style="margin: 0px; padding: 0px; color: rgb(0, 102, 102); box-sizing: border-box;">40</span>   <span class="hljs-number" style="margin: 0px; padding: 0px; color: rgb(0, 102, 102); box-sizing: border-box;">46</span>   <span class="hljs-number" style="margin: 0px; padding: 0px; color: rgb(0, 102, 102); box-sizing: border-box;">4.8</span>     <span class="hljs-number" style="margin: 0px; padding: 0px; color: rgb(0, 102, 102); box-sizing: border-box;">46</span>      <span class="hljs-number" style="margin: 0px; padding: 0px; color: rgb(0, 102, 102); box-sizing: border-box;">58</span>
Processing:    <span class="hljs-number" style="margin: 0px; padding: 0px; color: rgb(0, 102, 102); box-sizing: border-box;">41</span>   <span class="hljs-number" style="margin: 0px; padding: 0px; color: rgb(0, 102, 102); box-sizing: border-box;">46</span>   <span class="hljs-number" style="margin: 0px; padding: 0px; color: rgb(0, 102, 102); box-sizing: border-box;">5.0</span>     <span class="hljs-number" style="margin: 0px; padding: 0px; color: rgb(0, 102, 102); box-sizing: border-box;">46</span>      <span class="hljs-number" style="margin: 0px; padding: 0px; color: rgb(0, 102, 102); box-sizing: border-box;">58</span>
Waiting:       <span class="hljs-number" style="margin: 0px; padding: 0px; color: rgb(0, 102, 102); box-sizing: border-box;">40</span>   <span class="hljs-number" style="margin: 0px; padding: 0px; color: rgb(0, 102, 102); box-sizing: border-box;">46</span>   <span class="hljs-number" style="margin: 0px; padding: 0px; color: rgb(0, 102, 102); box-sizing: border-box;">4.9</span>     <span class="hljs-number" style="margin: 0px; padding: 0px; color: rgb(0, 102, 102); box-sizing: border-box;">45</span>      <span class="hljs-number" style="margin: 0px; padding: 0px; color: rgb(0, 102, 102); box-sizing: border-box;">58</span>
Total:         <span class="hljs-number" style="margin: 0px; padding: 0px; color: rgb(0, 102, 102); box-sizing: border-box;">81</span>   <span class="hljs-number" style="margin: 0px; padding: 0px; color: rgb(0, 102, 102); box-sizing: border-box;">92</span>   <span class="hljs-number" style="margin: 0px; padding: 0px; color: rgb(0, 102, 102); box-sizing: border-box;">9.7</span>     <span class="hljs-number" style="margin: 0px; padding: 0px; color: rgb(0, 102, 102); box-sizing: border-box;">92</span>     <span class="hljs-number" style="margin: 0px; padding: 0px; color: rgb(0, 102, 102); box-sizing: border-box;">116</span>

Percentage <span class="hljs-operator" style="margin: 0px; padding: 0px; box-sizing: border-box;">of</span> <span class="hljs-operator" style="margin: 0px; padding: 0px; box-sizing: border-box;">the</span> requests served <span class="hljs-operator" style="margin: 0px; padding: 0px; box-sizing: border-box;">within</span> <span class="hljs-operator" style="margin: 0px; padding: 0px; box-sizing: border-box;">a</span> certain <span class="hljs-built_in" style="margin: 0px; padding: 0px; color: rgb(102, 0, 102); box-sizing: border-box;">time</span> (ms)
  <span class="hljs-number" style="margin: 0px; padding: 0px; color: rgb(0, 102, 102); box-sizing: border-box;">50</span>%     <span class="hljs-number" style="margin: 0px; padding: 0px; color: rgb(0, 102, 102); box-sizing: border-box;">92</span> <span class="hljs-comment" style="margin: 0px; padding: 0px; color: rgb(136, 0, 0); box-sizing: border-box;">#50%的请求在92毫秒内完成</span>
  <span class="hljs-number" style="margin: 0px; padding: 0px; color: rgb(0, 102, 102); box-sizing: border-box;">66</span>%     <span class="hljs-number" style="margin: 0px; padding: 0px; color: rgb(0, 102, 102); box-sizing: border-box;">98</span>
  <span class="hljs-number" style="margin: 0px; padding: 0px; color: rgb(0, 102, 102); box-sizing: border-box;">75</span>%     <span class="hljs-number" style="margin: 0px; padding: 0px; color: rgb(0, 102, 102); box-sizing: border-box;">99</span>
  <span class="hljs-number" style="margin: 0px; padding: 0px; color: rgb(0, 102, 102); box-sizing: border-box;">80</span>%    <span class="hljs-number" style="margin: 0px; padding: 0px; color: rgb(0, 102, 102); box-sizing: border-box;">101</span>
  <span class="hljs-number" style="margin: 0px; padding: 0px; color: rgb(0, 102, 102); box-sizing: border-box;">90</span>%    <span class="hljs-number" style="margin: 0px; padding: 0px; color: rgb(0, 102, 102); box-sizing: border-box;">107</span>
  <span class="hljs-number" style="margin: 0px; padding: 0px; color: rgb(0, 102, 102); box-sizing: border-box;">95</span>%    <span class="hljs-number" style="margin: 0px; padding: 0px; color: rgb(0, 102, 102); box-sizing: border-box;">114</span>
  <span class="hljs-number" style="margin: 0px; padding: 0px; color: rgb(0, 102, 102); box-sizing: border-box;">98</span>%    <span class="hljs-number" style="margin: 0px; padding: 0px; color: rgb(0, 102, 102); box-sizing: border-box;">115</span>
  <span class="hljs-number" style="margin: 0px; padding: 0px; color: rgb(0, 102, 102); box-sizing: border-box;">99</span>%    <span class="hljs-number" style="margin: 0px; padding: 0px; color: rgb(0, 102, 102); box-sizing: border-box;">116</span>
 <span class="hljs-number" style="margin: 0px; padding: 0px; color: rgb(0, 102, 102); box-sizing: border-box;">100</span>%    <span class="hljs-number" style="margin: 0px; padding: 0px; color: rgb(0, 102, 102); box-sizing: border-box;">116</span> (longest request)</code><ul class="pre-numbering" style="margin: 0px; padding: 6px 0px 40px; box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="margin: 0px; padding: 0px 5px; box-sizing: border-box;">1</li><li style="margin: 0px; padding: 0px 5px; box-sizing: border-box;">2</li><li style="margin: 0px; padding: 0px 5px; box-sizing: border-box;">3</li><li style="margin: 0px; padding: 0px 5px; box-sizing: border-box;">4</li><li style="margin: 0px; padding: 0px 5px; box-sizing: border-box;">5</li><li style="margin: 0px; padding: 0px 5px; box-sizing: border-box;">6</li><li style="margin: 0px; padding: 0px 5px; box-sizing: border-box;">7</li><li style="margin: 0px; padding: 0px 5px; box-sizing: border-box;">8</li><li style="margin: 0px; padding: 0px 5px; box-sizing: border-box;">9</li><li style="margin: 0px; padding: 0px 5px; box-sizing: border-box;">10</li><li style="margin: 0px; padding: 0px 5px; box-sizing: border-box;">11</li><li style="margin: 0px; padding: 0px 5px; box-sizing: border-box;">12</li><li style="margin: 0px; padding: 0px 5px; box-sizing: border-box;">13</li><li style="margin: 0px; padding: 0px 5px; box-sizing: border-box;">14</li><li style="margin: 0px; padding: 0px 5px; box-sizing: border-box;">15</li><li style="margin: 0px; padding: 0px 5px; box-sizing: border-box;">16</li><li style="margin: 0px; padding: 0px 5px; box-sizing: border-box;">17</li><li style="margin: 0px; padding: 0px 5px; box-sizing: border-box;">18</li><li style="margin: 0px; padding: 0px 5px; box-sizing: border-box;">19</li><li style="margin: 0px; padding: 0px 5px; box-sizing: border-box;">20</li><li style="margin: 0px; padding: 0px 5px; box-sizing: border-box;">21</li><li style="margin: 0px; padding: 0px 5px; box-sizing: border-box;">22</li><li style="margin: 0px; padding: 0px 5px; box-sizing: border-box;">23</li><li style="margin: 0px; padding: 0px 5px; box-sizing: border-box;">24</li><li style="margin: 0px; padding: 0px 5px; box-sizing: border-box;">25</li><li style="margin: 0px; padding: 0px 5px; box-sizing: border-box;">26</li><li style="margin: 0px; padding: 0px 5px; box-sizing: border-box;">27</li><li style="margin: 0px; padding: 0px 5px; box-sizing: border-box;">28</li><li style="margin: 0px; padding: 0px 5px; box-sizing: border-box;">29</li><li style="margin: 0px; padding: 0px 5px; box-sizing: border-box;">30</li><li style="margin: 0px; padding: 0px 5px; box-sizing: border-box;">31</li><li style="margin: 0px; padding: 0px 5px; box-sizing: border-box;">32</li><li style="margin: 0px; padding: 0px 5px; box-sizing: border-box;">33</li><li style="margin: 0px; padding: 0px 5px; box-sizing: border-box;">34</li><li style="margin: 0px; padding: 0px 5px; box-sizing: border-box;">35</li><li style="margin: 0px; padding: 0px 5px; box-sizing: border-box;">36</li><li style="margin: 0px; padding: 0px 5px; box-sizing: border-box;">37</li></ul>


如何选择网站的被测URL?

一个网站的URL可能有很多,每个URL对应的处理也不尽相同,某一个URL的测试结果并不具有代表性。因此,我们需要选择一系列有代表性的URL,将测试结果的加权平均数作为网站的综合性能。

发布了11 篇原创文章 · 获赞 3 · 访问量 1万+

服务器如何发送数据?

  1. 服务器程序将需要发送的数据写入该程序的内存空间中;
  2. 服务器程序通过操作系统的接口向内核发出系统调用;
  3. 系统内核将用户态内存空间中的数据复制到内核缓冲区中去,然后通知网卡过来取;此后CPU转而做其他处理;
  4. 网卡到CPU指定的内核缓冲区中将数据复制到网卡缓冲区中;
  5. 网卡将字节转换成二进制位,再以电信号的形式输出至网络。

注意:数据在计算机内部的复制是按照总线的宽度来复制的。比如在32位的操作系统中,数据每次都复制32位。 
总线就像是一条32/64车道的马路,数据在计算机中是以0/1的形式存储,每次复制每条车道只能走一个0/1,因此每次只能同时复制32个0/1. 

数据在网线中的速度

网络传输介质有光缆和铜缆,在光缆中电信号的传输速度为2.3x10^8m/s,在铜缆中传输速度为2.0x10^8m/s。 
光的传播速度为3.0x10^8m/s,但由于光缆采用反射机制传播,并不是直射,因此电信号实际走的路程要比直线长很多,因此在光缆中的传播速度只有2.0x10^8m/s。 

什么是带宽?

带宽的定义

带宽的定义:数据的发送速率。

带宽的单位

100Mbps = 100M bit per second 
平时所说的100M带宽指的是100M比特每秒, 
100Mbps = 12.5MBps

注意:我们平时所说的“100M”指的是100MB,而带宽的单位是Mb,而1MB = 8Mb。因此,运营商所说的“百兆宽带”其实是“12.5兆宽带”,呵呵。 

什么影响了数据发送速度(带宽)?

  1. 数据的发送速度由接收方的接收速度决定。在数据链路层中,为了确保数据在接收过程中不发生丢失,因此接收方要告诉发送方目前发送速度是否合理。若接收方来不及收,就会告诉发送方,让它慢点发。因此,数据的发送速度(即带宽)由接收方的接收速度决定。
  2. 与传播介质的并行度有关。传输介质可以看成是多车道马路,数据由0/1组成,每股车道每次只能容纳一个0/1。因此,如果马路的车道增多,那么每次发送的0/1也就增多,从而提高了发送速度(即带宽). 

运营商为什么要限制带宽?

我们的服务器会通过一个交换机连入互联网,互联网由无数个路由器和主机构成,路由器负责数据包的存储转发,将数据包根据目的地址途径一个个路由器,最终投递到目的主机中。

由于一个交换机往往有多个服务器接入,服务器们都会将需要发送的数据首先发给交换机,再由交换机发给路由器,这些数据先存储在路由器的缓存中,然后路由器根据先后顺序逐个转发。所以,如果服务器发送数据的速度过快,路由器缓存满了,那接下来的数据就会丢失,因此需要限制服务器向路由器发送数据的速度,即限制服务器的带宽。而这个限制由接入服务器的交换机完成。通过上文可知,交换机只要控制接收速度,就能限制服务器的发送速度。 

什么是共享带宽?什么是独享带宽?

1.独享带宽 
如果一个路由器的出口带宽为100Mbps,并且同一个广播域内有10台主机,交换机只要将每台主机的最大出口带宽限制为10Mbps,那么不管在任何情况下每台主机的最大出口带宽为10Mbps。这就是独享带宽。独享带宽不会受到同一个广播域内其他主机的影响,任何时候最大出口带宽均为10Mbps。

2.共享带宽 
假设一个路由器的出口带宽仍为100Mbps,但运营商为了挣更多钱,使同一个广播域内有多于10个主机接入,那么每台主机的平均最大带宽就小于10Mbps,此时即使交换机仍然将每台主机的最大出口带宽限制为10Mbps,但当主机都有较大的网络通信时,就无法保证每台主机都有10Mbps的最大带宽,此时就会相互竞争带宽。

综上所述,独享10M带宽能保证服务器的最大出口带宽在任何情况下都为10Mbps,不会受到同一广播域内的其他主机影响;而共享10M带宽只能保证在同一广播域内的其他主机通信空闲时,才能达到最大10Mbps的出口带宽。 

什么是响应时间?

响应时间是指从数据包的第一个0/1离开服务器开始,到最后一个0/1被客户端接收为止的这段时间。

响应时间 = 发送时间+传输时间+处理时间

  • 发送时间:从发送数据包的第一个0/1开始,到发完最后一个0/1为止的这段时间。 
    发送时间=数据包比特数/带宽
  • 传输时间:数据在通信线路中的传输时间。 
    传输时间=传输距离/传输速度 
    (传输速度近似为2x10^8m/s)
  • 处理时间:数据在各个路由器中存储转发的时间。 
    处理时间比较难以计算。

响应时间=(数据包比特数/带宽)+(传输距离/传输速度)+处理时间

下载速度=数据的字节数/响应时间 

什么是吞吐率?

吞吐率:服务器单位时间内处理请求的个数。 
单位:reqs/s

吞吐率用来衡量服务器处理请求的能力。

当请求非常少的时候吞吐率并不高,因为此时服务器的性能还没有体现出来。那么随着请求的不断增多,吞吐率会随之上升,但当并发请求数上升到某一个临界点时,吞吐率不升反降。那个临界点就是服务器吞吐率的最大值,也叫最大吞吐率。

若我们的网站有促销活动前,可以通过上述方法来估计服务器的最大吞吐率,从而能判断服务器能否顶住促销带来的压力。 

什么是并发数?什么是并发用户数?

要搞清楚并发数和并发用户数的区别,首先需要了解HTTP协议。

HTTP协议是一种应用层协议,它本身是无连接的,也就是客户端与服务器每完成一次数据交互就需要断开连接,下次通信时重新建立连接。但是HTTP1.1中有一个keep-alive字段,它使得通信双方在完成一次通信后仍然保持一定时长的连接。若该时间内客户端又想与服务器通信,那么无需再创建新的连接,只需重用刚才的连接即可,这样能提高通信的效率,减少额外的开销。

  • 并发数:客户端向服务器请求的次数。不论是否延用已创建的连接,只要客户端向服务器提出请求,就算一个并发数。
  • 并发用户数:创建TCP连接的个数。如果一个浏览器延用了已创建的连接向服务器发送了10次请求,那么只算一个并发用户数。

注意:现在的浏览器支持多线程,可以同时与服务器建立多个TCP连接,因此一个用户可能会导致多个并发用户数。所以“并发用户数”和“用户数”不能完全画等号,这点需要注意! 

平均请求等待时间 和 服务器平均请求处理时间

平均请求等待时间:用户从点击一个按钮,到新的页面加载完毕所需的时间。

服务器平均请求处理时间:服务器从等待队列中取出一个请求开始,到处理完该请求所需的时间。

综上所述:平均请求处理时间是站在用户角度,是用来衡量用户体验的好坏的指标。 
而服务器平均请求处理时间是衡量服务器性能好坏的指标,其实就是吞吐率的倒数。

注意:平均请求等待时间 和 服务器平均请求处理时间不成正比关系! 
平均请求等待时间=请求传输时间+请求等待时间+请求处理时间 
服务器平均请求处理时间=请求处理时间 
由此可知,在请求数很少的情况下,浏览器发来的请求无需等待,直接被服务器处理,那么请求等待时间和服务器请求处理时间成正比关系;但在请求异常多的时候,请求到来速度远远大于服务器处理请求的速度,那么很多请求将会在等待队列中挤压,此时即使服务器处理请求的能力很强(即服务器平均请求处理时间很短),但用户的等待时间依然很长,此时用户等待时间与服务器请求处理时间不成正比。 

使用Apache Bench进行压力测试

我们使用Apache服务器的Apache Bench(简称ab)对网站进行压力测试。ab简单易用,关键可以直接在服务器本地发起测试,这样我们可以获取不包括传输时间的服务器处理时间。通过服务器处理时间就可以知道服务器的性能。

1. 压力测试命令

<code class="language-shell hljs avrasm has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">ab -n100 -c10 http://www<span class="hljs-preprocessor" style="margin: 0px; padding: 0px; color: rgb(68, 68, 68); box-sizing: border-box;">.acmcoder</span><span class="hljs-preprocessor" style="margin: 0px; padding: 0px; color: rgb(68, 68, 68); box-sizing: border-box;">.com</span>/index<span class="hljs-preprocessor" style="margin: 0px; padding: 0px; color: rgb(68, 68, 68); box-sizing: border-box;">.php</span></code><ul class="pre-numbering" style="margin: 0px; padding: 6px 0px 40px; box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="margin: 0px; padding: 0px 5px; box-sizing: border-box;">1</li></ul>

2. 测试结果解析

<code class="language-shell hljs livecodeserver has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">Server Software:        openresty <span class="hljs-comment" style="margin: 0px; padding: 0px; color: rgb(136, 0, 0); box-sizing: border-box;">#服务器软件</span>
Server Hostname:        www.acmcoder.com <span class="hljs-comment" style="margin: 0px; padding: 0px; color: rgb(136, 0, 0); box-sizing: border-box;">#测试的网址</span>
Server Port:            <span class="hljs-number" style="margin: 0px; padding: 0px; color: rgb(0, 102, 102); box-sizing: border-box;">80</span> <span class="hljs-comment" style="margin: 0px; padding: 0px; color: rgb(136, 0, 0); box-sizing: border-box;">#访问的端口号</span>

Document Path:          /index.php <span class="hljs-comment" style="margin: 0px; padding: 0px; color: rgb(136, 0, 0); box-sizing: border-box;">#测试的网页</span>
Document Length:        <span class="hljs-number" style="margin: 0px; padding: 0px; color: rgb(0, 102, 102); box-sizing: border-box;">162</span> <span class="hljs-keyword" style="margin: 0px; padding: 0px; color: rgb(0, 0, 136); box-sizing: border-box;">bytes</span> <span class="hljs-comment" style="margin: 0px; padding: 0px; color: rgb(136, 0, 0); box-sizing: border-box;">#HTTP响应信息的正文长度</span>

Concurrency Level:      <span class="hljs-number" style="margin: 0px; padding: 0px; color: rgb(0, 102, 102); box-sizing: border-box;">10</span> <span class="hljs-comment" style="margin: 0px; padding: 0px; color: rgb(136, 0, 0); box-sizing: border-box;">#并发用户数</span>
Time taken <span class="hljs-keyword" style="margin: 0px; padding: 0px; color: rgb(0, 0, 136); box-sizing: border-box;">for</span> tests:   <span class="hljs-number" style="margin: 0px; padding: 0px; color: rgb(0, 102, 102); box-sizing: border-box;">1.497209</span> <span class="hljs-built_in" style="margin: 0px; padding: 0px; color: rgb(102, 0, 102); box-sizing: border-box;">seconds</span> <span class="hljs-comment" style="margin: 0px; padding: 0px; color: rgb(136, 0, 0); box-sizing: border-box;">#测试所花费的时间</span>
Complete requests:      <span class="hljs-number" style="margin: 0px; padding: 0px; color: rgb(0, 102, 102); box-sizing: border-box;">100</span> <span class="hljs-comment" style="margin: 0px; padding: 0px; color: rgb(136, 0, 0); box-sizing: border-box;">#总请求数</span>
Failed requests:        <span class="hljs-number" style="margin: 0px; padding: 0px; color: rgb(0, 102, 102); box-sizing: border-box;">0</span> <span class="hljs-comment" style="margin: 0px; padding: 0px; color: rgb(136, 0, 0); box-sizing: border-box;">#失败的请求数(响应码非2xx的请求由Non-2xx responses记录)</span>
Write errors:           <span class="hljs-number" style="margin: 0px; padding: 0px; color: rgb(0, 102, 102); box-sizing: border-box;">0</span> 
Non-<span class="hljs-number" style="margin: 0px; padding: 0px; color: rgb(0, 102, 102); box-sizing: border-box;">2</span>xx responses:      <span class="hljs-number" style="margin: 0px; padding: 0px; color: rgb(0, 102, 102); box-sizing: border-box;">100</span> <span class="hljs-comment" style="margin: 0px; padding: 0px; color: rgb(136, 0, 0); box-sizing: border-box;">#HTTP响应头中状态码非2xx的响应个数</span>
Total transferred:      <span class="hljs-number" style="margin: 0px; padding: 0px; color: rgb(0, 102, 102); box-sizing: border-box;">32400</span> <span class="hljs-keyword" style="margin: 0px; padding: 0px; color: rgb(0, 0, 136); box-sizing: border-box;">bytes</span> <span class="hljs-comment" style="margin: 0px; padding: 0px; color: rgb(136, 0, 0); box-sizing: border-box;">#总的响应数据长度,包括HTTP响应的头和正文数据,但不包括请求数据。</span>
HTML transferred:       <span class="hljs-number" style="margin: 0px; padding: 0px; color: rgb(0, 102, 102); box-sizing: border-box;">16200</span> <span class="hljs-keyword" style="margin: 0px; padding: 0px; color: rgb(0, 0, 136); box-sizing: border-box;">bytes</span> <span class="hljs-comment" style="margin: 0px; padding: 0px; color: rgb(136, 0, 0); box-sizing: border-box;">#HTTP响应中正文数据的长度。</span>
Requests per <span class="hljs-keyword" style="margin: 0px; padding: 0px; color: rgb(0, 0, 136); box-sizing: border-box;">second</span>:    <span class="hljs-number" style="margin: 0px; padding: 0px; color: rgb(0, 102, 102); box-sizing: border-box;">66.79</span> [<span class="hljs-comment" style="margin: 0px; padding: 0px; color: rgb(136, 0, 0); box-sizing: border-box;">#/sec] (mean) #吞吐率</span>
Time per request:       <span class="hljs-number" style="margin: 0px; padding: 0px; color: rgb(0, 102, 102); box-sizing: border-box;">149.721</span> [ms] (mean) <span class="hljs-comment" style="margin: 0px; padding: 0px; color: rgb(136, 0, 0); box-sizing: border-box;">#用户平均请求等待时间</span>
Time per request:       <span class="hljs-number" style="margin: 0px; padding: 0px; color: rgb(0, 102, 102); box-sizing: border-box;">14.972</span> [ms] (mean, across all concurrent requests) <span class="hljs-comment" style="margin: 0px; padding: 0px; color: rgb(136, 0, 0); box-sizing: border-box;">#服务器平均请求处理时间</span>
Transfer rate:          <span class="hljs-number" style="margin: 0px; padding: 0px; color: rgb(0, 102, 102); box-sizing: border-box;">20.71</span> [Kbytes/<span class="hljs-built_in" style="margin: 0px; padding: 0px; color: rgb(102, 0, 102); box-sizing: border-box;">sec</span>] received <span class="hljs-comment" style="margin: 0px; padding: 0px; color: rgb(136, 0, 0); box-sizing: border-box;">#服务器的数据传输速度(在极限情况下该数据即为服务器出口带宽)</span>

Connection Times (ms)
              <span class="hljs-built_in" style="margin: 0px; padding: 0px; color: rgb(102, 0, 102); box-sizing: border-box;">min</span>  mean[+/-sd] <span class="hljs-built_in" style="margin: 0px; padding: 0px; color: rgb(102, 0, 102); box-sizing: border-box;">median</span>   <span class="hljs-built_in" style="margin: 0px; padding: 0px; color: rgb(102, 0, 102); box-sizing: border-box;">max</span>
Connect:       <span class="hljs-number" style="margin: 0px; padding: 0px; color: rgb(0, 102, 102); box-sizing: border-box;">40</span>   <span class="hljs-number" style="margin: 0px; padding: 0px; color: rgb(0, 102, 102); box-sizing: border-box;">46</span>   <span class="hljs-number" style="margin: 0px; padding: 0px; color: rgb(0, 102, 102); box-sizing: border-box;">4.8</span>     <span class="hljs-number" style="margin: 0px; padding: 0px; color: rgb(0, 102, 102); box-sizing: border-box;">46</span>      <span class="hljs-number" style="margin: 0px; padding: 0px; color: rgb(0, 102, 102); box-sizing: border-box;">58</span>
Processing:    <span class="hljs-number" style="margin: 0px; padding: 0px; color: rgb(0, 102, 102); box-sizing: border-box;">41</span>   <span class="hljs-number" style="margin: 0px; padding: 0px; color: rgb(0, 102, 102); box-sizing: border-box;">46</span>   <span class="hljs-number" style="margin: 0px; padding: 0px; color: rgb(0, 102, 102); box-sizing: border-box;">5.0</span>     <span class="hljs-number" style="margin: 0px; padding: 0px; color: rgb(0, 102, 102); box-sizing: border-box;">46</span>      <span class="hljs-number" style="margin: 0px; padding: 0px; color: rgb(0, 102, 102); box-sizing: border-box;">58</span>
Waiting:       <span class="hljs-number" style="margin: 0px; padding: 0px; color: rgb(0, 102, 102); box-sizing: border-box;">40</span>   <span class="hljs-number" style="margin: 0px; padding: 0px; color: rgb(0, 102, 102); box-sizing: border-box;">46</span>   <span class="hljs-number" style="margin: 0px; padding: 0px; color: rgb(0, 102, 102); box-sizing: border-box;">4.9</span>     <span class="hljs-number" style="margin: 0px; padding: 0px; color: rgb(0, 102, 102); box-sizing: border-box;">45</span>      <span class="hljs-number" style="margin: 0px; padding: 0px; color: rgb(0, 102, 102); box-sizing: border-box;">58</span>
Total:         <span class="hljs-number" style="margin: 0px; padding: 0px; color: rgb(0, 102, 102); box-sizing: border-box;">81</span>   <span class="hljs-number" style="margin: 0px; padding: 0px; color: rgb(0, 102, 102); box-sizing: border-box;">92</span>   <span class="hljs-number" style="margin: 0px; padding: 0px; color: rgb(0, 102, 102); box-sizing: border-box;">9.7</span>     <span class="hljs-number" style="margin: 0px; padding: 0px; color: rgb(0, 102, 102); box-sizing: border-box;">92</span>     <span class="hljs-number" style="margin: 0px; padding: 0px; color: rgb(0, 102, 102); box-sizing: border-box;">116</span>

Percentage <span class="hljs-operator" style="margin: 0px; padding: 0px; box-sizing: border-box;">of</span> <span class="hljs-operator" style="margin: 0px; padding: 0px; box-sizing: border-box;">the</span> requests served <span class="hljs-operator" style="margin: 0px; padding: 0px; box-sizing: border-box;">within</span> <span class="hljs-operator" style="margin: 0px; padding: 0px; box-sizing: border-box;">a</span> certain <span class="hljs-built_in" style="margin: 0px; padding: 0px; color: rgb(102, 0, 102); box-sizing: border-box;">time</span> (ms)
  <span class="hljs-number" style="margin: 0px; padding: 0px; color: rgb(0, 102, 102); box-sizing: border-box;">50</span>%     <span class="hljs-number" style="margin: 0px; padding: 0px; color: rgb(0, 102, 102); box-sizing: border-box;">92</span> <span class="hljs-comment" style="margin: 0px; padding: 0px; color: rgb(136, 0, 0); box-sizing: border-box;">#50%的请求在92毫秒内完成</span>
  <span class="hljs-number" style="margin: 0px; padding: 0px; color: rgb(0, 102, 102); box-sizing: border-box;">66</span>%     <span class="hljs-number" style="margin: 0px; padding: 0px; color: rgb(0, 102, 102); box-sizing: border-box;">98</span>
  <span class="hljs-number" style="margin: 0px; padding: 0px; color: rgb(0, 102, 102); box-sizing: border-box;">75</span>%     <span class="hljs-number" style="margin: 0px; padding: 0px; color: rgb(0, 102, 102); box-sizing: border-box;">99</span>
  <span class="hljs-number" style="margin: 0px; padding: 0px; color: rgb(0, 102, 102); box-sizing: border-box;">80</span>%    <span class="hljs-number" style="margin: 0px; padding: 0px; color: rgb(0, 102, 102); box-sizing: border-box;">101</span>
  <span class="hljs-number" style="margin: 0px; padding: 0px; color: rgb(0, 102, 102); box-sizing: border-box;">90</span>%    <span class="hljs-number" style="margin: 0px; padding: 0px; color: rgb(0, 102, 102); box-sizing: border-box;">107</span>
  <span class="hljs-number" style="margin: 0px; padding: 0px; color: rgb(0, 102, 102); box-sizing: border-box;">95</span>%    <span class="hljs-number" style="margin: 0px; padding: 0px; color: rgb(0, 102, 102); box-sizing: border-box;">114</span>
  <span class="hljs-number" style="margin: 0px; padding: 0px; color: rgb(0, 102, 102); box-sizing: border-box;">98</span>%    <span class="hljs-number" style="margin: 0px; padding: 0px; color: rgb(0, 102, 102); box-sizing: border-box;">115</span>
  <span class="hljs-number" style="margin: 0px; padding: 0px; color: rgb(0, 102, 102); box-sizing: border-box;">99</span>%    <span class="hljs-number" style="margin: 0px; padding: 0px; color: rgb(0, 102, 102); box-sizing: border-box;">116</span>
 <span class="hljs-number" style="margin: 0px; padding: 0px; color: rgb(0, 102, 102); box-sizing: border-box;">100</span>%    <span class="hljs-number" style="margin: 0px; padding: 0px; color: rgb(0, 102, 102); box-sizing: border-box;">116</span> (longest request)</code><ul class="pre-numbering" style="margin: 0px; padding: 6px 0px 40px; box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="margin: 0px; padding: 0px 5px; box-sizing: border-box;">1</li><li style="margin: 0px; padding: 0px 5px; box-sizing: border-box;">2</li><li style="margin: 0px; padding: 0px 5px; box-sizing: border-box;">3</li><li style="margin: 0px; padding: 0px 5px; box-sizing: border-box;">4</li><li style="margin: 0px; padding: 0px 5px; box-sizing: border-box;">5</li><li style="margin: 0px; padding: 0px 5px; box-sizing: border-box;">6</li><li style="margin: 0px; padding: 0px 5px; box-sizing: border-box;">7</li><li style="margin: 0px; padding: 0px 5px; box-sizing: border-box;">8</li><li style="margin: 0px; padding: 0px 5px; box-sizing: border-box;">9</li><li style="margin: 0px; padding: 0px 5px; box-sizing: border-box;">10</li><li style="margin: 0px; padding: 0px 5px; box-sizing: border-box;">11</li><li style="margin: 0px; padding: 0px 5px; box-sizing: border-box;">12</li><li style="margin: 0px; padding: 0px 5px; box-sizing: border-box;">13</li><li style="margin: 0px; padding: 0px 5px; box-sizing: border-box;">14</li><li style="margin: 0px; padding: 0px 5px; box-sizing: border-box;">15</li><li style="margin: 0px; padding: 0px 5px; box-sizing: border-box;">16</li><li style="margin: 0px; padding: 0px 5px; box-sizing: border-box;">17</li><li style="margin: 0px; padding: 0px 5px; box-sizing: border-box;">18</li><li style="margin: 0px; padding: 0px 5px; box-sizing: border-box;">19</li><li style="margin: 0px; padding: 0px 5px; box-sizing: border-box;">20</li><li style="margin: 0px; padding: 0px 5px; box-sizing: border-box;">21</li><li style="margin: 0px; padding: 0px 5px; box-sizing: border-box;">22</li><li style="margin: 0px; padding: 0px 5px; box-sizing: border-box;">23</li><li style="margin: 0px; padding: 0px 5px; box-sizing: border-box;">24</li><li style="margin: 0px; padding: 0px 5px; box-sizing: border-box;">25</li><li style="margin: 0px; padding: 0px 5px; box-sizing: border-box;">26</li><li style="margin: 0px; padding: 0px 5px; box-sizing: border-box;">27</li><li style="margin: 0px; padding: 0px 5px; box-sizing: border-box;">28</li><li style="margin: 0px; padding: 0px 5px; box-sizing: border-box;">29</li><li style="margin: 0px; padding: 0px 5px; box-sizing: border-box;">30</li><li style="margin: 0px; padding: 0px 5px; box-sizing: border-box;">31</li><li style="margin: 0px; padding: 0px 5px; box-sizing: border-box;">32</li><li style="margin: 0px; padding: 0px 5px; box-sizing: border-box;">33</li><li style="margin: 0px; padding: 0px 5px; box-sizing: border-box;">34</li><li style="margin: 0px; padding: 0px 5px; box-sizing: border-box;">35</li><li style="margin: 0px; padding: 0px 5px; box-sizing: border-box;">36</li><li style="margin: 0px; padding: 0px 5px; box-sizing: border-box;">37</li></ul>


如何选择网站的被测URL?

一个网站的URL可能有很多,每个URL对应的处理也不尽相同,某一个URL的测试结果并不具有代表性。因此,我们需要选择一系列有代表性的URL,将测试结果的加权平均数作为网站的综合性能。

猜你喜欢

转载自blog.csdn.net/John_ToStr/article/details/51166257