讲师中心 微信公众号
AI工具推荐 视频效率加速

WebSocket连接限制如何突破 WebSocket高并发百万级连接优化【干货】

夜婷姑娘_3876

夜婷姑娘_3876

发布时间:2026-05-27 07:31:47

|

369人浏览过

|

来源于php中文网

原创

百万WebSocket连接需突破三道硬门槛:一是ulimit -n调至1048576避免EMFILE;二是nf_conntrack_max设为2621440防丢包;三是换用gobwas/ws+epoll事件循环,复用缓冲区并消除goroutine风暴。

websocket连接限制如何突破 websocket高并发百万级连接优化【干货】

靠默认配置和通用库(比如 gorilla/websocket)根本撑不到百万连接——不是代码写得不够好,而是系统资源早被耗尽、内核机制直接拦在门外。真正卡脖子的从来不是业务逻辑,是文件描述符、连接跟踪表、缓冲区分配这三道硬门槛。

ulimit -n 不调到 1048576,accept() 就会持续返回 EMFILE

每个 WebSocket 连接对应一个 socket 文件描述符,Linux 默认 ulimit -n 是 1024,连 1 万都撑不住。不改这个,服务启动后新连接全被拒绝,日志里反复出现 accept: too many open files。

  • 临时生效:运行前执行 ulimit -n 1048576,再启动 Go 或 Node.js 进程
  • 永久生效:往 /etc/security/limits.conf 加两行:* soft nofile 1048576 和 * hard nofile 1048576
  • 注意:如果用 systemd 启动服务,还得在 service 文件里加 LimitNOFILE=1048576,否则 limits.conf 不生效
  • 验证是否到位:启动后进进程里执行 cat /proc/$(pidof yourserver)/limits | grep "Max open files"

nf_conntrack_max 不设到 2621440,conntrack 表一满就丢包

Linux 内核用 nf_conntrack 模块跟踪每个 TCP 连接状态。WebSocket 长连接不会快速释放,但默认 nf_conntrack_max 通常只有 65536 左右。一旦打满,内核开始丢包,现象是客户端频繁重连、握手失败,dmesg 里刷出 nf_conntrack: table full, dropping packet。

WebSocket 8.18.2
WebSocket 8.18.2

WebSocket 8.18.2 是该协议规范的一个重要迭代版本,主要优化了连接稳定性与数据传输效率。它通过全双工通信机制,允许客户端与服务器在单一长连接上实时交换数据,大幅降低传统 HTTP 轮询的开销。该版本增强了心跳保活、自动重连及二进制帧传输能力,适用于即时通讯、在线游戏及金融行情推送等低延迟场景,为开发者提供更可靠的实时网络交互基础。

下载
  • 临时改:执行 echo 2621440 > /proc/sys/net/netfilter/nf_conntrack_max
  • 永久改:在 /etc/sysctl.conf 加一行 net.netfilter.nf_conntrack_max = 2621440,再运行 sysctl -p
  • 确认模块已加载:lsmod | grep nf_conntrack,没输出就得先 modprobe nf_conntrack
  • 别漏掉清理旧连接:echo 1 > /proc/sys/net/netfilter/nf_conntrack_tcp_be_liberal 可缓解 TIME_WAIT 占用

gorilla/websocket 换成 gobwas/ws,内存从 3.2GB 降到 860MB

gorilla/websocket 默认为每个连接 malloc 独立的读写缓冲区(各 4KB),100 万连接光缓冲区就吃掉 ~8GB 内存;更致命的是它强制配一个 goroutine 等着读,百万 goroutine 带来的是调度风暴,不是并发能力。

  • gobwas/ws 把缓冲区管理交还给应用层:用 sync.Pool 显式借还,连接之间复用同一块内存
  • 关键差异:ws.ReadFrame(conn, buf) 的 buf 是你传进去的,用完必须 put 回池;而 gorilla 的 ReadMessage 完全隐藏了 buffer 生命周期
  • 代价是 API 不兼容:要重写消息收发逻辑,不能直接套用现有 Upgrader 流程
  • 实测数据:100 万空连接下,goroutine 数量从百万级压到几百个,heap profile 显示对象分配锐减

epoll + 单线程事件循环才是百万连接的底层支撑

