0%

【踩坑】记一次机器假死过于频繁的排查

现象

最近线上机器经常发生 OOM,导致机器 down 掉,这个概率越来越大,看了一下机器日志,是 JVM 申请内存不够导致自己被 Kill 掉了

OOM日志

近期并没有什么发布,没有耗费更多内存,所以排查角度放在了其他服务上。

发现TC组件的日志收集服务占用了一部分内存。但是问了相关人员,并没有做过升级。

只能先将JVM的内存调整一下,从 10G->9G ,空余了一部分内存给其他服务(总共 12G)。(并不能限制机器不 OOM 掉 JVM,因为这样的话可能会误伤其他服务,如果干掉了sshd就只能重启虚拟机而不是重启 Tomcat 那么简单了)

探寻问题

查看这个服务名下机器的 cpu 使用率,发现 wait 比例非常高

CPU使用率

就登陆机器看iotop,结果发现 kswapd0 这个进程直接99%,如下代码。然后马上又降下去了。前几天一直没时间找原因,今天抽出点时间把这个整理下。

1
2
3
Total DISK READ: 10.33 M/s ' Total DISK WRITE: 5.16 M/s
TID PRIO USER DISK READ DISK WRITE SWAPIN IO> COMMAND
58 be/4 root 0.00 B/s 0.00 B/s 0.00 % 99.30 % [kswapd0]

swap分区的作用是当物理内存不足时,会将一部分硬盘当做虚拟内存来使用。

kswapd0 占用过高是因为 物理内存不足,使用swap分区与内存换页操作交换数据,导致 CPU 占用过高。

查看了一下最近做过什么,发现是配置了一个jstack,每分钟会自动收集 JVM 堆栈信息,从监控上来看确实是配置了之后 wait 才飙上去的。

所以内存并不能有多少占用多少,SWAP的性能很差,在机器还是应该留一些空余空间,才能保证服务顺畅。