Sentinel icon indicating copy to clipboard operation
Sentinel copied to clipboard

The client heap memory usage is too large (客户端内存占用过大)

Open nathanchoui opened this issue 3 years ago • 10 comments

Issue Description

Type: feature request

Describe what happened (or what feature you want)

客户端集成到服务以后,通过对比接入前与接入后的监控信息发现,接入sentinel后内存占用明显升高。 平均内存占用增加350MB,峰值内存占用增加900多兆,并且主要集中在老年代。 通过分析jvm dump文件,占用内存较大的几个对象是:com.alibaba.csp.sentinel.node.metric.MetricNode、java.util.concurrent.atomic.LongAdder、com.alibaba.csp.sentinel.slots.statistic.base.WindowWrap等。 271FA9E8-7211-44DC-A927-E4B217294276

Describe what you expected to happen

作为一个微服务,这些内存占用有些难以让人接受,希望能尽量减少内存的占用。

How to reproduce it (as minimally and precisely as possible)

  1. MetricNode对象的生成主要来自控制台拉取日志时,客户端读取metric日志,转换成了MetricNode对象。从阅读源码可知,读取日志时,将String转换为MetricNode,再将MetricNode转换成String。是否多此一举,直接将日志发给控制台即可?这样可以减少很多对象的创建以及内存占用。
  2. 其它几个高占用对象,粗略看了下源码发现,几乎来自于StatisticSlot中,用来统计resource信息的。不知后续这块是否会有优化计划。如果短期没有,希望给与我一些提示,从哪些角度去优化。从业务角度出发,我能想到的是,通过设置resource白名单,减少对一些不重要的接口做统计,尽量减少内存占用。

Tell us your environment

sentinel 1.8.2 openjdk 1.8 springboot 2.x

Anything else we need to know?

控制台每隔十秒从客户端拉取meteic信息。

nathanchoui avatar Jun 30 '22 07:06 nathanchoui

我也碰到这个问题了, 时间越长, 堆积的越厉害 java.util.concurrent.atomic.LongAdder内存占比高达70%

yipixiaofeiyang avatar Jul 05 '22 08:07 yipixiaofeiyang

我也碰到这个问题了, 时间越长, 堆积的越厉害 java.util.concurrent.atomic.LongAdder内存占比高达70%

这个问题其实挺严重的,官方没有很重视,内存占用大的话根本无法上生产

nathanchoui avatar Jul 05 '22 09:07 nathanchoui

这个问题有进展吗

xiaomiusa87 avatar Oct 12 '22 02:10 xiaomiusa87

https://github.com/alibaba/Sentinel/pull/2802 MetricNode 对象的占用有缓解。LongAddr 可以从业务角度出发,减少统计。

nathanchoui avatar Oct 12 '22 02:10 nathanchoui

  1. spring.cloud.sentinel.filter.enabled 如果是开启的化,默认 /** ,监控所有控制器的方法
  2. feign.sentinel.enabled 开启的化也是所有服务的 feign监控 3.MetricNode 占用高其实就是监控的资源比较多,看情况配置吧,一般不需要都监控

craywen avatar Sep 07 '23 02:09 craywen

生产上有遇到 YGC 某一瞬间耗时突增,后续时间越来越长,dump 出来发现 MetricNode 对象实例最多,占用内存快800M 了;不知道是不是这个影响的 YGC 耗时

hxlzpnyist avatar Dec 28 '23 17:12 hxlzpnyist

同遇到该问题,只要引用了包就会统计,大量占用内存,10堆内存sentinel占用了2个多g

aboluo-gy avatar Jan 02 '24 03:01 aboluo-gy

确实占用太大了,半年后需要占用几个G,盼修复

vae1970 avatar Feb 13 '24 13:02 vae1970

在JDK21-虚拟线程上也出现同样问题, 极端情况可能造成GC卡死的情况, 小服务, 访问量不大 , 但是MetricNode太多了

 num     #instances         #bytes  class name (module)
-------------------------------------------------------
   1:        763402      301735000  [B ([email protected])
   2:          7333       51136656  [C ([email protected])
   3:         30978       49766888  Ljdk.internal.vm.FillerArray; ([email protected])
   4:        267681       21414480  com.alibaba.csp.sentinel.node.metric.MetricNode
   5:        541147       17316704  java.util.HashMap$Node ([email protected])
   6:        112535       12039152  [Ljava.lang.Object; ([email protected])
   7:        445648       10695552  java.lang.String ([email protected])

zt9788 avatar Mar 15 '24 05:03 zt9788