哪怕系统参数全调对、库也换了,如果还是“一个连接起一个 goroutine”,照样崩。Go 的 goroutine 虽轻量,但 100 万个仍占至少 200MB 栈空间,且调度器无法高效处理这种规模的抢占切换。

  • 真正的解法是绕过阻塞 I/O:用 epoll(Linux)或 kqueue(macOS)做多路复用,单 goroutine 监听数万连接的读写就绪事件
  • 项目 1m-go-websockets/4_optimize_gobwas/epoll.go 就是这么干的:syscall.EpollWait 返回就绪列表,挨个处理帧,不阻塞、不挂起
  • 这意味着你不能再依赖 conn.Read() 这类同步调用,所有读写必须基于事件回调+缓冲区复用
  • 别指望 runtime 自动优化——Go 的 net.Conn 默认走阻塞 syscall,必须用底层 syscall 或封装好的异步库(如 gobwas/ws 配合自定义 net.Conn 实现)

最常被跳过的一步:调完 ulimit 和 nf_conntrack_max 后,忘了改 net.ipv4.ip_local_port_range。客户端发起连接时需要本地端口,范围太窄会导致 connect: cannot assign requested address,尤其在压测机上高频建连时必现。

热门AI工具

更多
讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

相关专题

更多
C语言变量命名
C语言变量命名

c语言变量名规则是:1、变量名以英文字母开头;2、变量名中的字母是区分大小写的;3、变量名不能是关键字;4、变量名中不能包含空格、标点符号和类型说明符。php中文网还提供c语言变量的相关下载、相关课程等内容,供大家免费下载使用。

3589

2023.06.20

c语言入门自学零基础
c语言入门自学零基础

C语言是当代人学习及生活中的必备基础知识,应用十分广泛,本专题为大家c语言入门自学零基础的相关文章,以及相关课程,感兴趣的朋友千万不要错过了。

2428

2023.07.25

c语言运算符的优先级顺序
c语言运算符的优先级顺序

c语言运算符的优先级顺序是括号运算符 > 一元运算符 > 算术运算符 > 移位运算符 > 关系运算符 > 位运算符 > 逻辑运算符 > 赋值运算符 > 逗号运算符。本专题为大家提供c语言运算符相关的各种文章、以及下载和课程。

1380

2023.08.02

c语言数据结构
c语言数据结构

数据结构是指将数据按照一定的方式组织和存储的方法。它是计算机科学中的重要概念,用来描述和解决实际问题中的数据组织和处理问题。数据结构可以分为线性结构和非线性结构。线性结构包括数组、链表、堆栈和队列等,而非线性结构包括树和图等。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

1318

2023.08.09

c语言random函数用法
c语言random函数用法

c语言random函数用法:1、random.random,随机生成(0,1)之间的浮点数;2、random.randint,随机生成在范围之内的整数,两个参数分别表示上限和下限;3、random.randrange,在指定范围内,按指定基数递增的集合中获得一个随机数;4、random.choice,从序列中随机抽选一个数;5、random.shuffle,随机排序。

1416

2023.09.05

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

2338

2023.09.20

c语言get函数的用法
c语言get函数的用法

get函数是一个用于从输入流中获取字符的函数。可以从键盘、文件或其他输入设备中读取字符,并将其存储在指定的变量中。本文介绍了get函数的用法以及一些相关的注意事项。希望这篇文章能够帮助你更好地理解和使用get函数 。

3860

2023.09.20

c数组初始化的方法
c数组初始化的方法

c语言数组初始化的方法有直接赋值法、不完全初始化法、省略数组长度法和二维数组初始化法。详细介绍:1、直接赋值法,这种方法可以直接将数组的值进行初始化;2、不完全初始化法,。这种方法可以在一定程度上节省内存空间;3、省略数组长度法,这种方法可以让编译器自动计算数组的长度;4、二维数组初始化法等等。

18195

2023.09.22

Uvicorn 报错与问题解决教程
Uvicorn 报错与问题解决教程

本专题汇总了Uvicorn服务器常见问题与报错解决的教程合集,涵盖启动失败、端口占用、模块导入错误、事件循环冲突及热重载失效等典型故障的排查思路。同时整理了多进程与Worker配置、SSL/HTTPS证书报错、跨域与代理配置等实战解决方案,助你快速定位并解决Uvicorn运行中的各类问题。

0

2026.11.02

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WebSocket手册
WebSocket手册

共0课时 | 0人学习

Webman中文手册
Webman中文手册

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn