maximum heap size reached 丢失了部分消息

环境信息

  • EMQX 版本:4.2.12
  • 操作系统及版本:Linux 3.10.0-957.21.3.el7.x86_64 #1 SMP
  • 其他

问题描述

emqx.log和erlang.log都一直在报错:maximum heap size reached
但是emqx并没有重启,只是貌似丢失了部分消息

配置文件及日志

2022-05-09 08:36:58.664 [error] Process: <0.14578.4875> on node ‘emqx@127.0.0.1’
Context: maximum heap size reached
Max Heap Size: 4194304
Total Heap Size: 4931296
Kill: false
Error Logger: true
GC Info: [{old_heap_block_size,3581853},
{heap_block_size,1347864},
{mbuf_size,1615},
{recent_size,24116},
{stack_size,32},
{old_heap_size,2866280},
{heap_size,514802},
{bin_vheap_size,31618},
{bin_vheap_block_size,46422},
{bin_old_vheap_size,624158},
{bin_old_vheap_block_size,989000}]

2022-05-09 08:36:59.025 [error] Process: <0.14578.4875> on node ‘emqx@127.0.0.1’
Context: maximum heap size reached
Max Heap Size: 4194304
Total Heap Size: 4941213
Kill: false
Error Logger: true
GC Info: [{old_heap_block_size,3581853},
{heap_block_size,1347864},
{mbuf_size,11529},
{recent_size,72371},
{stack_size,20},
{old_heap_size,2889740},
{heap_size,514805},
{bin_vheap_size,55452},
{bin_vheap_block_size,46422},
{bin_old_vheap_size,629179},
{bin_old_vheap_block_size,989000}]

2022-05-09 08:36:59.058 [error] Process: <0.14578.4875> on node ‘emqx@127.0.0.1’
Context: maximum heap size reached
Max Heap Size: 4194304
Total Heap Size: 7692757
Kill: false
Error Logger: true
GC Info: [{old_heap_block_size,3581853},
{heap_block_size,4096691},
{mbuf_size,14213},
{recent_size,155580},
{stack_size,14},
{old_heap_size,2960174},
{heap_size,345365},
{bin_vheap_size,39752},
{bin_vheap_block_size,75110},
{bin_old_vheap_size,644268},
{bin_old_vheap_block_size,989000}]

客户端连接分配的内存超过最大值了。比如客户端队列存的消息过大

能从 Dashboard或者别的地方验证是哪个地方导致的内存超过最大值吗?

这个是系统内部保护机制,某个客户端使用的内存超过内部分布的内存大小,进程会直接杀掉,保护其他正常的客户端的使用。内存使用由消息条数和每条消息决定的。

哪一个客户端(clientId)被杀掉能观察到吗?
修改飞行窗口、消息队列长度、消息最大长度可以避免这种情况吗,还是需要其他配置?

只知道哪个进程的被杀掉的。
修改飞行窗口,队列长度,消息大小,前提都是在这个session的进程分配的内存内使用。比如你内存足够的情况下,调整这飞行窗口和消息队列长度都是可以的。你这边是什么场景出现这个日志的,消息大小多大呢

就是因为不知道哪个消息触发的 :joy: ,消息大小是动态的,这条日志几乎每秒一条

为啥不能打印就是类似程序打印oom 一样,都无法获取内存中的客户端信息。消息大小,并发量等都是系统上线前提前评估的。有个大概也可以,你看一下飞行窗口和队列有没有挤压。

客户端比较多,一个个点过去查看飞行窗口和队列太费时间了

你需要看订阅的那些客户端就行,就看一下哪些主题的消息并发高的。随机看几个,是不是有挤压。每条消息最大大概是多大的

尝试一下系统调优,参考文档

使用了topic监听模块,监听了可能并发高的topic,最高的是3000条/s。随机点开几个客户端查看消息队列和飞行窗口并没有很严重的堆积

一直都是按照文档调优的参数

topic监听模块是指主题监控吗?

是的

请问这条报错会强制杀掉进程,那么对于客户端会造成哪些影响?