swap引起的zgc safepoint超长问题排查

背景

从java8直接升级到jdk21后,使用zgc的过程中有几个优化点,这里记录下来

zgc优化过程

第一版上线时除了执行-xmx外,没有指定其它的jvm参数,此时观察到两个现象:

1.偶尔有超过500ms的超时的gc,这里是通过采集日志zgc过程中stw的日志发现的,初始标记:日志中Pause Mark Start,再标记:日志中Pause Mark End, 初始转移:日志中Pause Relocate Start

2.偶尔有一次超过10s的进入safepoint的时长,这个时候的现象如下: cpu使用率很高并且容器cpu会被限流

第一点现象我们发现是由于"Alloaction Stall"导致的,也就是使用自适应的zgc回收器回收的速度不够快,不能适应流量突发的情况,我们新增了ZInterval=5秒的参数,除了自适应的zgc触发外,新增了固定间隔5s触发一次,上线后问题解决,不在有"Alloaction Stall"日志,并且偶尔超过500ms的超时的现象不再出现

第二点进入safepoint的时长超过10s的原因确定是由于cpu限流导致的停顿,然而cpu限流的原因不是因为zgc本身的问题,而是因为swap的使用导致cpu使用暴涨,进而被限流,进而导致进入safepoint的时长超过10s,这一步的解决我们是通过调整容器的规格,增加容器内存的方式解决了