一个load过高的故障排查案例

现象: 6台4核机器load 全部在30以上,cpu使用us在90%, mem使用在90%,swap使用了100K,机器缓慢,前台浏览器页面打开缓慢,超时后白屏。
措施: top, shift+h ,shift + p, 找出消耗cpu时间最多的线程ID,dump 堆栈信息,找到该线程,看在做什么,发现有多个线程在执行同一个方法。该方法内有一个循环,从一个node节点向上找其父节点,并不断将该节点数据放入List,猜测该节点的父节点ID肯定与该节点形成死循环了,导致while不能跳出。修改代码限制向上寻找的层级,达到一定数量后,从循环中跳出,重新发布后,问题解决。


总结:1,排查cpu消耗类故障方法。
1)top shift+h shift+p ,找到java 进程编号,在列出所有线程按cpu消耗排序,找到执行时间最长的线程ppid。
2)java/bin/jstack PID > /tmp/jstack.log 导出堆栈信息。
3)将10进制的PID转换成16进制(a-f字符要小写),在该文件中寻找该16进制的PPID,并查看该线程堆栈信息,看这些线程在做什么。
4)找到堆栈中对应代码查看,是否有消耗cpu的大循环,修改,发布会解决问题。
2,同时,如果内存消耗过大导致频繁full gc,可以按照如下方法排查:
1)使用jmap dump jvm内存到指定目录,可引起full GC , 慎重操作。
2)使用ftp或其他方法,将文件拉到本地机器。使用mat,分析堆内存,利用leak suspect找出可能的内存泄漏。

你可能感兴趣的:(load)