乐趣区

关于java:java-jvmold-gc耗时几十s导致系统告警

问题

生产环境告警,接口超时。

起因

old gc 耗时几十 s,导致系统霎时卡死,而后接口都超时了。


另外一个利用也是耗时好几 s,导致系统霎时卡死,而后很多告警。

不是每次 old gc 都会卡死,而是偶然一次 old gc 才会耗时很久,大部分时候失常。

实质起因

为什么 old gc 耗时这么久?起因是因为之前有一个节点接入 skywalking,而后调整了 jvm 配置,具体是:新生代和老年代的比例,默认是 2。当初是 4,老的内存大小翻倍——导致老年代的 gc 阈值变高了,所以才会很久 gc 一次,然而有可能导致单次耗时太久。


失常节点的 old gc 是上面这样。

失常节点和异样节点的 jvm 配置

异样节点

 $ jinfo -flags 11597

Attaching to process ID 11597, please wait…

Debugger attached successfully.

Server compiler detected.

JVM version is 25.161-b12

Non-default VM flags: 

-XX:CICompilerCount=4 -XX:InitialHeapSize=3221225472 -XX:MaxHeapSize=3221225472 

-XX:MaxMetaspaceSize=524288000 

-XX:MaxNewSize=643825664 

-XX:MetaspaceSize=314572800 

-XX:MinHeapDeltaBytes=524288 -XX:NewRatio=4 -XX:NewSize=643825664 -XX:OldSize=2577399808 -XX:ThreadStackSize=512 -XX:+UseCompressedClassPointers -XX:+UseCompressedOops 

-XX:+UseParallelGC  // 默认:吞吐量优先 - 新生代 + 多线程 - 老年代

Command line:  -javaagent:/home/xxx/private-cloud/agent/skywalking-agent.jar -Dskywalking.agent.service_name=trade-base -Dskywalking.agent.instance_uuid=xxx -Ddubbo.application.name=xxx-base -Ddubbo.application.version=green-1 

-Xmx3072m -Xms3072m 

-XX:NewRatio=4  // 新和老的比例,默认是 2。当初是 4,老的内存大小翻倍——导致老年代的 gc 阈值变高了,所以才会很久 gc 一次,然而有可能导致单次耗时太久。

-Xss512k 

-XX:MetaspaceSize=300m 

-XX:MaxMetaspaceSize=500m

注:因为接入了 skywalking,并且配置了 jvm 参数,所以 jvm 参数和失常节点不一样,实质就是因为这个起因导致的。

为什么新的配置就有问题?因为:新和老的比例,默认是 2。当初是 4,老的内存大小翻倍——导致老年代的 gc 阈值变高了,所以才会很久 gc 一次,然而有可能导致单次耗时太久。

留神这个只是接入了 skywalking,并且因为 skywalking 占用资源,所以 jvm 内存调大,然而新老比例不应该调大。

失常节点

$ jinfo -flags 53022

Attaching to process ID 53022, please wait…

Debugger attached successfully.

Server compiler detected.

JVM version is 25.161-b12

Non-default VM flags: 

-XX:CICompilerCount=3 

-XX:InitialHeapSize=127926272 

-XX:MaxHeapSize=2046820352 -XX:MaxNewSize=682098688 

-XX:MinHeapDeltaBytes=524288 -XX:NewSize=42467328 -XX:OldSize=85458944 

-XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseFastUnorderedTimeStamps 

-XX:+UseParallelGC // 默认垃圾回收器

Command line:  -Ddubbo.application.name=xxx-base -Ddubbo.application.version=green-1

解决办法

回滚 jvm 配置,即把有问题的节点的 Jvm 配置改为和失常节点一样。

失常节点的 jvm 是应用默认配置,即没有配置 jvm 参数。

本文由博客一文多发平台 OpenWrite 公布!

退出移动版