dbaplus社群 2024年09月19日
一台服务器最大能支持多少条 TCP 连接?问倒一大片……
index_new5.html
../../../zaker_core/zaker_tpl_static/wap/tpl_guoji1.html

 

文章讨论了服务器最大能打开的文件数、能支持的连接数,客户端机器能发起的连接数等相关问题

📋Linux中服务器最大能打开的文件数受三个参数影响,分别是fs.file-max、softnofile、fs.nr_open,它们之间存在耦合关系,配置时需注意

💻一台服务器最大能支持的TCP连接数理论上约为两百多万亿,但受软硬件影响实际不可能达到,以4GB内存服务器为例,若连接为ESTABLISH状态且空闲,可建立100w+连接,但实际场景中受数据收发和处理影响,并发难以达到100w+

📱一台客户端机器能发起的连接数分多种情况,如client和server端IP及端口情况不同,连接数也不同,且受内核参数限制,可通过修改参数值来调整

🔗三次握手里socket的全连接队列长度可通过调整参数net.core.somaxconn来增加,以减小丢包影响,还探讨了一些其他相关实际问题

文攀 2024-09-19 07:15 广东

熬到到技术终面,结果一问一个不吱声!




分享概要



之前有一位读者诉苦,有次面试,好不容易(今年行情大家都懂的)熬到到技术终面,谁知道面试官突然放个大招问他:一台服务器最大能支持多少条 TCP 连接,把他直接给问懵了……(请自行脑补那尴尬的场面与气氛)。


所以,今天就来讨论一下这个问题。


一台服务器最大能打开的文件数


限制参数


我们知道在Linux中一切皆文件,那么一台服务器最大能打开多少个文件呢?Linux上能打开的最大文件数量受三个参数影响,分别是:





这三个参数之间还有耦合关系,所以配置值的时候还需要注意以下三点:





调整服务器能打开的最大文件数示例


假设想让进程可以打开100万个文件描述符,这里用修改conf文件的方式给出一个建议。如果日后工作里有类似的需求可以作为参考。


vim /etc/sysctl.conf
fs.file-max=1100000 // 系统级别设置成110万,多留点buffer fs.nr_open=1100000 // 进程级别也设置成110万,因为要保证比 hard nofile大

使上面的配置生效sysctl -p


vim /etc/security/limits.conf // 用户进程级别都设置成100完 soft nofile 1000000 hard nofile 1000000

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


我们知道TCP连接,从根本上看其实就是client和server端在内存中维护的一组【socket内核对象】(这里也对应着TCP四元组:源IP、源端口、目标IP、目标端口),他们只要能够找到对方,那么就算是一条连接。那么一台服务器最大能建立多少条连接呢?



如果只以ESTABLISH状态的连接来算(这些连接只是建立,但是不收发数据也不处理相关的业务逻辑)那么一台服务器最大能建立多少连接呢?以一台4GB内存的服务器为例!




上面讨论的都是进建立连接的理想情况,在现实中如果有频繁的数据收发和处理(比如:压缩、加密等),那么一台服务器能支撑1000连接都算好的了,所以一台服务器能支撑多少连接还要结合具体的场景去分析,不能光靠理论值去算。抛开业务逻辑单纯的谈并发没有太大的实际意义。


服务器的开销大头往往并不是连接本身,而是每条连接上的数据收发,以及请求业务逻辑处理!!!


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


我们知道客户端每和服务端建立一个连接便会消耗掉client端一个端口。一台机器的端口范围是【0 ~ 65535】,那么是不是说一台client机器最多和一台服务端机器建立65535个连接呢(这65535个端口里还有很多保留端口,可用端口可能只有64000个左右)?


由TCP连接的四元组特性可知,只要四元组里某一个元素不同,那么就认为这是不同的TCP连接。所以需要分情况讨论:


【情况一 】、如果一台client仅有一个IP,server端也仅有一个IP并且仅启动一个程序,监听一个端口的情况下,client端和这台server端最大可建立的连接条数就是 65535 个。


因为源IP固定,目标IP和端口固定,四元组中唯一可变化的就是【源端口】,【源端口】的可用范围又是【0 ~ 65535】,所以一台client机器最大能建立65535个连接。


【情况二 】、如果一台client有多个IP(假设客户端有 n 个IP),server端仅有一个IP并且仅启动一个程序,监听一个端口的情况下,一台client机器最大能建立的连接条数是:n * 65535 个。


因为目标IP和端口固定,有 n 个源IP,四元组中可变化的就是【源端口】+ 【源IP】,【源端口】的可用范围又是【0 ~ 65535】,所以一个IP最大能建立65535个连接,那么n个IP最大就能建立 n * 65535个连接了。


以现在的技术,给一个client分配多个IP是非常容易的事情,只需要去联系你们网管就可以做到。


【情况三 】、如果一台client仅有一个IP,server端也仅有一个IP但是server端启动多个程序,每个程序监听一个端口的情况下(比如server端启动了m个程序,监听了m个不同端口),一台client机器最大能建立的连接数量为:65535 * m。


源IP固定,目标IP固定,目标端口数量为m个,可变化的是源端口,而源端口变化范围是【0 ~ 65535】,所以一台client机器最大能建立的TCP连接数量是 65535 * m个。




