容器内Java进程问题造成Pod重启的原因分析

由于Java Full GC(FGC)时间过长,导致容器健康检查失败,进而引起Pod自动重启。问题源于JVM无法正确识别容器资源限制,过度配置GC线程和编译线程。通过定位GC超时、访问延迟和业务暂停现象,使用jstat等工具分析后,调整JVM参数以优化GC和内存配置,避免Pod不必要的重启。
摘要由CSDN通过智能技术生成

重启原因

容器健康监控探针每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参数

Kubernetes是一款高度可扩展、可靠的容器编排和管理系统,它简化了容器的部署、管理和自动化操作。在使用Kubernetes过程中,我们经常需要查看Pod的状态和重启原因,这样能够及时发现问题并进行处理,提高系统的稳定性和可靠性。下面就来介绍一下如何在Kubernetes中查看Pod重启原因。 首先,我们可以使用kubectl命令来查看Pod的状态和重启次数,执行如下命令: ```bash kubectl get pods ``` 该命令会列出当前运行的所有Pod的信息,包括名称、状态、重启次数等。其中,重启次数就表示该Pod运行过程中重启的次数,如果频繁重启,说明该Pod存在问题,需要及时进行处理。 如果想要查看Pod的详细信息,可以执行如下命令: ```bash kubectl describe pod <pod-name> ``` 该命令会列出该Pod的详细信息,包括容器信息、事件信息、日志信息等。特别是事件信息,会列出Pod的事件历史记录,包括重启原因重启时间等。我们可以通过查看事件信息来了解Pod重启原因,例如执行如下命令: ```bash kubectl describe pod <pod-name> | grep -i restarted ``` 该命令会查找该Pod的事件信息,并过滤出所有与重启相关的事件信息,方便我们查看重启原因。 除了使用kubectl命令之外,我们还可以通过Kubernetes Dashboard来查看Pod重启原因。首先,需要安装和配置Kubernetes Dashboard,然后在Dashboard中找到需要查看的Pod,点击进入该Pod的详情页,在“Events”选项卡下可以查看该Pod的事件历史记录,包括重启原因重启时间等。 总之,通过以上方法,我们可以很方便地查看Kubernetes中Pod重启原因,及时发现问题并进行处理,保证系统的稳定性和可靠性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值