很长一段时间对web模型的并发量的理解只是停留在单台并发在5万左右 ,具体为什么这样,理解的并不深刻,只是在看nginx的相关文档时都这样介绍的。后来在处理个信的推送(comet应用)时,对于其单台上百万的连接甚是不解。感觉这违背了单台5万并发的逻辑。后经过梳理,找到了一个合理的解释,后来和很多人聊到单台主机的并发问题时,发现很多人都存在这个误区,目前总结如下。理解不对的地方,也欢迎板砖。

bingfa

如上图所示是一个典型的web模型:

一、有关client 的五万并发

单台并发在5万左右,可以先理解为单台client 的并发在50000左右。众所周知,一台主机的可用端口范围是1-65535 ,除掉1-1024这些已定义的端口,再考虑到tcp/ip参数等其他的一些因素。一台主机的可用端口范围是10000-60000之间。上图中client到server之间的连接图可以看出:client 连接web服务器端时,client 的单台并发是50000左右。其连接模式为:

110000 ---- 80
210001 ---- 80
310002 ---- 80
4…………………………

当然,单台client也并不是无法超越这个限制,当单台主机有多个IP时,这个限制就变成了 5w * n(ip数),其连接模式为:

1192.168.1.10:10000 ---- www.361way.com:80
2192.168.1.10:10001 ---- www.361way.com:80
3192.168.1.10:10002 ---- www.361way.com:80
4……………………………………………………
5192.168.1.20:10000 ---- www.361way.com:80
6192.168.1.20:10001 ---- www.361way.com:80
7192.168.1.20:10002 ---- www.361way.com:80
8……………………………………………………

二、有关server端五万并发的原因

根据上面client — server 的模型来看,server端并没有端口不够用的问题,所以其理论上来讲也并不存在并发只局限在5万个的问题。所以单台server 主机百万并发连接现然也是现实的(长连接推送模型)。而在实际的应用中,server 端也是存在五万并发的问题的,这里先不考虑其他的因素,我们先看后一部分图就可以很好的解释这个问题了。

实际应用中,大部分站点都是基于动态web技术的(java、php、ASP、python、ruby等),在动态应用中,我们一般并不会直接让client端请求到后端就用,以tomcat为例,虽然 client — tomcat 是可以正常访问的,不过一般我们会通过反向代理的方式访问tomcat ,其请求为 client —- nginx/apache等 —— tomcat 。这里又变成了上面 client五万并发的问题 ,上图中的web server 变成了client ,app server成了server ,web server在使用完成了10000 — 60000 之间的端口后,并有端口可用时便无法再与后端的 app server之间建立起新的连接。所以前端的nginx/apache 也变成了存在5万并发的问题。

三、其他相关

1、单台如何突破5万并发

如果在单台主机上配置多个IP,理论上并发数可以达到5w * n个 。这里具体可以参考“网络四元组/网络五元组”:

四元组是指的是: {源IP地址,源端口,目的IP地址,目的端口}

五元组指的是(多了协议):{源IP地址,目的IP地址,协议号,源端口,目的端口}

在《UNIX网络编程卷1:套接字联网API(第3版)》一书中,是这样解释:

一个TCP连接的套接字对(socket pari)是一个定义该连接的两个端点的四元组,即本地IP地址、本地TCP端口号、外地IP地址、外地TCP端口号。套接字对唯一标识一个网络上的每个TCP连接。
……
标识每个端点的两个值(IP地址和端口号)通常称为一个套接字。

以四元组为例,请求的IP地址和目的端口基本上是固定的,不会变化,那么只能从本机IP地址和本机端口上考虑,端口的范围一旦指定了,那么增加IP地址,可以增加对外发出的请求数量。假设系统可以使用的端口范围已经如上所设,那么可以使用的大致端口为64000个,系统添加了10个IP地址,那么可以对外发出的数量为 64000 * 10 = 640000,数量很可观。

2、网卡的限制

以常见的1000M网卡为例,假设请求的为一个最简单web页面,页面大小为15KB(当前使用的富文本估计一般都会比这个大不少),1000 * 1024 /8 /15 约等于8533个连接 。也就是并发达到这个值就就把网卡流量跑满了 。如果使用的是10Gb网卡,单台的最大并发也就是8w多个。

3、5W并发的概念

5W * 3600 * 24 =432000W ,一天下来会有43亿2千万个连接(PV) 。我们再打个折,按照请求的峰值与非峰值的二八定律及连接的释放时间等,打个20倍的折,折后的值也有2亿多个PV 。通达到这个量也算是不小的站了。

4、长连接为什么能维持这么高的连接

长连接推送模型中,大部分的时候只是连接的维持,在没有推送任务的情况下,连接之间几乎不存在数据传输。所以网卡能吃的消。 另外nofile的值在2.6.25之前定义了这个值的最大值,为1024*1024,正好是100万,而在2.6.25内核及其之后,这个值是可以通过/proc/sys/fs /nr_open来设置。