对线面试官 - 绝无仅有真实线上问题排查面试题突击篇

217 阅读3分钟

Tips:涉及到的命令会在后面统一整理出来方便使用。

面试官:如果线上服务器CPU 100%了,该如何排查、定位和解决?这个有遇到过吗?可以简单聊聊吗? 面试官心理分析

主要是想要考察你有没有处理过高负载的线上问题场景。

派大星:首先我们要通过定位具体是哪个进程耗费CPU,可以使用top -c命令。这样可以显示进程列表,然后输入P,便会按照CPU的使用率进行排序。如图所示: image.png 通过top -c定位到具体是哪个进城后,接下来要定位耗费CPU的线程;可以通过命令top -Hp pid,这里的pid就是进程id。然后输入P,就会按照cpu的使用率排序。如图所示: image.png 找到耗费CPU较高的线程之后,便可以通过命令printf "%x\n" pid这里命令是要把线程pid换成16进制的。如图所示: image.png 然后通过命令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,备注- 技术交流  。或关注微信公众号【码上遇见你】。