前言

 

 曾几何时,我们仍在寻找网络编程中C10K问题的解决方案(请参阅文章“C10K问题(英文在线阅读,英文PDF下载,中文翻译)”,但从硬件和操作系统支持的角度来看,单个服务器支持数万个并发连接不再具有挑战性。

 

 让我们假设一台服务器最多只能支持10,000个并发连接。事实上,这对于大多数应用程序来说已经足够了,但是对于一些拥有大量用户的互联网公司来说,并发连接的数量通常是数百万、数千万甚至上亿的腾讯(注意:QQ默认使用的是UDP协议,请参考讨论帖子“为什么QQ使用UDP协议而不是TCP协议?).

 

 尽管当前的集群和分布式技术可以在多个服务器上共享并发负载,但是我们只需要扩展几十台计算机就可以解决这个问题。但是,我们希望更多地利用单个服务器的资源,先纵向扩展,然后横向扩展,这样可以有效地节省服务器相关的费用(硬件资源、机房、操作和维护人力以及电力实际上都是很大的费用)。

 

 那么一个服务器可以支持多少个TCP并发连接呢?这是本文要讨论的问题。

 C10K问题系列文章

 

 本文是C10K问题系列文章的第一篇。总体内容如下:

 

 高性能网络编程(一):一台服务器可以有多少个并发的TCP连接(本文)

 高性能网络编程(二):十年来著名的C10K并发连接问题

 高性能网络编程(3):在未来10年,是时候考虑C10M的并发问题了

 高性能网络编程(四):从C10K到C10M的高性能网络应用的理论探索

 高性能网络编程(5):读取高性能网络编程中的输入输出模型

 高性能网络编程(ⅵ):阅读高性能网络编程中的线程模型

 高性能网络编程经典:C10K问题[附件下载]

 常识1:文件句柄限制

 

 在linux下编写网络服务器程序的朋友必须知道每个tcp连接都必须占用一个文件描述符。一旦这个文件描述符用完,当新的连接到来时,返回给我们的错误是“套接字/文件:不能打开这么多文件”。

 

 此时,您需要了解操作系统对可以打开的最大文件数量的限制。

 

 1过程限制

 

 执行ulimit -n输出1024意味着一个进程最多只能打开1024个文件,因此您最多可以使用此默认配置建立数千个TCP连接。临时修改:ulim it-n100000,但此临时修改仅对当前登录用户的当前使用环境有效,在系统重启或用户注销后无效。

 

 重启后修改无效(但是,我在CentOS 6.5下测试过,重启后没有发现无效)。编辑/etc/security/limits.conf文件,修改内容如下:

 

 软nofile 1000000

 硬nofile 1000000

 

 永久修改:编辑/etc/rc.local,并在其后添加以下内容:

 

 ulimit -SHn 1000000

 

 2全球限制

 

 执行cat /proc/sys/fs/file-nr输出9344 0 592026,如下所示:

 

 1.已经分配的文件句柄的数量,

 2.已分配但未使用的文件句柄的数量,

 3.文件句柄的最大数量。

 

 然而,在内核版本2.6中,第二项的值总是0,这不是一个错误。这实际上意味着所有分配的文件描述符都被使用了,没有任何浪费。

 

 我们可以将该值更改得更大,并使用根权限修改/etc/sysctl.conf文件:

 

 fs.file-max = 1000000

 net . IP v4 . IP _ conn track _ max = 1000000

 net . IP v4 . net filter . IP _ conn track _ max = 1000000

 

 常识2:端口号范围的限制?

 

 在操作系统上,1024以下的端口号由系统保留,1024-65535由用户使用。由于每个TCP连接占用一个端口号,我们最多可以有60,000多个并发连接。我认为有不少朋友有这种错误的想法。(我曾经这样认为)

 

 让我们分析一下。

 

 如何识别一个TCP连接:

 系统用4元组唯一标识一个TCP连接:{本地IP,本地端口,远程IP,远程端口}。好了,让我们看一下UNIX网络编程:第一卷第四章中关于接受的解释,来看看概念上的东西。第二个参数cliaddr表示客户端的ip地址和端口号。作为服务器,我们实际上只在绑定时使用端口,这表明端口号65535不是并发的限制。

 

 服务器最大tcp连接数:

 服务器通常监听本地端口,并等待来自客户端的连接请求。不考虑地址重用(unix的SO_REUSEADDR选项),即使在服务器端有多个ipS,本地侦听端口也是独占的,因此在服务器端tcp连接4元组中只有远程ip(即客户端ip)和远程端口(客户端端口)是可更改的。因此,最大tcp连接是客户端ip的数量×客户端端口的数量。对于ipV4,最大tcp连接约为2的32次方(IP号)×2的16次方(端口号),也就是说,单个服务器的最大tcp连接约为2的48次方。

 本文摘要

 

 以上给出的结论都是理论上的单机TCP并发连接。事实上,单机并发连接的数量必须受到硬件资源(内存)和网络资源(带宽)的限制。至少对于我们的需求,我们现在可以实现成千上万的并发连接。你呢?