alibaba / Sentinel

A powerful flow control component enabling reliability, resilience and monitoring for microservices. (面向云原生微服务的高可用流控防护组件)
https://sentinelguard.io/
Apache License 2.0
22.32k stars 8k forks source link

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

Open nathanchoui opened 2 years ago

nathanchoui commented 2 years ago

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信息。

yipixiaofeiyang commented 2 years ago

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

nathanchoui commented 2 years ago

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

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

xiaomiusa87 commented 1 year ago

这个问题有进展吗

nathanchoui commented 1 year ago

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

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

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

aboluo-gy commented 8 months ago

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

vae1970 commented 7 months ago

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

zt9788 commented 6 months ago

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

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

同样的问题, 占用了三分之一的内存