一个服务端进程能同时连接多少个 Socket?

要理解一个服务端进程能同时支持多少个连接,首先我们需要明确一个 socket 连接 的表示方式。一个连接由四个部分组成:[LocalIP:LocalPort:RemoteIP:RemotePort]。对于服务端进程来说,LocalIPLocalPort 是固定的,而 RemoteIPRemotePort 则是可以变化的。思考一下,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 连接。通过 selectepoll 等机制,NIO 模型可以高效地选择需要处理的 socket 连接。

通常,worker 线程的数量是固定的,并不需要太多,20 个左右就足够。这些 worker 线程负责处理接收到的数据包,然后将完整的数据包交给应用层的线程池,后者负责执行实际的业务逻辑。

连接数 ≠ 并发量:一个服务端进程能应付多少个 socket 通信?

实际应用中,连接数并不等于并发量。并发量指的是同一时刻正在进行数据交换的连接数,而连接数指的是总的连接数。

一个服务端进程可以管理大量的 socket 连接,但如果每个连接的通信频率较低(例如,物联网设备的定时数据上报、偶尔发送指令等),那么即使连接数很高,系统也可以轻松应对。

例如,在一个物联网平台中,设备定期上报数据,偶尔发送异常报告或接收指令,这种应用场景下,服务端能管理的连接数和通信量通常没有太大压力。

然而,如果应用的客户端和服务端之间频繁通信且实时性要求较高(例如,实时数据传输、低延迟处理等),则需要考虑更多因素。此时,NIO 模型是否会导致延迟?单个服务节点是否能够支持如此频繁的连接?是否需要分散负载,使用多个服务节点来提高并发能力?

题外话:为什么NIO会有延迟?

NIO的设计特点是一个Worker线程负责管理多个Socket连接的通信。假设一个Worker线程同时处理10个Socket连接,当这10个Socket同时收到数据包时,处理顺序就会依赖于它们的到达顺序。在这种情况下,最后一个接收到数据包的Socket必须等待前面9个数据包的解析和分发,因此会有一定的延迟。

然而,在大多数实际业务场景中,多个Socket同时接收数据的情况并不常见。而且,即使存在延迟,它通常也不会对业务产生显著影响,延迟水平通常在可接受的范围内。

总结

一个服务端进程能同时连接的 socket 数量不仅取决于端口数,而是受文件描述符、内存、线程等资源的限制。通过调整系统配置和优化架构,服务端可以高效地管理大量连接。但在高频繁通信的场景下,可能需要进一步考虑架构优化,例如使用 NIO 处理延迟,或通过分布式架构分散负载,确保系统能够承载高并发的连接。

【杂谈】服务端能同时处理多少个 Socket 连接?背后的资源与限制分析的更多相关文章

  1. .net core 3.0 Signalr - 07 业务实现-服务端 自定义管理组、用户、连接

    Hub的管理 重写OnConnectedAsync 从连接信息中获取UserId.Groups,ConnectId,并实现这三者的关系,存放于redis中 代码请查看 using CTS.Signal ...

  2. TCP/UDP简易通信框架源码,支持轻松管理多个TCP服务端(客户端)、UDP客户端

    目录 说明 TCP/UDP通信主要结构 管理多个Socket的解决方案 框架中TCP部分的使用 框架中UDP部分的使用 框架源码结构 补充说明 源码地址 说明 之前有好几篇博客在讲TCP/UDP通信方 ...

  3. [笨木头FireFly01]入门篇1·最简单的服务端和客户端连接

    原地址:http://www.9miao.com/question-15-53938.html 最近一直在写游戏,几乎没有来写教程了,打算放慢一下脚步,学学新东西.那为嘛我要学FireFly呢? 之前 ...

  4. FireFly 服务端 Unity3D黑暗世界 客户端 问题

    启动服务端成功截图: 连接成功截图: 测试服务端是否启动成功: 在Web输入:http://localhost:11009/  按回车 (查看cmd启动的服务端 是否多出如下显示) 服务端启动成功.P ...

  5. 《UNIX网络编程》之多客户连接服务端,可重用套接字对

    该网络编程之客户端与服务端程序模板支持: 1. 多客户端同时连接服务端,即服务程序可以同时为多个客户端服务: 2. 服务端支持套接字对重用,即即使处于TIME_WAIT状态,仍可支持服务端重启: 3. ...

  6. [Java聊天室server]实战之五 读写循环(服务端)

    前言 学习不论什么一个稍有难度的技术,要对其有充分理性的分析,之后果断做出决定---->也就是人们常说的"多谋善断":本系列尽管涉及的是socket相关的知识,但学习之前,更 ...

  7. .NET 即时通信,WebSocket服务端实例

    即时通信常用手段 1.第三方平台 谷歌.腾讯 环信等多如牛毛,其中谷歌即时通信是免费的,但免费就是免费的并不好用.其他的一些第三方一般收费的,使用要则限流(1s/限制x条消息)要么则限制用户数. 但稳 ...

  8. 编写一个简单的TCP服务端和客户端

    下面的实验环境是linux系统. 效果如下: 1.启动服务端程序,监听在6666端口上  2.启动客户端,与服务端建立TCP连接  3.建立完TCP连接,在客户端上向服务端发送消息 4.断开连接 实现 ...

  9. Netty4 学习笔记之一:客户端与服务端通信 demo

    前言 因为以前在项目中使用过Mina框架,感受到了该框架的强大之处.于是在业余时间也学习了一下Netty.因为Netty的主要版本是Netty3和Netty4(Netty5已经被取消了),所以我就直接 ...

  10. 解决有关flask-socketio中服务端和客户端回调函数callback参数的问题(全网最全)

    由于工作当中需要用的flask_socketio,所以自己学习了一下如何使用,查阅了有关文档,当看到回调函数callback的时候,发现文档里都描述的不太清楚,最后终于琢磨出来了,分享给有需要的朋友 ...

