你好,我是洋一,一个持续向上生长的互联网人。
再三考虑,准备出一些
Java面试系列
的文章,希望对你有帮助。
问你
线上生产服务器 CPU 100%了,你是如何排查、定位以及解决问题?
作甚
面试官问你,主要是想看看你有没有处理高负载的线上问题。考察对于此类问题,是否有一套自己的打法,是否你能熟练运用一些命令去排查、定位和解决问题的能力。对于开发来讲,是基本功,是需要主动掌握的。
解决
一般 CPU 100%,基本都是代码死循环造成的。
排查的核心思路是 找到对应服务器,定位是哪个进程的哪个线程中的哪些代码引发的问题,可以简单介绍当时的异常代码示例。
1. 使用 top -c 命令定位当前进程
top -c
,可以显示当前进程的运行列表,然后输入
P
,按照 CPU 的使用率进行排序。
如上图仅为演示效果,这样我们就能很清晰地看到哪个进程的 CPU 负载最大。比如 显示进程
PID
为
2479501
的 Java进程负载消耗最大。
2. 定位负载最大进程对应的线程
使用命令
top -Hp 2479501
找到这个进程对应的线程,然后输入
P
,按照 CPU 的使用率进行排序。
如上图所示,我们可以看到
2479508
耗费 CPU 最大。
3. 定位哪段代码导致 CPU 过高
因线程 PID
2479508
是十进制,我们需要将其转换为 十六进制 ,为什么要将十进制转换为十六进制 ?因为计算机需要二进制,十六是二的四次方,而十进制不是二的整数次幂,十六进制方便我们可读。比如,其转换结果是:
25d594
接着,我们需要使用
jstack
打印进程的堆栈信息,再通过
grep
查看对应线程相关的东西。
jstack 2479501 | grep ‘25d594’ -C5 --color
这个时候就可以打印出代码,基本上帮助我们定位到出问题的位置,可以看到是哪个类中的哪个方法导致此次 CPU 100% 的原因了。
好了,今天就到这里!
如上,希望对你有价值,感谢各位的点赞、收藏和评论,我们下期见!