Tips:涉及到的命令会在后面统一整理出来方便使用。
面试官:如果线上服务器CPU 100%了,该如何排查、定位和解决?这个有遇到过吗?可以简单聊聊吗? 面试官心理分析
主要是想要考察你有没有处理过高负载的线上问题场景。
派大星:首先我们要通过定位具体是哪个进程耗费CPU,可以使用top -c命令。这样可以显示进程列表,然后输入P,便会按照CPU的使用率进行排序。如图所示:
通过
top -c定位到具体是哪个进城后,接下来要定位耗费CPU的线程;可以通过命令top -Hp pid,这里的pid就是进程id。然后输入P,就会按照cpu的使用率排序。如图所示:
找到耗费CPU较高的线程之后,便可以通过命令
printf "%x\n" pid这里命令是要把线程pid换成16进制的。如图所示:
然后通过命令
jstack 进程id | grep '0x加上刚刚计算出来的16进制' -C5 -color打印堆栈信息。
比如:jstack 9529 | grep '0x4418' -C5 -color
这样就可已锁定是哪个方法出现了问题。
面试官:如果遇到线上进程kill不掉怎么办?你应该如何排查处理? 面试官心理分析:
主要是想要考察你有没有遇到过线上的问题,如何应对及处理
派大星:很巧,在线上确实有遇到过类似的问题,在说解决问题的方案的时候先聊一下我们线上发布流程背景。
我们有自己的一套线上发布的流程系统,就是在每次部署的时候会从git仓库上去自动拉去代码,然后根据profile,Maven会自动打对应环境的包。然后进行发布。系统发布是由发布系统的进程创建的子进程去发布的。
当时出现一个现象是无论怎么kill 系统的进程都无法杀死,后来通过命令ps aux查看到系统进程的哪种数据的status那列是zombie状态,也就是僵尸进程。
解决方案可通过ps -ef | 僵尸进程id ,找到父进程,然后kill掉父进程即可。
面试官:嗯,可以。确实有处理过线上问题。回去等消息吧。看好你喔。
- 线上CPU 100%排查命令:
# 获取哪个进程耗费CPU 输入命令后按p排序
top -c
# 定位耗费CPU的线程
top -Hp pid
# 将进程id转换为16进制
printf "%x\n" pid
# 打印堆栈信息即可锁定
jstack 9529 | grep '0x4418' -C5 -color
- 无法kill进程相关排查命令
# 查找zombie僵尸状态的进程,并锁定父进程
ps aux
ps -ef | 僵尸进程id
如有问题,欢迎加微信交流:w714771310,备注- 技术交流 。或关注微信公众号【码上遇见你】。