一台服务器最大能支持多少条 TCP 连接
内容提要
本文讨论了Linux服务器的最大文件打开数限制和一台服务器最大能支持的连接数。调整参数可以增大服务器能打开的最大文件数。一台4GB内存的服务器大约可以支持100万个TCP连接。客户端机器最多能发起的连接数取决于可用端口范围,一台机器最多可以建立65535个连接。讨论了全连接队列长度、端口被占用问题等。给出了做一个长连接推送产品,支持1亿用户所需的服务器数量评估。
延伸解读
文件描述符限制的耦合关系
调整Linux最大文件打开数时,fs.file-max、soft nofile、hard nofile和fs.nr_open之间存在严格的依赖。hard nofile必须大于等于soft nofile,而fs.nr_open又必须大于hard nofile,否则可能导致用户无法登录。修改时建议通过配置文件而非echo命令,避免重启后失效。
理论连接数与实际瓶颈
理论上TCP连接数可达2^32*2^16,但实际受内存和CPU限制。对于ESTABLISH空闲连接,4GB内存约支持100万连接,因为每个socket消耗约3.3KB内存。然而真实场景中数据收发和业务处理会大幅增加资源消耗,可能仅支持千级连接,因此并发能力需结合具体业务评估。
客户端连接数突破端口限制
客户端默认受端口范围限制,单IP对单服务端最多约65535个连接。但通过配置多IP或连接不同服务端端口,可成倍增加连接数。例如n个IP可建立n*65535个连接,连接m个服务端端口可建立65535*m个连接。实际可用端口还受net.ipv4.ip_local_port_range限制。
长连接推送的容量估算
对于1亿用户的长连接推送产品,若连接大部分空闲,CPU开销可忽略。以128GB内存服务器为例,每台可支撑约500万连接,消耗不到20GB内存,剩余内存足以应对缓冲区等开销。因此约需20台服务器即可支撑1亿长连接。
Q&A
一台4GB内存的服务器最多能支持多少条TCP连接?
一台4GB内存的服务器理论上可以支持约100万个TCP连接。
客户端机器最多能发起多少条连接?
客户端机器最多可以发起65535个连接,受可用端口范围限制。
如何解决'打开文件过多'的错误?
可以通过调整fs.file-max、soft nofile和fs.nr_open参数来解决该错误。
如何通过多个IP突破65535连接限制?
通过为客户端配置多个IP或连接不同的服务端,可以突破65535连接限制。
长连接推送产品支持1亿用户需要多少台服务器?
大约需要20台服务器来支持1亿用户的长连接推送。
修改Linux服务器的最大文件打开数需要注意什么?
需要确保hard nofile大于soft nofile,并且fs.nr_open需大于hard nofile。