一台linux服务器最多能支持多少个TCP连接?

287 阅读2分钟

客户端

客户端最多支持TCP连接数 = IP数 x 端口数 = IP数 x 65535

仅有一个IP的客户端来说,最多能支持的连接数受限于端口 ip_local_port_range参数,一般为65535

端口数65535是由于IP规范分配16位决定, 2^16=65535

IPV4数是由于IP规范分配32位决定,2^32

服务端

服务端最多支持TCP连接数 = 内存数 / 静默TCP连接所占大小 3.3k

取决于linux服务器的内存大小,若linux服务器有4GB的内存,理论值为:4GB / 3.3k ≈ 127w个 连接

Socket 实际对应一个文件描述符。因此,取决于linux系统对单个进程打开的文件描述符的限制(默认1024)

服务端不同于客户端,最大连接数并不仅仅受限于端口数。一个TCP连接是由一个四元组:源IP、源端口、目标IP、目标端口确定

在不考虑地址重用,socket中的 SO_REUSEADDR端口复用选项的情况下,例如:对只监听80端口Nginx服务器来说,服务器IP和端口是固定的,因此四元组中仅有客户端IP、客户端端口是可变的。所以服务端能建立的TCP连接数是:客户端IP数 x客户端端口数 = 2³² x 2¹⁶

然而linux上不仅仅只能监听80端口,还可以监听其他端口号,比如:MySQL-3306,Redis-6379,一共有2¹⁶=65535个端口,因此服务器理论上最多可以支持的TCP连接数为:客户端IP数 x 客户端端口数 x 服务端监听端口数 = 2³² x 2¹⁶ x 2¹⁶,理论值几乎可以认为是无限大

理论和实际是有差距的,因为linux每维护一条TCP连接都要消耗资源(处理连接请求、保活、数据收发都需消耗CPU,而维持TCP连接又要消耗内存)。先不考虑数据的收发,只考虑静止状态下的TCP连接,此状态下对CPU的消耗可以忽略不计,主要考虑内存的影响即可

一条静止状态TCP连接占用的内存大概是3.3k(如果有数据收发,就需要另外为每条TCP分配发送缓冲区,其大小受参数 net.ipv4.tcp_wmem的配置影响,初始默认为4k。如果收发结束。缓冲区所占的内存才会被回收)