2.2.3版本nacos服务端长时间运行,堆外内存一直增长。运行10 个小时堆外内存占用达到了堆内存大小的 | Nacos 官网
云栖回顾 | 2024 云栖大会微服务和网关相关演讲材料点此了解

2.2.3版本nacos服务端长时间运行,堆外内存一直增长。运行10 个小时堆外内存占用达到了堆内存大小的


用户问题 :

2.2.3版本nacos服务端长时间运行,堆外内存一直增长。运行10 个小时堆外内存占用达到了堆内存大小的2倍以上,是否在使用netty的直接内存时存在内存泄露


专家官方解答 :

根据提供的知识内容,我们可以分析和解决您提到的Nacos 2.2.3版本服务端长时间运行后堆外内存持续增长的问题。以下是对问题原因的分析及基于此的解决方案:

问题分析

  1. 请求量过大:短时间内大量的服务注册、配置订阅可能导致Netty在处理这些请求时频繁申请nio堆外内存,若无有效释放,将造成堆外内存持续增长。
  2. 堆外内存限制不当:可能未设置或设置了过小的-XX:MaxDirectMemorySize,使得Netty在处理高并发请求时,直接内存分配超出预期范围。
  3. 客户端故障:服务端不断向故障客户端推送数据,这些无效的推送消耗了堆外内存且未被及时回收。
  4. 特定操作导致:如大量使用login接口引发jjwt问题,额外申请了堆外内存且未被合理管理。

解决步骤

  1. 调整堆外内存限制:首先,根据服务器物理内存情况,通过JVM参数-XX:MaxDirectMemorySize合理设置堆外内存上限,建议设为堆内存大小的1/4至1/2,例如:如果堆内存为8GB,则可设置-XX:MaxDirectMemorySize=2g-XX:MaxDirectMemorySize=4g

  2. 监控与日志分析:检查naming-push.logremote-push.log,寻找持续推送失败的IP地址,这可能是由于客户端问题导致的服务端资源浪费。一旦发现,需尽快定位并解决客户端故障,如客户端的FullGC、OOM或版本兼容性问题。

  3. JVM堆内存调整:确保JVM堆内存设置不超过物理内存的70%,避免因堆内存过大间接影响堆外内存的管理与回收。例如,若物理内存为16GB,堆内存应设为不大于11.2GB。

  4. 版本升级考虑:如果上述调整未能有效解决问题,考虑升级Nacos服务端版本至最新稳定版。新版本可能包含了针对堆外内存使用的进一步优化和修复。

  5. 资源监控与报警:实施系统资源的持续监控,并设置堆外内存使用率的报警阈值,以便在问题发生初期及时介入处理。

解释

以上步骤首先针对性地解决了堆外内存增长的根本原因,即通过调整限制来控制Netty的直接内存使用,并通过日志排查和解决由客户端引起的问题,减少无效内存占用。同时,优化JVM堆内存配置以平衡整个系统的内存使用。最后,提出版本升级和建立监控体系作为长期维护和预防措施,确保系统稳定运行。

---------------

参考链接 :

  • 专家经验:io.grpc.netty.shaded.io.netty.util.internal.OutOfDirectMemoryError

  • 专家经验:Nacos 内存占用过大

  • Nacos功能和需求列表

---------------

答疑服务说明:

本内容经由技术专家审阅的用户问答的镜像生成,我们提供了专家智能答疑服务,使用方法: 用法1: 在页面的右下的浮窗”专家答疑“。 用法2: 点击专家答疑页(针对部分网站不支持插件嵌入的情况)

另:

有其他开源产品的使用问题?点击访问阿里AI专家答疑服务

反馈

如问答有错漏,欢迎点:差评给我们反馈。