一个rocketmq集群(2m2s)从4.7.1升级到4.9.7后启动正常,到其中一个master节点偶发出现OutOfDirectMemoryError,堆外内存限制已经设到8g还有报错,最后设到10g重启才恢复,集群负载不高总共只有500tps,配置8C16G,而且只有这1个节点有这种情况,对比了两个master节点的broker.propertis和jvm参数没有发现差异,请问是什么原因?
如果堆内存都正常 可以看下源码 或者最简单的升级到5.x版本的rocketmq,如果解决了 可能4.x的某个版本存在内存泄漏的问题。 此回答整理自钉群“群2-Apache RocketMQ 中国开发者钉钉群”。
OutOfDirectMemoryError错误表示堆外内存不足。在RocketMQ中,堆外内存主要用于存储消息的序列化数据和发送/接收网络IO缓冲区。
根据你提供的信息,有以下一些可能导致该问题的原因:
系统环境配置:检查操作系统的max direct memory size
参数是否已正确设置。这个参数表示堆外内存最大可用大小。确保参数足够大以满足RocketMQ的需求。
JVM参数配置:确保所有的RocketMQ节点使用相同的JVM参数配置。特别关注堆外内存的相关参数,如-XX:MaxDirectMemorySize
。确认这些参数在所有节点上都被正确设置,并且没有差异。
版本升级问题:从4.7.1升级到4.9.7之后,某些配置项可能发生了变化,包括默认值或者与堆外内存相关的配置。请确保所有节点都已按照新版本文档中的建议进行配置。
消息发送速率过快:尽管你提到集群负载不高(总共只有500tps),但仍然需要考虑具体的消息发送和消费情况。如果存在突发的消息发送速率或者某些消费者处理速度较慢,可能会导致堆外内存不足。
硬件资源限制:检查服务器硬件资源是否足够支持,包括内存、磁盘和网络带宽等。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
涵盖 RocketMQ、Kafka、RabbitMQ、MQTT、轻量消息队列(原MNS) 的消息队列产品体系,全系产品 Serverless 化。RocketMQ 一站式学习:https://rocketmq.io/