linux内核调优支持500K并发

1.关于tcp 64K最大连接数的神话

 

我们都知道,tcp端口号是16位的,也就是说tcp最多只能分配2^16=64K个端口号。所以我们理所当然的认为一台服务器最多只能服务64K个客户端,这种想法绝对是错误的。

真正确定一条tcp连接的是一个四元组的标识:

{local ip, local port,remote ip,remote port}

当四元组中任何一个变量发生改变,都是一条新的tcp连接,所以理论上来说tcp最多可以有(ipv4):2^32 * 2^16 * 2^32 * 2^16 条连接。

如果一台服务器ip地址固定,理论能承受的连接数为:2^32(客户端ip数)* 2^16(客户端端口数)= 2^48个。当然,在实际环境中,受到机器资源、操作系统等的限制,tcp并发数不可能达到这个值,但也远远要大于64K。

 

2.修改内核参数

 

一些和socket相关的参数可以调整优化,在/etc/sysctl.conf中,有几个参数:
1.fs.file-max:最大描述文件数限制。默认值比较低,所以可以调整。警惕调高后的风险。
2.socket缓存参数net.ipv4.tcp_rmem和net.ipv4.tcp_wmem。分别是读写缓存限制。他们都需要三个整数参数配置:min、default、max,来对应到每个socket缓存的字节数。可以设置一个宽松的最大值来减少每个socket链接所带来的内存开销。

我们这三个参数的配置是这样的:

fs.file-max = 999999

net.ipv4.tcp_rmem = 4096 4096 16777216

net.ipv4.tcp_wmem = 4096 4096 16777216

内核允许999,999个文件描述,每个socket可以用到最低和默认的4096字节、最高16MB的缓存。

我们同样修改文件/etc/security/limits.conf允许所有用户打开999,999个文件描述。

#<domain> <type> <item> <value>

* - nofile 999999

 

 

3.测试

 

测试时,通过在客户端和服务端增加临时端口的数量,我们可以获得每个客户端64,000个链接。

echo "1024 65535" > /proc/sys/net/ipv4/ip_local_port_range

这样使上述每个临时端口有1024个被使用,而不是默认值(默认值比较低,而且比较保守)。

最后测试在500K连接的情况下,客户端每10分钟发送一次keep alive,维持1个小时,连接数基本稳定。

 

资料:http://urbanairship.com/blog/2010/09/29/linux-kernel-tuning-for-c500k

 

 

发表评论