EMQX怎么调优操作系统网络内核以承受单机百万MQTT终端长连接

老芳姑娘_2677

老芳姑娘_2677

2026-11-04

991人浏览

原创

必须设为1048576,因EMQX每个MQTT长连接至少占2个文件描述符,百万连接需200万fd,而默认ulimit -n仅1024,不调则触发EMFILE错误导致新连接全拒。

emqx怎么调优操作系统网络内核以承受单机百万mqtt终端长连接

为什么 ulimit -n 必须设到 1048576

EMQX 每个 MQTT 长连接至少占用 2 个文件描述符(TCP socket + Erlang port),百万连接意味着至少 200 万 fd。但 Linux 进程级限制 ulimit -n 默认只有 1024,不改就直接报 accept: EMFILE 错误,新连接全被拒绝。

必须同时设置三处:

  • /etc/security/limits.conf 中添加:* soft nofile 1048576 和 * hard nofile 1048576
  • /etc/systemd/system.conf 中设置:DefaultLimitNOFILE=1048576(否则 systemd 启动的 emqx 服务会继承默认值)
  • Docker Compose 的 ulimits.nofile 必须显式写为 1048576,不能只靠宿主机 limits

net.core.somaxconn 和 tcp_max_syn_backlog 怎么配才不丢连接

这两个参数控制 TCP 连接建立阶段的队列长度。当客户端并发建连(比如每秒 1000 个新连接),如果队列太小,SYN 包会被内核直接丢弃,现象是客户端 connect timeout 或 RST,而 EMQX 日志里看不到任何接入痕迹。

推荐值(缺一不可):

  • net.core.somaxconn = 32768:全连接队列上限(已完成三次握手、等待 accept() 的连接)
  • net.ipv4.tcp_max_syn_backlog = 16384:半连接队列上限(收到 SYN、未完成握手的连接)
  • net.core.netdev_max_backlog = 16384:网卡收包队列,防止高并发时软中断丢包

注意:这些必须写进 /etc/sysctl.conf 并执行 sysctl -p 生效;Docker 容器内无法覆盖,得在宿主机调。

tcp_rmem/wmem 设置太大反而导致内存 OOM

EMQX 大量长连接下,每个 socket 的读写 buffer 累积起来非常可观。把 net.core.rmem_max 设成 16777216(16MB)看似合理,但实际每个连接未必用满——多数 MQTT 心跳包只有几字节,却仍按 max 分配页框,极易触发 OOM Killer 杀掉 emqx 进程。

协同养育操作系统
协同养育操作系统

协同养育操作系统(Co-Parenting OS)— 离异家庭专业协同养育支持系统。12模块覆盖接送管理、成长记忆库、孩子观察站、亲子关系粘合剂、共同挑战中心、情绪冲突观察、父母成长、成长档案馆、成长阶段引擎、风险预警、驾驶舱、被恶意攻击急救包。当用户涉及离异家庭育儿、协同养育、抚养探视、接送安排、孩子成长记录、亲子关系、离异冲突、被恶意攻击、前任矛盾等话题时触发。

下载

更稳妥的做法是收紧默认值,靠动态扩缩容:

  • net.core.rmem_default = 262144(256KB)
  • net.core.wmem_default = 262144
  • net.ipv4.tcp_rmem = "1024 4096 262144"(min/default/max)
  • net.ipv4.tcp_wmem = "1024 4096 262144"

这样既满足突发消息,又避免静态分配浪费;实测 100 万连接下内存节省 12GB+。

nf_conntrack_max 不设够会导致连接被静默重置

Linux 默认 nf_conntrack_max 只有 65536,远低于百万连接需求。一旦打满,内核 netfilter 会开始丢弃新连接的 conntrack entry,表现为客户端偶发 RST、重连失败,EMQX 日志无异常,ss -s 却显示大量 tw 状态连接堆积。

必须设置:

  • net.nf_conntrack_max = 1000000
  • net.netfilter.nf_conntrack_max = 1000000
  • net.netfilter.nf_conntrack_tcp_timeout_time_wait = 30(缩短 TIME-WAIT 持续时间)

注意:net.ipv4.tcp_tw_reuse 和 tcp_tw_recycle 在 NAT 环境下禁用,否则设备端可能收不到 ACK,直接断连——这点最容易被忽略,且故障难复现。

相关专题

更多
视频服务器配置参数有哪些
视频服务器配置参数有哪些

视频服务器配置参数有处理器、内存、存储、视频编解码器、网络接口、视频输入输出接口、操作系统、安全性、环境适应性和成本。在搭建视频服务器时,需要根据实际需求和预算,合理选择这些参数,以实现高性能、高稳定性和低成本的目标。

2023.10.17

5160

11

linux的操作系统介绍
linux的操作系统介绍

Linux是一个灵活、稳定、安全的操作系统,适用于各种不同的应用场景,从个人电脑到服务器和嵌入式系统。想了解更多Linux的相关内容,可以阅读本专题下面的文章。

2024.03.20

3986

12

Linux操作系统的主要用途
Linux操作系统的主要用途

Linux操作系统用途广泛,包括:服务器运营,软件开发,科学研究和教育,嵌入式系统,以及个人电脑和笔记本电脑。想了解更多Linux的相关内容,可以阅读本专题下面的文章。

2024.03.21

7179

8

linux操作系统的作用
linux操作系统的作用

linux操作系统在以下领域发挥着关键作用:服务器和云计算;嵌入式系统;个人电脑和笔记本电脑;超级计算;其他领域等等。想了解更多linux操作系统的相关内容,可以阅读本专题下面的文章。

2024.04.12

3315

5

有哪些常见的网络操作系统
有哪些常见的网络操作系统

常见的网络操作系统有windows server、linux、unix、macos server、freebsd、cisco ios、juniper junos和hp-ux等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.09.12

3904

6

32位操作系统怎么改成62位的
32位操作系统怎么改成62位的

要将 32 位操作系统升级到 64 位,需要遵循以下步骤:1. 检查硬件和软件兼容性;2. 备份数据;3. 获取 64 位操作系统;4. 创建可启动安装媒体;5. 从安装媒体启动计算机;6. 选择“升级”选项;7. 完成安装。

2025.04.02

3683

9

Docker Desktop怎么设置端口映射
Docker Desktop怎么设置端口映射

本专题聚焦Docker Desktop容器端口映射与访问配置,整理从创建容器、设置端口绑定到验证本地服务访问的操作流程。针对端口被占用、映射配置错误、容器服务无法访问等情况,也提供相应的检查方向,方便用户完成端口配置。

2026.11.03

0

18

Docker Desktop镜像构建教程
Docker Desktop镜像构建教程

想使用Docker Desktop将本地项目构建成Docker镜像?本专题围绕镜像构建的实际操作展开,介绍Dockerfile编写、构建命令使用、镜像标签设置和构建日志查看等内容,同时整理镜像无法生成、依赖安装失败及构建缓存异常等问题的排查思路。

2026.11.03

0

11

Docker Desktop容器创建指南
Docker Desktop容器创建指南

本专题聚焦Docker Desktop容器创建与运行配置,介绍通过本地镜像或远程镜像创建容器的方法,以及容器启动、终端访问、日志查看和基础管理等操作。针对端口冲突、参数配置不当、容器无法启动等情况,也整理了相应的排查方向。

2026.11.03

0

11

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Docker Desktop设置与维护手册
Docker Desktop设置与维护手册

共0课时 | 0人学习

Valgrind支持平台说明
Valgrind支持平台说明

共0课时 | 0人学习

ubuntu官方总文档
ubuntu官方总文档

共0课时 | 0人学习