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,这一步的解决我们是通过调整容器的规格,增加容器内存的方式解决了