【杂谈】服务端能同时处理多少个 Socket 连接?背后的资源与限制分析
一个服务端进程能同时连接多少个 Socket?
要理解一个服务端进程能同时支持多少个连接,首先我们需要明确一个 socket 连接 的表示方式。一个连接由四个部分组成:[LocalIP:LocalPort:RemoteIP:RemotePort]。对于服务端进程来说,LocalIP 和 LocalPort 是固定的,而 RemoteIP 和 RemotePort 则是可以变化的。思考一下,RemoteIP 可以有多少种可能?RemotePort 又可以有多少种可能?这两者组合起来,理论上能够支持多少个连接呢?
从理论上讲,组合的可能性为:
- (RemoteIP) 2^32 * (RemotePort) 2^16 = 2^48
这意味着,理论上一个服务端进程可以支持 2^48 个连接。然而,实际中,连接数通常会受到其他系统资源的限制。
是否受端口数限制?
首先需要明确的是,服务端监听一个端口时仅占用一个端口。与客户端建立连接并不会占用服务端的端口。端口数量限制的是客户端,每个客户端在建立连接时才会占用一个本地端口。
服务端的连接数不受端口数量的影响。
不受端口限制,那它受什么限制呢?
服务端支持的连接数主要受文件描述符的限制。每个 socket 连接都需要占用一个文件描述符,Linux 系统,一个用户进程默认的文件描述符数量通常是 1024。如果连接数超过这个值,应用程序就会报错,提示“文件描述符不足”。
幸运的是,文件描述符的数量是可以调整的,根据需求,可以将其设置为 10 万个或更多,完全可以满足大多数应用的需求。
下面改到100w
// /etc/security/limits.conf * soft nofile 1000000
* hard nofile 1000000 // /etc/sysctl.conf fs.file-max = 1000000
文件描述符是什么?它占用什么资源?
文件描述符是操作系统用来标识打开的文件或 socket 连接的一个“标识符”。本身并不占用太多资源,它只是操作系统内部的一种管理方式。
那么,socket 占用服务器的哪些资源呢?
1)内存
每个 socket 连接在内核空间会分配接收和发送缓冲区。假设每个缓冲区默认大小为 128KB,如果服务端要管理 10 万个连接,那么所需的内存就是:
- 10 万 * 256KB = 24.41GB 内存
如果服务器内存不足 24GB,但仍需要支持 10 万个连接,可以通过调整系统的缓冲区配置来减少每个连接所需的内存。
例如,可以修改以下内核参数来调整 TCP 缓冲区的大小:
# 默认配置
# 内核会根据实际的网络情况自动调整缓冲区的大小,在最小值和最大值间浮动
net.ipv4.tcp_rmem = 4096 131072 6291456
- 4096:最小值
- 131072:默认值
- 6291456:最大值
可以将其都改成4096,也就是4KB。这样10万个连接,只占用781.25MB
2)线程
服务端进程需要使用线程来处理接收和发送的数据。现代的服务端大多使用 NIO(非阻塞 I/O)模型,在该模型中,一个 worker 线程可以管理多个 socket 连接。通过 select 或 epoll 等机制,NIO 模型可以高效地选择需要处理的 socket 连接。
通常,worker 线程的数量是固定的,并不需要太多,20 个左右就足够。这些 worker 线程负责处理接收到的数据包,然后将完整的数据包交给应用层的线程池,后者负责执行实际的业务逻辑。
连接数 ≠ 并发量:一个服务端进程能应付多少个 socket 通信?
实际应用中,连接数并不等于并发量。并发量指的是同一时刻正在进行数据交换的连接数,而连接数指的是总的连接数。
一个服务端进程可以管理大量的 socket 连接,但如果每个连接的通信频率较低(例如,物联网设备的定时数据上报、偶尔发送指令等),那么即使连接数很高,系统也可以轻松应对。
例如,在一个物联网平台中,设备定期上报数据,偶尔发送异常报告或接收指令,这种应用场景下,服务端能管理的连接数和通信量通常没有太大压力。
然而,如果应用的客户端和服务端之间频繁通信且实时性要求较高(例如,实时数据传输、低延迟处理等),则需要考虑更多因素。此时,NIO 模型是否会导致延迟?单个服务节点是否能够支持如此频繁的连接?是否需要分散负载,使用多个服务节点来提高并发能力?
题外话:为什么NIO会有延迟?
NIO的设计特点是一个Worker线程负责管理多个Socket连接的通信。假设一个Worker线程同时处理10个Socket连接,当这10个Socket同时收到数据包时,处理顺序就会依赖于它们的到达顺序。在这种情况下,最后一个接收到数据包的Socket必须等待前面9个数据包的解析和分发,因此会有一定的延迟。
然而,在大多数实际业务场景中,多个Socket同时接收数据的情况并不常见。而且,即使存在延迟,它通常也不会对业务产生显著影响,延迟水平通常在可接受的范围内。
总结
一个服务端进程能同时连接的 socket 数量不仅取决于端口数,而是受文件描述符、内存、线程等资源的限制。通过调整系统配置和优化架构,服务端可以高效地管理大量连接。但在高频繁通信的场景下,可能需要进一步考虑架构优化,例如使用 NIO 处理延迟,或通过分布式架构分散负载,确保系统能够承载高并发的连接。
【杂谈】服务端能同时处理多少个 Socket 连接?背后的资源与限制分析的更多相关文章
- .net core 3.0 Signalr - 07 业务实现-服务端 自定义管理组、用户、连接
Hub的管理 重写OnConnectedAsync 从连接信息中获取UserId.Groups,ConnectId,并实现这三者的关系,存放于redis中 代码请查看 using CTS.Signal ...
- TCP/UDP简易通信框架源码,支持轻松管理多个TCP服务端(客户端)、UDP客户端
目录 说明 TCP/UDP通信主要结构 管理多个Socket的解决方案 框架中TCP部分的使用 框架中UDP部分的使用 框架源码结构 补充说明 源码地址 说明 之前有好几篇博客在讲TCP/UDP通信方 ...
- [笨木头FireFly01]入门篇1·最简单的服务端和客户端连接
原地址:http://www.9miao.com/question-15-53938.html 最近一直在写游戏,几乎没有来写教程了,打算放慢一下脚步,学学新东西.那为嘛我要学FireFly呢? 之前 ...
- FireFly 服务端 Unity3D黑暗世界 客户端 问题
启动服务端成功截图: 连接成功截图: 测试服务端是否启动成功: 在Web输入:http://localhost:11009/ 按回车 (查看cmd启动的服务端 是否多出如下显示) 服务端启动成功.P ...
- 《UNIX网络编程》之多客户连接服务端,可重用套接字对
该网络编程之客户端与服务端程序模板支持: 1. 多客户端同时连接服务端,即服务程序可以同时为多个客户端服务: 2. 服务端支持套接字对重用,即即使处于TIME_WAIT状态,仍可支持服务端重启: 3. ...
- [Java聊天室server]实战之五 读写循环(服务端)
前言 学习不论什么一个稍有难度的技术,要对其有充分理性的分析,之后果断做出决定---->也就是人们常说的"多谋善断":本系列尽管涉及的是socket相关的知识,但学习之前,更 ...
- .NET 即时通信,WebSocket服务端实例
即时通信常用手段 1.第三方平台 谷歌.腾讯 环信等多如牛毛,其中谷歌即时通信是免费的,但免费就是免费的并不好用.其他的一些第三方一般收费的,使用要则限流(1s/限制x条消息)要么则限制用户数. 但稳 ...
- 编写一个简单的TCP服务端和客户端
下面的实验环境是linux系统. 效果如下: 1.启动服务端程序,监听在6666端口上 2.启动客户端,与服务端建立TCP连接 3.建立完TCP连接,在客户端上向服务端发送消息 4.断开连接 实现 ...
- Netty4 学习笔记之一:客户端与服务端通信 demo
前言 因为以前在项目中使用过Mina框架,感受到了该框架的强大之处.于是在业余时间也学习了一下Netty.因为Netty的主要版本是Netty3和Netty4(Netty5已经被取消了),所以我就直接 ...
- 解决有关flask-socketio中服务端和客户端回调函数callback参数的问题(全网最全)
由于工作当中需要用的flask_socketio,所以自己学习了一下如何使用,查阅了有关文档,当看到回调函数callback的时候,发现文档里都描述的不太清楚,最后终于琢磨出来了,分享给有需要的朋友 ...
随机推荐
- [30] CSP 加赛 1
A.小W与伙伴招募 考虑贪心,可以发现,每一天只需要优先选择价值低的即可 这种贪心思路有一个错误的扩展,就是先把 \(m\) 天的货一次性补齐再一次性买,这样做的问题在于有可能买到次日的货,而这样做是 ...
- LeetCode 1388. Pizza With 3n Slices(3n 块披萨)(DP)
给你一个披萨,它由 3n 块不同大小的部分组成,现在你和你的朋友们需要按照如下规则来分披萨: 你挑选 任意 一块披萨.Alice 将会挑选你所选择的披萨逆时针方向的下一块披萨.Bob 将会挑选你所选择 ...
- MySQL故障诊断常用方法手册(含脚本、案例)
当你在使用MySQL数据库时,突然遇到故障,你是否会感到迷茫? ● 数据库响应变慢.SQL慢.数据库插入出现延时-- ● 表不见了.日志出现多个断连记录-- ● 非法断电造成MySQL启动报错.同步复 ...
- manim边做边学--有向图
有向图和上一篇介绍的无向图基本一样,唯一的区别在于有向图的边有方向性,它表示的是顶点之间的单向或依赖关系. 有向图G一般表示为:G=<V,E>.和无向图一样,V是顶点集合,E是边的集合. ...
- Kali Linux 各版本开启ssh 服务
Kali Linux 各版本开启ssh 服务 2019版kali Linux SSH链接办法 修改kali关于SSH服务默认配置并重启SSH服务,步骤如下: 打开sshd_config文件 leafp ...
- what can i say?
今天也是打了一场让我GG的考试 首先来个炸裂的: 全场唯一爆0的,堪称MVP what can i say 赛时一共交了三遍,就最后一遍GG了. 分析一下原因吧: wa的码: #include< ...
- KubeSphere 社区双周报| 2024.08.02-08.15
KubeSphere 社区双周报主要整理展示新增的贡献者名单和证书.新增的讲师证书以及两周内提交过 commit 的贡献者,并对近期重要的 PR 进行解析,同时还包含了线上/线下活动和布道推广等一系列 ...
- buck电路 & boost电路
buck电路 buck电路是直流的降压电路,我们下面给大家讲下,如何把12V的直流电压降压成5V的直流电压 1.buck电路拓扑:12V----->5V 2.降压原理 a.开关闭合,电流走向 电 ...
- 13-1 c++拷贝控制:拷贝赋值与销毁
定义一个类时,我们必须对它进行拷贝控制,即控制该类在进行拷贝.赋值.移动和销毁时要进行哪些操作 一个类通过五个特殊的成员函数进行拷贝控制 拷贝构造函数 拷贝赋值函数 移动构造函数 移动赋值函数 析构函 ...
- Lua语法基础教程(上篇)
今天我们来学习Lua语法基础教程.由于篇幅过长,将分为上中下三篇进行讲解,本篇为上篇. 一.初识Lua Lua 是一种轻量小巧的脚本语言,它用标准C语言编写并以源代码形式开放.这意味着什么呢?这意味着 ...