一台服务器最大能支持多少条 TCP 连接

💡 原文中文,约5500字,阅读约需14分钟。
📝

内容提要

本文介绍了Linux系统中服务器最大文件打开数限制以及一台服务器最大能支持多少连接的问题。调整关键参数可以增加服务器能打开的最大文件数。一台4GB内存的服务器大约可以支持100万个连接。客户端机器最多能发起的连接数量取决于IP和端口的组合,一台client机器最多可以建立65535个连接。文章还讨论了全连接队列长度和端口被占用等问题。最后,给出了做一个长连接推送产品,支持1亿用户需要多少台机器的评估。

🔎

延伸解读

理论连接数与实际业务负载的差距

文章指出,一台4GB内存的服务器理论上可支持约100万个ESTABLISH状态空连接,但这是理想情况。实际业务中,数据收发、压缩加密等操作会大幅增加内存和CPU消耗,导致并发能力急剧下降,可能仅能支撑1000连接。因此,脱离业务逻辑谈并发没有实际意义,评估服务器容量必须结合具体场景。

突破客户端65535连接限制的实用方法

客户端单IP连接同一服务端时,受端口范围限制最多建立约65535条连接。但通过为客户端配置多个IP,或让客户端连接不同的服务端(不同IP或端口),可以成倍突破此限制。文章强调,给客户端分配多IP在技术上很容易实现,这为需要发起大量连接的应用提供了可行方案。

内核参数调整的耦合风险与正确做法

调整文件描述符限制时,fs.file-max、soft nofile、hard nofile和fs.nr_open之间存在耦合关系。若hard nofile超过fs.nr_open,可能导致用户无法登录;使用echo临时修改fs.nr_open,重启后会失效。文章建议通过修改/etc/sysctl.conf和/etc/security/limits.conf文件,并执行sysctl -p使配置持久生效,避免直接echo修改内核参数。

长连接推送服务的容量估算逻辑

对于类似友盟upush的长连接推送产品,连接大部分时间空闲,CPU开销可忽略,因此容量主要受内存限制。文章以128GB内存服务器为例,估算每台可支持500万并发连接,消耗不到20GB内存用于socket,剩余内存足以应对缓冲区等开销。据此,1亿用户规模仅需约20台服务器,这为类似系统提供了参考估算方法。

❓

Q&A

一台服务器最大能支持多少条TCP连接?

一台4GB内存的服务器理论上可以支持约100万个TCP连接,但实际情况受内存和CPU限制。

如何调整Linux系统中服务器的最大文件打开数?

可以通过修改fs.file-max、soft nofile和fs.nr_open参数来调整服务器的最大文件打开数。

客户端机器最多能发起多少条连接?

客户端机器最多可以建立65535个连接,具体取决于IP和端口的组合。

如何解决'too many open files'错误?

可以通过修改fs.file-max、soft nofile和fs.nr_open参数来解决'too many open files'错误。

做一个长连接推送产品,支持1亿用户需要多少台机器?

估算需要约20台服务器,每台服务器支持500万条连接。

全连接队列长度如何调整?

全连接队列长度由net.core.somaxconn控制,默认值为128,可以根据实际情况调整。

🏷️

标签

➡️

继续阅读