memory-management - MQTT 代理 - CPU 和内存使用过多
问题描述
我有一个 MQTT(Mosquitto) 服务在生产站点的 docker 容器中运行(托管在 AWS EC2 上)。在容器中运行它的原因是为了确保可移植性,因为我们在多个地方使用此服务。
最近,我们一直在观察 MQTT 随着时间的推移,开始消耗大量资源(CPU 和内存),结果发现我们开始丢失通过 QoS 1 通过 MQTT 传输的信息。为了解决这个问题,已经尝试了以下方法:
- 删除 MQTT 代理使用的持久性文件
- 删除完整的 MQTT 卷
- 重启容器
上述步骤似乎暂时有效,但并不能完全解决问题。我们还进一步增加了可用于 MQTT(EC2 CPU 和内存)的资源数量,但与上述步骤类似,似乎只是将问题推回,而不是解决问题。
你能建议我们解决这个问题的方法吗?此外,如果有人可以建议如何分析 MQTT 代理,对于堆使用、主题、客户端、断开/连接等,这将是有帮助的。
目前,我们使用以下 MQTT 配置文件:
# mount to /mosquitto/config/mosquitto.conf
# sys_interval 60
persistence true
persistence_location /mosquitto/data/
# This causes every change to trigger retained data save
autosave_interval 60
queue_qos0_messages true
store_clean_interval 20
max_queued_messages 100000
max_inflight_messages 10000
allow_anonymous false
password_file /etc/mosquitto/conf.d/passwd
acl_file /etc/mosquitto/conf.d/acl
connection_messages true
log_dest stdout
persistent_client_expiration 1h
注意:我们用来连接 MQTT 代理的客户端是用 NodeJS 和 Python 编写的。对于所有客户端,我们将 clean-session 选项传递为true
.
在 Mosquitto 服务器上运行以下命令:
mosquitto --help
收到的响应是:
mosquitto version 1.4.12 (build date 2017-06-01 13:03:46+0000)
mosquitto is an MQTT v3.1.1/v3.1 broker.
解决方案
推荐阅读
- sql - 如果 select 语句返回任何行,Redshift SQL 语句将返回 1 或 0
- vue.js - filter query param not working through axios get from my vue js application?
- highcharts - Highchart yAxis.ceiling 无法正常工作
- python - 使用 Numpy 时收到带有满秩矩阵的错误消息“LinAlgError:奇异矩阵”
- python - 如何取消pyspark foreachPartition操作
- kubernetes - Terraform - Kubernetes - Helm 发布 - 生成密码
- node.js - 当人们说 KOA2 时,他们到底在说什么?
- python - 我可以使用 Popen 以交互方式将命令传递和读取到被调用的进程吗?
- curl - 为不存在的地址 mitmproxy 拦截 https 的问题
- python - 抽象模型中的 django datetimefield 无法更新“auto_now_add”、“auto_now”