重启原因
容器健康监控探针每3S发送一次readiness、一次liveiness,3s超时,超时未响应再次重发,超过3次未响应,视为POD不健康,自动重启POD。Java应用单次FGC时间过长,当FGC时间出现超过6S时,会偶发极端情况3次拨测正好全部失败,导致POD重启;当GC时间超过9S时,三次拨测大概率全部失败,导致 POD重启。
问题分析
JVM启动会自动获取环境信息,根据CPU、内存、操作系统等,自动优化设置大部分JVM参数,包括各代内存大 小限制、GC算法、GC线程数、编译方式、编译线程数等,目前容器下使用的jdk7/8均不支持获取容器资源限 制,导致JVM使用物理机配置自动优化,优化后启动了33个GC线程,12个编译线程,但实际资源限制,导致GC 时需要较多时间片,单次GC时间变长;
定位方式
1.编写curl脚本,在容器内curl本地127地址拨测接口,偶发出现拨测响应超过3S的;
2.根据重启时间点,在tomcat的access log指定时间点前后1分钟进行查询,发现出现时间暂停,在某一时间段内 无业务请求、无拨测请求;
3.根据重启时间点,在业务日志中查询,出现时间暂停,在某一时间段内无业务处理日志;4
4.使用jstat -gccause pid,通过脚本每秒输出一次,重定向在单个文件中,在出现FGC或YGC时间较久时,容器出现UnHealth事件,随后触发重启POD;
解决方案
调整JVM参数