问题排查记录:Java进程隔一小段时间会重启

问题:Java进程隔一小段时间会重启
排查:
(guard是公司的进程监管程序)
第一反应是 会不会有某个定时任务去重启服务?查看了一下guard日志,可以从日志中看出来服务挂了的时间,以及guard将他们拉起的日志。
由于之前有一次服务每5分钟重启一次,是由于guard对服务的actuator健康检查不过,导致guard主动去kill服务。
有了这么一次经历会联想到这一次是不是也由于服务的健康检查不过导致的,因此去查看了一下该服务的健康状态,可以直接通过服务地址的url得知此时服务的状态是up。并且这一次服务挂掉不存在稳定的时间间隔,并且也不是某个服务有这个问题。同时也查看了服务自身的日志,只有服务启动和业务的日志,并没有其他报错信息。
此时我仍然纠结于是不是某个时间点服务的健康检查不过,或者由于该服务依赖的其他服务挂了,导致健康检查不过,才被guard不断重启。
试图将每一次健康检查的信息输出到日志文件中,依旧显示是健康的。
在这期间我也查看过服务器资源情况,cpu占用正常,没有某个服务占用特别多的cpu,可用的内存空间也是够的。
试图用jstack打印java进程堆栈信息,看看会不会发生了死锁,发现没有线程循环等待。

最后突然想到有没有什么办法可以知道服务到底是被那个进程kill的。查了一下资料,可以用dmesg | egrep -i -B100 ‘killed process’查看服务被kill的信息,可能只有centos才可以执行这个命令?欧拉系统好像不行?
看到kill原因是由于memory cgroup out memory
也就是说 是由于docker容器内的该进程申请的内存资源超出容器内剩余的资源,触发了docker的oom ,自动去把该服务kill
这时才反应过来 之前用top查看的系统资源,其实是查看整个宿主机的资源使用情况,因此一下子没反应过来。
马上用docket stats 容器id 查看一下此时容器的资源情况,发现内存已占用96%,内存限制为10g
修改一下docker-compose.yml 文件中的mem_limit为20gb,然后docker commit 容器i’d 镜像名:版本号,备份一下该容器,重新docker compose up 服务名 -d 重新创建一下容器,果然服务就正常了。

todo:
如果没有guard,如何查看进程的存活时间?

ps -p pid -o etime
pstree -p
cat /proc/pid/stat
top

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值