• 首页 > 
  • 消息队列RocketMQ版客户端消耗的内存过多

消息队列RocketMQ版客户端消耗的内存过多

KB: 85936

 · 

更新时间:2021-03-12 10:23

问题描述

消息队列RocketMQ版客户端消耗的内存过多,可能发生以下几种现象:

  • 服务器内存被客户端程序消耗殆尽。
  • /[$User_Home]/logs/ons.log日志中存在OOM(OutOfMemory)信息。
    说明:[$User_Home]指用户家目录。
  • 消息队列RocketMQ版控制台中显示消息堆积较多,但通过Jstack调试工具排查,ConsumeMessageThread_线程无异常现象。
    说明

问题原因

客户端依赖的ons-client(SDK)版本不同,对应的问题原因也不同。请先检查您客户端中依赖的ons-client版本,然后结合以下内容进行分析和处理:

  • ons-client v1.7.0.Final以前的版本
    客户端默认在内存中缓存Topic的消息,每个Topic中的每个队列支持缓存最多1000条消息。消费者(Consumer)消费较慢时将导致内存中缓存的消息增多,最终超过您JVM配置的内存大小,导致OOM错误。
    说明:如果您想了解具体的错误示例,请参见更多信息
  • ons-client v1.7.0.Final及以后的版本
    客户端仍然默认在内存中缓存Topic的消息,但单个Group ID中所有Topic的缓存大小限制为512MB。如果客户端运行了多个不同Group ID的Consumer实例,并且消费较慢,则消息缓存仍然有可能超过您JVM配置的内存大小,导致OOM错误。

解决方案

阿里云提醒您:

  • 如果您对实例或数据有修改、变更等风险操作,务必注意实例的容灾、容错能力,确保数据安全。
  • 如果您对实例(包括但不限于ECS、RDS)等进行配置与数据修改,建议提前创建快照或开启RDS日志备份等功能。
  • 如果您在阿里云平台授权或者提交过登录账号、密码等安全信息,建议您及时修改。

客户端依赖的ons-client版本不同,对应的解决方案也不同,具体如下:

  1. 检查您客户端中依赖的ons-client版本。
    • ons-client v1.7.0.Final以前的版本
      1. 检查ons.log日志,确认存在OOM信息。
      2. 请升级ons-client版本至v1.7.0.Final或更新的版本。关于ons-client版本,请参见版本说明
    • ons-client v1.7.0.Final及以后的版本
      请按步骤2继续处理。
  2. 根据您的服务器内存大小以及JVM内存配置,调整Consumer的maxCachedMessageSizeInMiB参数至合适的值。关于该参数,请参见参数说明
  3. 重启客户端应用。
  4. 确认ons.log日志中不再出现OOM信息。
  5. 确认消息队列RocketMQ版控制台中的消息堆积量下降,并且消费TPS值有上升。详情请参见查看消费者状态

更多信息

关于ons-client v1.7.0.Final以前的版本中出现OOM错误的示例如下:

  • 消息队列RocketMQ版实例为2主2备的集群实例。
  • 该实例的每个Broker有8个队列。
  • 每个Topic的队列为16个(8*2=16)。
  • Topic下单条消息的平均大小为64KB。
  • 客户端订阅5个Topic。

以上情况中,客户端缓存5个Topic所占用的最大内存为:5*16*64KB*1000=5GB。

适用于

  • 消息队列RocketMQ版

如果您的问题仍未解决,您可以在阿里云社区免费咨询,或提交工单联系阿里云技术支持。