随机推荐

  1. Sketch Measure切图插件无法导出标注 (换插件绕过解决)

    环境 MacOS 10.15+ sketch版本 69.2 插件版本 2.8.1 遇到的问题 导出标注卡死 更新版本无解,到插件的github issue中找到解决方法 使用MeaXure插件,git ...

  2. SimpleAIAgent:使用免费的glm-4-flash即可开始构建简单的AI Agent应用

    SimpleAIAgent是基于C# Semantic Kernel 与 WPF构建的一款AI Agent探索应用.主要用于使用国产大语言模型或开源大语言模型构建AI Agent应用的探索学习,希望能 ...

  3. [TK] CF1526B I Hate 1111

    给定一个数,将它表示成若干个形如 \(11,111,1111\cdots\) 之类的数之和,判断有没有可行解 考虑到一种贪心,即从高位开始依次向下减去每位数字,判断还能不能减动,减不动或者没减完就报告 ...

  4. Epic Games Launcher 提示 应用程序无法正常启动(0xc000007b)

    事件起因: 在给某同事安装Epic Games Launcher报错, 提示 应用程序无法正常启动(0xc000007b) 解决办法: 用DirectX修复工具扫一下,修复一下C++插件,一般是由于 ...

  5. WeiXin.Export.20220726

    用 QuestPDF操作生成PDF更快更高效! Blazor Server 应用程序中进行 HTTP 请求 开源WPF控件库-AdonisUI FastTunnel-开源内网穿透框架 AI 之 Ope ...

  6. 云原生周刊:一条 Kubernetes 命令引发的悲剧

    开源项目 KSail 用于在 Docker 中配置支持 GitOps 的 K8s 集群的 CLI 工具. nginx-gateway-fabric NGINX Gateway Fabric 是一个开源 ...

  7. 使用 KubeKey v3.1.1 离线部署原生 Kubernetes v1.28.8 实战

    今天,我将为大家实战演示,如何基于操作系统 openEuler 22.03 LTS SP3,利用 KubeKey 制作 Kubernetes 离线安装包,并实战离线部署 Kubernetes v1.2 ...

  8. 使用 vscode 编译+运行 typescropt Mac win同理

    一..d.ts文件最好在src/typings 目录下,可在tsconfig.json 文件配置 二.vs 监听文件变化,自动编译ts文件 tsconfig.json { "compiler ...

  9. [离线计算-Spark|Hive] HDFS小文件处理

    背景 HDFS 小文件过多会对hadoop 扩展性以及稳定性造成影响, 因为要在namenode 上存储维护大量元信息. 大量的小文件也会导致很差的查询分析性能,因为查询引擎执行查询时需要进行太多次文 ...

  10. Air780E量产binpkg文件如何获取

    ​ 今天我们学习Air780E量产binpkg文件如何获取: 一.背景 最近luatos开发客户增多,客户在量产烧录的时候需要binpkg文件,但是有些客户不知道binpkg文件是什么,在哪里获取,是 ...