数字营销 · Web开发 · 基础设施

超文本传输协议与网站优化

通过 Apache ab 压力测试,分析 HTTP 并发与请求数量的关系,了解浏览器并发连接限制、Keep-Alive 机制及其对网站性能优化的影响。

问题是在用 Apache 的 ab 工具测试网站负载时产生的。ab 工具有两个参数:-c 和 -n,-c 用来设置并发数量,-n 用来设置请求数量。例如:

ab -c 100 -n 100 https://www.hitoy.org/

这个命令会向网站发送 100 个请求,并发数量设置为 100。这里疑问就产生了:并发量和请求量有什么关系?并发到底是什么?用浏览器一次打开多个网站页面会产生很大的并发吗?HTTP 协议中的 Keep-Alive 又有什么用?

查看 Apache 官方对 ab 工具的解释:

-c concurrency

Number of multiple requests to perform at a time. Default is one request at a time.

-c 并发

同一时间执行的请求数量,默认为 1。

-n requests

Number of requests to perform for the benchmarking session. The default is to just perform a single request which usually leads to non-representative benchmarking results.

-n 请求数

一次测试过程中的总请求数量,默认为 1(此设置对测试结果通常不具有参考意义)。

为了弄明白 ab 工作的原理,分别在 Windows 上进行了两次实验。第一次是 1 个并发,200 个请求:

ab -n 200 http://www.baidu.com/

用下面的命令对请求状态进行过滤:

netstat -an | findstr 61.135.169.121:80

如下:

netstat-1

可以观察到,每次建立连接的端口都不一样,也就是说,ab 工具会为每个请求独立建立 Socket 连接。第二个实验是并发 5 个,同样是 200 个请求,进行过滤的结果如下:

netstat-2

和上面一样,每次请求的端口也都不一样,并且同时存在的请求数量为 5(忽略 SYN_SENT)。

经过实验,不难得出结论,ab 为每次请求都重新建立一次 Socket 连接,并发是指同时建立 Socket 并发出 HTTP 请求的数量。这样的方式也符合网站压力测试的需求。

经过上面的测试,你可能又会产生疑问:正常情况下,产生并发的条件是什么?用浏览器一次打开一个网站的多个页面会产生很大的并发吗?

百度百科对并发这样解释:“并发,在操作系统中,是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行,但任一个时刻点上只有一个程序在处理机上运行。”这里可以简单理解为同时向服务器发出的请求数量。

在网站流量较低的情况下,并发数量肯定不会太高。但是有一种情况是,一个网站的网页中含有较多资源,例如新浪首页引用了很多外部图片、JS 等文件(2014 年 11 月 5 日统计引用了 9 个外部 JS、22 条外部文件)。如果浏览器同时向服务器发送这些资源的请求,并发量就可能比较大。

像新浪这样的大流量网站,可能会出现很多用户同时浏览一个页面的情况,这样给服务器带来的压力就会更大。实际上,几乎所有浏览器对并发请求数量都有一定限制:

In practice, browsers do use parallel connections, but they limit the total number of parallel connections to a small number (often four). Servers are free to close excessive connections from a particular client.1

在 W3C 的 RFC 中也有类似的说明:

Clients that use persistent connections SHOULD limit the number of simultaneous connections that they maintain to a given server. A single-user client SHOULD NOT maintain more than 2 connections with any server or proxy. A proxy SHOULD use up to 2*N connections to another server or proxy, where N is the number of simultaneously active users. These guidelines are intended to improve HTTP response times and avoid congestion.2

下图是当时浏览器对并发数的支持情况:

浏览器并发支持

浏览器对同一网站并发请求数量的限制,更像是对服务器的一种保护。但是这种限制也可能带来加载速度的问题。还是以新浪首页为例,页面中有这么多请求,一次并发肯定不能处理所有请求,剩下的请求就会被阻塞,这样网站的加载速度就会受到影响。

我们可以看到,新浪当时把部分外部资源放到了其它域名上。这样做不仅可以减少主服务器的压力,还可以提高网站的加载速度。这是因为浏览器对并发的限制通常是基于域名的,使用多个域名可以在一定程度上突破浏览器对单个域名并发数量的限制,即使这些域名最终指向同一个 CNAME 或 IP。

最后一个问题是 HTTP 协议中的 Keep-Alive。正如我们所知,HTTP 协议中的 Keep-Alive 用来建立持久连接。在持久连接或者 HTTP Pipelining 出现之前,每次请求都需要单独建立一个 TCP 连接。持久连接可以节省重新与服务器建立 Socket 连接时的开销,从而加快网页加载速度。

持久连接是针对单个客户端而言的,如果网站用户数量很多,过长的 Keep-Alive 时间也可能导致服务器连接和内存资源消耗过大,因此需要根据实际情况进行优化。

参考资料

  1. 《HTTP: The Definitive Guide》
  2. http://www.w3.org/Protocols/rfc2616/rfc2616-sec8.html

评论0

欢迎分享你的看法,也欢迎补充不同的实践经验。