【杂谈】服务端能同时处理多少个 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的时候,发现文档里都描述的不太清楚,最后终于琢磨出来了,分享给有需要的朋友 ...
随机推荐
- balance_dirty_pages_ratelimited分析
balance_dirty_pages_ratelimited分析 nr_dirtied_pause:当前task的脏页门限: dirty_exceeded:全局的脏页数超过门限或者该bdi的脏页数超 ...
- Android Perfetto 系列 2:Perfetto Trace 抓取
使用 Perfetto 分析问题跟使用 Systrace 分析问题的步骤是一样的: 首先你需要抓取 Perfetto 文件 在ui.perfetto.dev 中打开 Trace 文件进行分析或者使用命 ...
- Windows10 安装使用 Docker
Windows10 安装使用 Docker 下载安装 Docker Desktop https://docs.docker.com/docker-for-windows/install/ 点击运行 D ...
- 【异常处理】Assistive Technology not found: com.sun.java.accessibility.AccessBridge
十一回来之后,工作电脑上的抓包工具Charles突然启动不起来了,双击图标后,一闪而过,就没动静了. 不知道是不是因为之前安装了什么工具.软件引起的. 打开CMD命令行,跳转到目录下启动,提示:Ass ...
- 云原生爱好者周刊:为 DevOps 流水线准备的 macOS 虚拟化工具
开源项目推荐 Tart Tart 是一个虚拟化工具集,用于构建.运行和管理 Apple Silicon 芯片 macOS 上的虚拟机,主要目的是为 CI 流水线的特殊任务提供运行环境.主要亮点: 使用 ...
- 高性能 Nginx HTTPS 调优 - 如何为 HTTPS 提速 30%
为什么要优化 Ngin HTTPS 延迟 Nginx 常作为最常见的服务器,常被用作负载均衡 (Load Balancer).反向代理 (Reverse Proxy),以及网关 (Gateway) 等 ...
- ToDesk云电脑性能如何?价格划算吗?
云电脑是最近兴起的一种新型计算机形态.当用户面临电脑配置太低,无法顺畅打开大型软件,满足不了日常玩游戏或者高性能渲染,这时候你只需要租借一个高配置的云电脑. 不需要额外购入任何设备,在原来的电脑上下载 ...
- FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
ijkplayer是一款由B站研发的移动端国产播放器,它基于FFmpeg3.4版本,同时兼容Android和iOS两大移动操作系统.ijkplayer的源码托管地址为https://github.co ...
- Python3 编程面试题
Python global 语句的作用 lambda 匿名函数好处 Python 错误处理 Python 内置错误类型 简述 any() 和 all() 方法 Python 中什么元素为假? 提高 P ...
- 轻量级网络-ShuffleNetv2 论文解读
摘要 1.介绍 2.高效网络设计的实用指导思想 G1-同样大小的通道数可以最小化 MAC G2-分组数太多的卷积会增加 MAC G3-网络碎片化会降低并行度 G4-逐元素的操作不可忽视 3.Shuff ...