服务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