0
  • Vernemq 构建:1.10.4.1+build.76.ref4f0bbab
  • 二郎版本:22

根据 vernemq 文档,钩子数据存储在内存缓存中,并且不会被主动处理。

我们有大约 36 万个客户端分布在 8 个节点的集群上。客户端 ID、用户名和密码不会更改,并且对于 320k 客户端是固定的,而其余 40k 客户端会不断变化。这 4 万个客户端还订阅和发布最多 3 个主题。客户端倾向于每天一次从集群断开连接并连接回任何节点,因此挂钩数据会缓存在所有节点上并增加内存。内存每天都在增加,内存使用曲线并没有变平。

问题:我担心在某个时间点我们会出现 OOM 错误并且节点可能会关闭。

我尝试使用 echo 命令(1 2 和 3)清除内存,但只清除了 buff 缓存内存,而挂钩数据没有。有没有办法从内存中清除或驱逐挂钩数据?

4

1 回答 1

0

由于 vernemq 是用 erlang 编写的,所以 hook 数据存储在 Built-in term storage(ETS-Erlang term storage)中。这些提供了在 Erlang 运行时系统中存储大量数据的能力,并具有对数据的恒定访问时间。在此处查找更多详细信息https://erlang.org/doc/man/ets.html

注意:只有所有者进程才能删除表或表中的所有对象,这里的所有者进程是 vernemq 代理本身。

为了回答我的问题,下面是对 vernemq 源代码进行的以下代码更改,以便驱逐/删除所有缓存对象(必须从源代码构建 vernemq)。

  1. 有一个命令 ./vmq-admin webhooks cache show --reset 从 vmq_webhooks_stats ets 表中重置(删除所有对象)(重置缓存命中、条目、未命中)。
  2. 此命令在 vmq_webhooks_cli.erl 中定义,位于 cache_stats_cmd() 函数下。
  3. 只需将 vmq_webhooks_cache:reset_stats() 替换为 vmq_webhooks_cache:purge_all()

构建源并使用更新的更改启动代理。在调用 ./vmq-admin webhooks cache show --reset 命令时,挂钩数据和统计信息都将被删除。

此更改帮助我解决了 OOM 问题,该问题最终在一段时间后面临。

于 2021-09-02T10:54:26.040 回答