服务cpu突刺问题

从图中可以看到cpu使用率在某些时刻有突刺现象的存在,是平时正常时候的3-4倍,正常使用时大概在25%,最高的时候达到了70%左右;

是什么原因导致的cpu突刺现象?又该怎么解决呢?

一、引起cpu升高的现象

1.业务量突然增大

2.机器原因

3.jvm gc

.........

这里首先排查前2个原因:

1.因为我们的业务是出行相关的,那么早晚高峰的时候才是业务高峰期,然而早晚高峰的cpu使用率并没有升高,所以排除1;

2.机器就更不可能了,如果机器原因的话,cpu会一直处于最高状态不应该是突刺现象所以也排除

3.gc导致到cpu突刺:

由以上图片可以看到cpu突刺升高时,确实对应的jvm发生了gc现象;

jvm gc是无法避免的,我们唯一能做的就是降低gc的停顿时间,减少gc对应用的影响;

那么我们我们就必须知道gc的详情来对jvm进行相关调优了;

查询线上gc日志:

我们用的是g1垃圾收集器,然后观察日志发现时发生了mixed gc,导致耗时1s多,观察最后部分gc数据Eden数据186M清空,survivors区降低7M,而堆降低321M,所以存在老年代与Humongous大对象无效情况;

原因:G1垃圾回收器的开始mixedGc的阈值InitiatingHeapOccupancyPercent默认是45%,这指的是已经使用内存(老年代+新生代)占整个堆的占比。

我们这里的目的是使gc暂停时间更短,减少影响;

1.增大InitiatingHeapOccupancyPercent值,延迟mixed gc的发生(并不能降低暂停时间,并且发生mixed gc时可能暂停更久)

2.增大堆的内存,即分配更多的内存,延迟mixed gc的发生(并不能降低暂停时间,并且发生mixed gc时可能暂停更久)

3.-XX:G1MixedGCCountTarge 适当增大这个值,用更多线成数来扫描,降低延迟

4.调整region 大小,Humongous对象认定为大于region的50%,一个region默认大小为2m,适当扩大,减少Humongous对象的认定,从而减少mixed的发生甚至不发生

5.通过修改相关业务对象,控制对象的生命周期,尽量减少Humongous对象及old区对象的产生,减少full gc 和mixed gc