如何让Mqtt服务器支持超过65535个连接?

操作系统参数优化

编辑修改 /etc/sysctl.conf,增加以下内容:

# 这里开始优化mqtt服务器性能
# 内存分配策略
vm.overcommit_memory = 1
# 以下2个配置,设置系统全局最大文件句柄
fs.file-max = 1048576
# 注意,若nofile参数值大于nr_open参数值,会导致用户无法正常登录该实例
# 如果只是临时增加文件描述符的数量,只要执行echo 1048576 > /proc/sys/fs/nr_open
fs.nr_open = 1048576

# Tcp网络优化,并发连接优化
net.core.somaxconn = 32768
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.core.netdev_max_backlog = 16384

net.ipv4.tcp_max_syn_backlog = 16384
# 端口使用范围
net.ipv4.ip_local_port_range = 1024 65535

net.ipv4.tcp_wmem = 4096 87380 16777216
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_mem = 786432 2097152 3145728

执行sysctl -p刷新

设置sysctl vm.overcommit_memory=1是一种常见的方法。这个参数的含义是,当内存不足时,内核将允许进程继续申请内存,直到申请的总内存超过系统物理内存和swap空间的总和,这样就可以避免在申请内存时出现错误。

hard nofile参数值不可大于/proc/sys/fs/nr_open参数值,若nofile参数值大于nr_open参数值,则可能导致用户无法正常登录该实例。

设置服务的最大文件句柄

编辑修改 /etc/systemd/system.conf:

DefaultLimitNOFILE=1048576

设置用户的最大文件句柄、最大文件句柄数

编辑修改 /etc/security/limits.conf:

  • 原来:
root soft nofile 65535
root hard nofile 65535
* soft nofile 65535
* hard nofile 65535
  • 修改后:
# 所有用户设置软限制/硬限制为最多可以打开1048576个文件
# 注意,若nofile参数值大于nr_open参数值,会导致用户无法正常登录该实例
* soft nofile 1048576
* hard nofile 1048576
# 所有用户设置进程数的软限制/硬限制为1048576
* soft nproc 1048576
* hard nproc 1048576
对比(不执行)
  • 临时会话最大文件句柄(可不执行)

    ulimit -n 1048576

  • 此为永久性会话最大文件句柄配置

    * soft nofile 1048576
    * hard nofile 1048576

重启服务器

reboot

重启后查看之前配置是否生效

sysctl -a

这边可以看到fs.file-max = 1048576,说明已经生效

设置如果出问题,可以工单联系阿里工程师

设置如果出问题导致无法重启,可以工单联系阿里工程师
也可以通过将磁盘挂载成数据盘解决
https://help.aliyun.com/zh/ecs/how-do-i-restore-system-disk-data

另外,并不是说执行以上配置,您就一定可以让你的服务器支撑超过65536个tcp连接,跟服务器配置也有关系,这边实际碰到阿里云t5c1m2型号cpu,2核8GB内存,6万多就会发生问题,后面升级c7型号cpu,目前测试可以支撑16万纯连接(意思是只连接与心跳[120s]),如果加上客户端tps=400/s消息的话,建议15万以下,比较保守的建议是12万。

作者:一叶火  创建时间:2024-03-19 14:50
最后编辑:一叶火  更新时间:2024-12-25 15:33