一个服务端进程能同时连接多少个 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. 配置 ZRAM,实现 Linux 下的内存压缩,零成本低开销获得成倍内存扩增

    由于项目需求,笔者最近在一台 Linux 服务器上部署了 ElasticSearch 集群,却发现运行过程中经常出现查询速度突然降低的问题,登录服务器后发现是物理内存不足,导致机器频繁发生页面交换.由 ...

  2. 更强的RAG:向量数据库和知识图谱的结合

    传统 RAG 的局限性 经典的 RAG 架构以向量数据库(VectorDB)为核心来检索语义相似性上下文,让大语言模型(LLM)不需要重新训练就能够获取最新的知识,其工作流如下图所示: 这一架构目前广 ...

  3. 介绍一下 websocket

    一般的http请求都是短连接,而webpack的使用可以建立长连接 : 什么是 websocket websocket 是一种网络通信协议,是 HTML5 开始提供的一种在单个 TCP 连接上进行全双 ...

  4. slot原理

    vue提供组件插槽能力, 允许开发者在封装组件时,把不确定的部分定义为插槽 : 作用:再不确定的内容位置占位,在子组件内使用 slot 标签写占位的内容 : 插槽的分类 : 默认插槽: 具名插槽:使用 ...

  5. 如何在Windows 11系统中将任意文件(如bat/log等)固定在开始菜单?

    在Windows 11系统中,默认只支持将.exe/文件夹/.zip固定在开始菜单,如果想将其他文件如.bat/.log等文件固定在开始菜单将在右键菜单中找不到选项. 一个更简单的办法: 对任意文件右 ...

  6. linux环境nginx配置记录

    nginx环境安装 1.联网下载 pcre压缩包 解压压缩文件使用命令 tar –xvf pcre-8.37.tar.gz ./configure 完成后,回到 pcre 目录下执行 make,最后执 ...

  7. uni-app H5 腾讯地图无法导航

    uni-app 打包H5腾讯地图无法导航 具体使用扫描二维码查看 前言: 最近几天用uni-app开发安卓和iOS应用,打包成APP安装包后,APP内做地图导航没有问题,APP内使用的是高德地图:但是 ...

  8. Python实现微博舆情分析的设计与实现

    引言 随着互联网的发展,社交媒体平台如微博已经成为公众表达意见.分享信息的重要渠道.微博舆情分析旨在通过大数据技术和自然语言处理技术,对微博上的海量信息进行情感分析.热点挖掘和趋势预测,为政府.企业和 ...

  9. EXCEL获取拼音首字母

    Excel 2016 按组合键ALT+F11调出VB窗口--插入--模块(复制代码到新模块中,复制完后始可关闭VB窗口) 复制以下代码到模块中 Function getpychar(char) tmp ...

  10. 如何阅读 CPU 电路图(以 6502 为例)

    开篇 你是否曾对 CPU 的工作原理充满好奇,以及简单的晶体管又是如何组成逻辑门,进而构建出复杂的逻辑电路实现?本文将以知名的 6502 CPU 的电路图为例,介绍如何阅读 CPU 电路图,并向你演示 ...