web模型中为何单台并发只有5万个左右?

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


bingfa

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

1、有关client 的五万并发

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



10000 ---- 8010001 ---- 8010002 ---- 80…………………………


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



192.168.1.10:10000 ---- www.361way.com:80192.168.1.10:10001 ---- www.361way.com:80192.168.1.10:10002 ---- www.361way.com:80……………………………………………………192.168.1.20:10000 ---- www.361way.com:80192.168.1.20:10001 ---- www.361way.com:80192.168.1.20:10002 ---- www.361way.com:80……………………………………………………


2、有关server端五万并发的缘由

根据上面client -- server 的模型来看,server端并无端口不够用的问题,因此其理论上来说也并不存在并发只局限在5万个的问题。因此单台server 主机百万并发链接现然也是现实的(长链接推送模型)。而在实际的应用中,server 端也是存在五万并发的问题的,这里先不考虑其余的因素,咱们先看后一部分图就能够很好的解释这个问题了。nginx

实际应用中,大部分站点都是基于动态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万并发的问题。web


3、其余相关

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

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

四元组是指的是:编程


{源IP地址,源端口,目的IP地址,目的端口}



五元组指的是(多了协议):后端


{源IP地址,目的IP地址,协议号,源端口,目的端口}



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



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



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

二、网卡的限制

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


三、5W并发的概念

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


四、长链接为何能维持这么高的链接

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

相关文章
相关标签/搜索