问题是在用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工作的原理,分别用ab在windows上进行两次实验,第一次是一个并发,200个请求:
ab -n 200 http://www.baidu.com/
用netstat -an | findstr 61.135.169.121:80对请求状态进行过滤,如下:
可以观察到,每次建立链接的端口都不一样,就是说ab工具为每个请求独立建立socket链接。
第二个实验是并发5个,同样是200个请求,进行过滤的结果如下:
和上面一样,每次请求的端口也都不一样,并且请求的数量都是5(忽略SYN_SENT)。
经过实验,不难得出结论,ab为每次请求都重新生成一次socket,并发是指每次生成socket并发出HTTP请求的数量。这样做也是符合网站压力测试的要求和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可能导致服务器内存消耗过大的情况,需根据具体情况进行优化。
参考资料:
- 《HTTP: The Definitive Guide》
- http://www.w3.org/Protocols/rfc2616/rfc2616-sec8.html