开发者社区 > 云原生 > 消息队列 > 正文

消息队列RocketMQ版应用内存不足是什么原因?

  1. 在应用部署的机器上通过查看内存已消耗完。
  2. 在 /{user.home}/logs/ons.log 能搜索到 OutOfMemory 关键字。
  3. 在消息队列 RocketMQ 版控制台:进入消费者管理 > 消费者状态,堆积量 栏显示消息堆积较多,连接状态栏显示了各个已连接客户端的消息堆积。通 过 Jstack 排查, ConsumeMessageThread_ 线程无消费卡住现象。

展开
收起
Lee_tianbai 2021-01-01 16:53:08 1071 0
1 条回答
写回答
取消 提交回答
  • 【问题分析】: 在 1.7.0.Final 版本之前,默认客户端最多会给每个 Topic 的每个队列缓存 1000 条消息。假设每个 Topic 的队列数是 16 个(集群 2 主 2 备,每台 broker 上 8 个队列),该 Topic 下单条消息平均大小为 64 KB,那么最终该 Topic 在客户端缓存 的消息 Size:16 * 1000 * 64 KB = 1 GB。如果用户同时订阅了 8 个 Topic 都在客 户端内存缓存消息,最终占用内存将超过用户的 JVM 配置,导致 OOM。 原因 1: 依赖 1.7.0.Final 之前的 ons-client 版本,Topic 的平均消息大小超过 4 KB, 并且消息消费较慢容易在客户端内存缓存消息。 确认方式: 在 /{user.home}/logs/ons.log 能搜索到 OutOfMemory 关键字;或者通过 jmap -dump:live,format=b,file=heap.bin 命令确认哪些对象占用了大量内存。 恢复方案: 升级 ons-client 版本至 1.7.0.Final 或以上,同时给对应的 ConsumerBean 配 合 设 置 com.aliyun.openservices.ons.api.PropertyKeyConst#MaxCachedMess ageSizeInMiB 参数,然后重启应用。 原因 2: 依赖 1.7.0.Final 及以上的 ons-client 版本,默认最大消耗内存 512 MB(Group ID 订阅的所有 Topic 缓存总和);如果应用仍然出现 OOM 现象,可在 ConsumerBean 启动时,配置: com.aliyun.openservices.ons.api.PropertyKeyConst#MaxCachedMessageSizeInMiB 参数自行定义最大消耗内存(范围在 16 MB ~ 2048 MB)。 确认方式: 确认应用依赖的 ons-client 版本,并通过 JVM 确认给进程分配的内存大小。 恢复方案: 根据应用机器的内存使用清况给对应的 ConsumerBean 设置 com.aliyun. openservices.ons.api.PropertyKeyConst#MaxCachedMessageSizeInMiB 参 数,然后重启应用。

    2021-01-05 14:23:41
    赞同 展开评论 打赏

多个子产品线联合打造金融级高可用消息服务以及对物联网的原生支持,覆盖多行业。

相关产品

  • 云消息队列 MQ
  • 热门讨论

    热门文章

    相关电子书

    更多
    RocketMQ Client-GO 介绍 立即下载
    RocketMQ Prometheus Exporter 打造定制化 DevOps 平台 立即下载
    基于 RocketMQ Prometheus Exporter 打造定制化 DevOps 平台 立即下载