对线面试官 - 绝无仅有真实线上问题排查面试题突击篇
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%排查命令:
无法 kill 进程相关排查命令
如有问题,欢迎加微信交流:w714771310,备注- 技术交流 。或关注微信公众号【码上遇见你】。
版权声明: 本文为 InfoQ 作者【派大星】的原创文章。
原文链接:【http://xie.infoq.cn/article/ff8f7d4848b072f294d1d4a77】。
本文遵守【CC BY-NC-ND】协议,转载请保留原文出处及本版权声明。
评论