You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何提升Azure容器实例上Paho-MQTT发布者数量(Locust负载测试)

解决Azure容器实例(ACI)中Locust MQTT负载测试的"Too many open files"问题

问题现状

使用Azure容器实例结合Python Paho-MQTT库运行分布式Locust MQTT负载测试时,每个worker节点最多仅能运行340个客户端,触发以下错误:

OSError: [Errno 24] Too many open files.

该问题与Paho-MQTT官方仓库的两个已知议题相关(涉及文件描述符占用过高的机制问题)。

已尝试的无效/受限操作

  • Docker环境可通过--ulimit参数修改文件打开软硬限制,但ACI不支持此类Docker运行时参数
  • 修改ACI入口点,通过bash脚本提升软限制:
ulimit -Sn 10000
locust
  • 在locustfile.py中添加资源限制代码:
import resource
resource.setrlimit(resource.RLIMIT_NOFILE, (200000, 200000))
  • 尝试修改系统级文件描述符上限,因权限不足失败:
sudo sysctl -w fs.file-max=500000
sysctl -p

可行解决办法

1. 在容器镜像构建阶段预设文件描述符限制

ACI不支持运行时修改系统级限制,但可以在构建Docker镜像时提前配置:

  • 在Dockerfile中添加以下指令,全局设置文件描述符的软硬限制:
# 切换到root用户配置限制
USER root
RUN echo "* soft nofile 100000" >> /etc/security/limits.conf
RUN echo "* hard nofile 200000" >> /etc/security/limits.conf
# 如需生效pam限制,Debian/Ubuntu系基础镜像需安装依赖包
RUN apt-get update && apt-get install -y libpam-modules
# 切换回普通用户运行Locust(若镜像原本使用非root用户)
USER locust-user
  • 同时在镜像的ENTRYPOINT脚本中,启动Locust前再次确认软限制:
#!/bin/bash
ulimit -Sn 100000
exec locust "$@"

2. 优化Paho-MQTT客户端配置

针对Paho-MQTT的文件描述符占用问题,调整客户端初始化参数:

  • 启用clean_session=False,减少不必要的连接资源消耗
  • 升级Paho-MQTT到最新稳定版,修复已知的资源泄漏问题
  • 在Locust的用户类中,确保客户端连接关闭时正确释放资源(比如在on_stop方法中调用client.disconnect())

3. 调整Locust运行策略

  • 拆分负载到更多ACI worker实例:如果单worker的文件描述符上限无法突破,增加worker节点数量,分布式分担客户端连接数
  • 调整Locust的--max-wait和--min-wait参数,避免短时间内创建大量连接,平滑资源占用

4. 使用特权模式(谨慎操作)

如果上述方法无效,可尝试将ACI容器配置为特权模式(需注意安全风险),此时容器拥有更多系统权限,可能允许修改sysctl参数:
在Azure部署ACI的配置中,设置privileged: true(通过Azure CLI或ARM模板),之后即可在启动脚本中执行sysctl命令调整系统级文件描述符上限。

内容的提问来源于stack exchange,提问作者Joan Flotats

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 08:30:57