其他


三次握手里socket的全连接队列长度由参数net.core.somaxconn来控制,默认大小是128,当两台机器离的非常近,但是建立连接的并发又非常高时,可能会导致半连接队列或全连接队列溢出,进而导致server端丢弃握手包。然后造成client超时重传握手包(至少1s以后才会重传),导致三次握手连接建立耗时过长。我们可以调整参数net.core.somaxconn来增加去按连接队列的长度,进而减小丢包的影响


有时候我们通过 ctrl + c方式来终止了某个进程,但是当重启该进程的时候发现报错端口被占用,这种问题是因为【操作系统还没有来得及回收该端口,等一会儿重启应用就好了】


client程序在和server端建立连接时,如果client没有调用bind方法传入指定的端口,那么client在和server端建立连接的时候便会自己随机选择一个端口来建立连接。一旦我们client程序调用了bind方法传入了指定的端口,那么client将会使用我们bind里指定的端口来和server建立连接。所以不建议client调用bind方法,bind函数会改变内核选择端口的策略


public static void main(String[] args) throws IOException { SocketChannel sc = SocketChannel.open(); // 客户端还可以调用bind方法 sc.bind(new InetSocketAddress("localhost", 9999)); sc.connect(new InetSocketAddress("localhost", 8080)); System.out.println("waiting.........."); }

在Linux一切皆文件,当然也包括之前TCP连接中说的socket。进程打开一个socket的时候需要创建好几个内核对象,换一句直白的话说就是打开文件对象吃内存,所以Linux系统基于安全角度考虑(比如:有用户进程恶意的打开无数的文件描述符,那不得把系统搞奔溃了),在多个位置都限制了可打开的文件描述符的数量。


内核是通过【hash表】的方式来管理所有已经建立好连接的socket,以便于有请求到达时快速的通过【TCP四元组】查找到内核中对应的socket对象。


在epoll模型中,通过红黑树来管理epoll对象所管理的所有socket,用红黑树结构来平衡快速删除、插入、查找socket的效率。


相关实际问题


在网络开发中,很多人对一个基础问题始终没有彻底搞明白,那就是一台机器最多能支撑多少条TCP连接。不过由于客户端和服务端对端口使用方式不同,这个问题拆开来理解要容易一些。


注意,这里说的是客户端和服务端都只是角色,并不是指某一台具体的机器。例如对于我们自己开发的应用程序来说,当他响应客户端请求的时候,他就是服务端。当他向MySQL请求数据的时候,他又变成了客户端。


"too many open files" 报错是怎么回事,该如何解决


你在线上可能遇到过too many open files这个错误,那么你理解这个报错发生的原理吗?如果让你修复这个错误,应该如何处理呢?




需要注意这三个参数之间的耦合关系!


一台服务端机器最大究竟能支持多少条连接


因为这里要考虑的是最大数,因此先不考虑连接上的数据收发和处理,仅考虑ESTABLISH状态的空连接。那么一台服务端机器上最大可以支持多少条TCP连接?这个连接数会受哪些因素的影响?



一条客户端机器最大究竟能支持多少条连接


和服务端不同的是,客户端每次建立一条连接都需要消耗一个端口。在TCP协议中,端口是一个2字节的整数,因此范围只能是0~65535。那么客户单最大只能支持65535条连接吗?有没有办法突破这个限制,有的话有哪些办法?



方式一,为客户端配置多IP 方式二,分别连接不同的服务端



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


假设你是系统架构师,现在老板给你一个需求,让你做一个类似友盟upush这样的产品。要在服务端机器上保持一个和客户端的长连接,绝大部分情况下连接都是空闲的,每天也就顶多推送两三次左右。总用户规模预计是1亿。那么现在请你来评估一下需要多少台服务器可以支撑这1亿条长连接。





作者丨文攀

来源丨网址:juejin.cn/post/7162824884597293086

dbaplus社群欢迎广大技术人员投稿,投稿邮箱:editor@dbaplus.cn




活动推荐


当前,运用各类新兴技术深度赋能研发效能提升、强化业务与科技高效协同已成为金融科技从业者的重要课题,需要从优化研发流程、提高开发效率、降低错误率、保障安全性等方面多管齐下,全面推进。


为此,dbaplus社群携手汇丰科技多位技术专家,围绕“金融级研发效能的多维度提升与突破”这一主题开展线上直播分享,和大家一起探讨跨国企业统一业务流程和IT架构、架构安全设计进一步左移、私有化部署在线开发环境、云资源一站式管理和部署等议题的创新思路和通用解法。点击下方链接预约直播:




跳转微信打开

Fish AI Reader

Fish AI Reader

AI辅助创作,多种专业模板,深度分析,高质量内容生成。从观点提取到深度思考,FishAI为您提供全方位的创作支持。新版本引入自定义参数,让您的创作更加个性化和精准。

FishAI

FishAI

鱼阅,AI 时代的下一个智能信息助手,助你摆脱信息焦虑

联系邮箱 441953276@qq.com

相关标签

服务器连接 客户端连接 文件数限制 TCP连接
相关文章