Mosquitto动态安全插件创建dynamic-security.json报错内存不足如何调试
调试方案
该报错属于内存分配失败范畴,和你排查的磁盘存储空间无关,可按以下步骤逐步定位:
1 排查系统内存限制
- 执行
ulimit -a查看当前shell的资源限制,重点核对max memory size、virtual memory两项的阈值,如果阈值过小(例如仅几十MB),可临时执行ulimit -m unlimited、ulimit -v unlimited解除内存限制后重试初始化命令 - 执行
free -h查看系统当前剩余物理内存+swap容量,确认无全局内存不足的情况
2 排查版本相关bug
- 执行
mosquitto_ctrl -v查看当前安装的Mosquitto版本,2.0.15之前的2.0分支早期版本存在dynsec初始化的内存溢出bug,直接升级到官方最新稳定版即可解决 - 如果你是手动编译安装的版本,确认编译时未加入错误的内存限制参数,依赖的加密、json库无版本兼容问题
3 排查输入参数合法性
- 尝试设置长度为8~16位的纯字母数字简单密码重试,避免密码过长或包含特殊不可见字符触发内存分配异常
- 执行
touch test.tmp确认当前路径有写入权限,部分场景下权限不足可能被底层错误捕获逻辑误报为内存不足
4 跟踪系统调用定位根因
安装strace工具后执行以下命令,跟踪内存分配、文件操作相关的系统调用,可直接定位到触发错误的具体环节:
strace -e trace=mmap,brk,open,write mosquitto_ctrl dynsec init dynamic-security.json user
5 临时替代方案
如果排查后仍无法解决,可以手动创建dynamic-security.json文件,参考模板如下,替换password字段为你生成的密码哈希即可(哈希可通过mosquitto_passwd -b -H sha512-pbkdf2 - <你的密码>命令生成):
{ "clients": [ { "username": "user", "password": "替换为你的密码哈希", "roles": [ { "rolename": "admin", "priority": -1 } ] } ], "roles": [ { "rolename": "admin", "acls": [ { "acltype": "pattern", "access": "publishSubscribe", "topic": "#" }, { "acltype": "pattern", "access": "readWrite", "topic": "$SYS/#" } ] } ], "defaultACLAccess": { "publishClientSend": false, "publishClientReceive": false, "subscribe": false, "unsubscribe": false } }
内容的提问来源于stack exchange,提问作者anenriquez
相关产品推荐
相关产品推荐

