单机并发连接数研究
系统用一个4四元组来唯一标识一个TCP连接:{local ip, local port,remote ip,remote port}。
client每次发起tcp连接请求时,除非绑定端口,通常会让系统选取一个空闲的本地端口(local port),该端口是独占的,不能和其他tcp连接共享。tcp端口的数据类型是unsigned short,因此本地端口个数最大只有65536,端口0有特殊含义,不能使用,这样可用端口最多只有65535,所以在全部作为client端的情况下,最大tcp连接数为65535,这些连接可以连到不同的server ip。
server通常固定在某个本地端口上监听,等待client的连接请求。不考虑地址重用(unix的SO_REUSEADDR选项)的情况下,即使server端有多个ip,本地监听端口也是独占的,因此server端tcp连接4元组中只有remote ip(也就是client ip)和remote port(客户端port)是可变的,因此最大tcp连接为客户端ip数×客户端port数,对IPV4,不考虑ip地址分类等因素,最大tcp连接数约为2的32次方(ip数)×2的16次方(port数),也就是server端单机最大tcp连接数约为2的48次方。
在unix/linux下限制连接数的主要因素是内存和允许的文件描述符个数(每个tcp连接都要占用一定内存,每个socket就是一个文件描述符), 另外1024以下的端口通常为保留端口。对server端,通过增加内存、修改最大文件描述符个数等参数,单机最大并发TCP连接数超过10万 是没问题的。
注意事项:
1.默认的CONNTRACK_MAX值不会低于128
2.对于带有超过1G内存的系统,CONNTRACK_MAX的默认值会被限制在65536(但是可以手工设置成更大的值)
3.默认HASHSIZE的值不会小于16
4.对于带有超过1G内存的系统,HASHSIZE的默认值会被限制在8192(但是可以手工设置成更大的值)
总结
1.每个连接都要耗费一定的资源,比如CPU、MEM,所以,真实值往往很难达到理论值;
2.根据协议的不同,能达到的最大连接数也不一样,比如HTTP/1.0连接的创建和关闭都非常快,而且浏览器对并发连接数有限制,所以,很难达到最大的理论值。HTTP/1.1支持流线技术,多个请求可以复用一个连接,这样就大大减少了并发连接数。FTP或者telnet连接都是长连接,很容易达到最大值。
3.很多设备(比如NetScaler)在服务器端都支持连接池(连接复用),里面的连接都是长连接,一样实现了HTTP/1.1里面的流线技术,一个连接就可以处理多个客户端连接。这样除了减少连接资源,同时还减少了负载均衡器的其他资源开销,同时减低了内网的带宽。
4.一些设备(比如NetScaler的TCP-OFFLOAD)支持TCP卸载,仅仅把已经建立的连接发到服务器端,而TCP的三次握手完全有负载均衡器接管,这样,服务器端的连接就成倍的减少。
资料来源:
1.http://wanshi.iteye.com/blog/1256282
2.http://hi.baidu.com/hawk418/blog/item/8377b86e8fe7b3c081cb4a84.html
3.http://itfun.blog.sohu.com/212057666.html
单机千万并发连接实战
http://www.2cto.com/kf/201508/437814.html