如何驱逐VerneMQ内存中缓存的auth系列认证钩子相关数据?
VerneMQ 认证钩子缓存内存溢出问题解决方案
运行环境
- VerneMQ build : 1.10.4.1+build.76.ref4f0bbab
- Erlang Version : 22
问题根因
VerneMQ默认开启auth_on_register、auth_on_publish、auth_on_subscribe等钩子的内存缓存,默认无过期回收策略,所有认证请求的结果都会长期驻留Erlang虚拟机内存。动态客户端每次重连接入不同节点时,会在所有接入过的节点生成新的缓存条目,操作系统层面的echo 1 > /proc/sys/vm/drop_caches类命令只能清理系统层面的buff/cache,无法触及Erlang虚拟机内部的缓存数据,因此无效。
可落地解决方案
方案1:关闭认证缓存(优先选择)
如果你的认证后端可以支撑每天4万客户端的重连认证请求,直接关闭全局认证缓存即可从根源解决内存增长问题:
- 在
vernemq.conf中添加如下配置:
# 关闭全局认证缓存 vmq_auth_cache = off # 也可单独关闭指定钩子的缓存,按需选择 auth_on_register_cache = off auth_on_publish_cache = off auth_on_subscribe_cache = off
- 滚动重启集群节点生效,重启后旧缓存会被自动释放,不再生成新的缓存条目,完全不影响固定客户端的正常认证。
方案2:配置缓存TTL自动淘汰
如果认证后端承压能力有限不能关闭缓存,可以配置缓存过期时间自动清理旧条目,比如设置12小时过期:
- 热生效无需重启,直接执行命令:
vmq-admin set vmq_auth_cache_ttl=43200 - 也可写入
vernemq.conf永久生效:
vmq_auth_cache_ttl = 43200
所有超过TTL的缓存条目会被自动回收,内存占用会稳定在固定区间内。
方案3:手动清空缓存(临时应急)
如果需要紧急释放当前节点的内存,可以执行命令手动清空所有认证缓存:vmq-admin metrics reset_auth_cache
该命令执行后当前节点的认证缓存会被立即清空,内存占用直接下降,仅作为临时应急手段使用,未修改配置的情况下后续缓存仍会持续增长。
注:上述所有配置和命令均兼容你当前使用的1.10.x版本和Erlang 22运行环境,无需升级即可直接使用。
内容的提问来源于stack exchange,提问作者Kedar Undale
相关产品推荐
相关产品推荐

