单台服务器并发TCP连接数到底可以有多大

曾几何时,我们还在寻找网络编程中C10K问题的解决方案。现在,从硬件和操作系统支持来看,“单台服务器支持上万并发连接”已经没有多少挑战性了。

我们先假设:单台服务器最多只能支持万级并发连接。其实,这对绝大多数应用来说,已经远远足够了。但是,对于一些拥有很大用户基数的互联网公司,往往面临的并发连接数是百万、千万,甚至是上亿(百度、阿里、腾讯等公司,其网络服务TCP并发连接数往往会过亿)。

现在的集群、分布式技术,可以将并发负载分担到多台服务器上。所以,只需要扩展出数十台服务器,就可以解决问题。但是,我们更希望:更大程度地挖掘单台服务器的资源,先努力垂直扩展,再进行水平扩展。这样可以有效节省服务器相关的开支(硬件资源、机房、运维人力、电力,其实也是一笔不小的开支)。

那么,到底一台服务器能够支持多少TCP并发连接呢?这就是本文要讨论的问题。

一、文件句柄数限制

在linux下编写网络服务器程序,每一个tcp连接都要占一个文件描述符。一旦这个文件描述符使用完了,新的连接到来时,系统返回给我们的错误是“Socket/File:Can't open so many files”。
这时你需要明白操作系统对可以打开的最大文件数的限制。

1.1 进程打开文件句柄数限制

执行命令ulimit -n, 输出 1024,说明:对于一个进程而言,最多只能打开1024个文件。所以,如果你使用此默认配置,那么最多也就可以并发上千个TCP连接。

1.1.1 临时修改“进程打开文件句柄数限制”

使用命令:ulimit -n 1000000,但是这种临时修改只对当前登录用户目前的使用环境有效,系统重启或用户退出后就会失效。
1.1.2 重启后失效修改“进程打开文件句柄数限制”(不过我在CentOS 6.5下测试,重启后未发现失效)

编辑 /etc/security/limits.conf 文件, 修改后内容为:

  • soft nofile 1000000
  • hard nofile 1000000

1.1.3 永久修改“进程打开文件句柄数限制”

编辑/etc/rc.local,在其后添加如下内容:

  • ulimit -SHn 1000000

1.2 全局限制

执行命令cat /proc/sys/fs/file-nr 输出 9344 0 592026,含义分别为:

  • 1. 已经分配的文件句柄数,
  • 2. 已经分配、但没有使用的文件句柄数,
  • 3. 最大文件句柄数。

在kernel 2.6版本中,第二项的值总为0。这并不是一个错误,它实际意味着:已经分配的文件描述符无一浪费,都已经被使用 。
可以把这些数值改大些,用root权限修改 /etc/sysctl.conf 文件:

  • fs.file-max = 1000000
  • net.ipv4.ip_conntrack_max = 1000000
  • net.ipv4.netfilter.ip_conntrack_max = 1000000

二、端口号范围限制

操作系统上的端口号,1024以下是系统保留的,从1024-65535是用户使用的。很多人都认为,由于每个TCP连接都要占一个端口号,所以我们最多可以有60000多个并发连接。但是,这种思路是错误的,我们来分析一下吧。

2.1 如何标识一个TCP连接

系统用一个四元组来唯一标识一个TCP连接:{local ip, local port,remote ip,remote port}。我们拿出《UNIX网络编程:卷一》第四章中对accept的讲解,来看看概念性的东西,第二个参数cliaddr代表了客户端的ip地址和端口号。而我们作为服务端,实际只使用了bind时这一个端口,这说明端口号65535并不是并发量的限制。

2.2 server最大tcp连接数:

server通常固定在某个本地端口上监听,等待client的连接请求。不考虑地址重用(unix的SO_REUSEADDR选项)的情况下,即使server端有多个ip,本地监听端口也是独占的。因此,在server端tcp连接四元组中,只有remote ip(也就是client ip)和remote port(客户端port)是可变的。由此可知,最大tcp连接数客户端ip数×客户端port数对于IPV4,不考虑ip地址分类等因素,最大tcp连接数约为2的32次方(ip数)×2的16次方(port数),也就是说,server端单机最大tcp连接数约为2的48次方。

三、总结

上面给出的结论都是理论上的单机TCP并发连接数,实际上单机并发连接数肯定要受硬件资源(内存)、网络资源(带宽)的限制。一般情况下,对于数十万并发连接的需求,还是采用集群、分布式技术,将并发负载分担到多台服务器上。但是,更大程度地挖掘单台服务器的资源,先努力垂直扩展,再进行水平扩展,可以有效节省服务器相关的开支。

你可能感兴趣的:(服务器,高并发)