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

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

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

展开
收起
Lee_tianbai 2021-01-01 16:53:08 1133 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
    赞同 展开评论 打赏

涵盖 RocketMQ、Kafka、RabbitMQ、MQTT、轻量消息队列(原MNS) 的消息队列产品体系,全系产品 Serverless 化。RocketMQ 一站式学习:https://rocketmq.io/

相关产品

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

    热门文章

    相关电子书

    更多
    行业实践:RocketMQ 业务集成典型行业应用和实践 立即下载
    内存取证与IaaS云平台恶意行 为的安全监控 立即下载
    云服务器ECS内存增强型实例re6全新发布 立即下载