一. 前言
在Java开发岗位的面试中,时不时会出现一些运维类的题目,其实这也反映了后端面试的一种趋势。现在企业对后端开发的要求越来越全面,不仅要求我们会写代码,还要我们能够进行部署和运维。
今天壹哥就结合一个真实的项目案例,来给大家讲解一道关于运维类的真实面试题。题目如下:SpringBoot项目上线后,发现其部署所在的Linux服务器CPU占用过高,该如何排查解决?
这是一道比较常见的线上排错问题,接下来就让我们我们来分析一下这个问题的解决过程吧。
二. 解决过程
- 问题要点
该问题包含如下两个要点:
如何观察Linux服务器CPU占比;
如何定位到产生问题的Java代码所在线程,判断出当前问题线程到底在执行什么方法。
2. 排查过程
2.1 通过top命令找到CPU消耗过高的进程id
如上图,我们发现CPU占用高的进程pid为71288。
2.2 通过jps输出,配合上面的pid定位到出现问题的具体应用
2.3 执行top -p pid 单独监控该进程
2.4 监控界面输入H,获取当前进程下所有的线程信息,找到CPU消耗特别高的线程编号
由于Java是多线程程序,如果我们只知道进程id还不足以找到出现问题的线程。因此这里需要借助top命令的H交互模式,找到真正CPU占用过高的线程。本案例中的pid是71289,那么接下来距离找出出问题 的方法已经不远了。
2.5 jstack输出线程信息
这一步也是定位问题的关键。jstack命令能够打印出当前所有java栈中的线程信息,其中必然包括出问题的线程。剩下我们要做的就是根据线程的id,找到这个线程正在执行的方法即可。这里71289是十进制整数,而jstack日志中的线程id是十六进制,因此需要做以下转换。
2.6 打开刚刚生成的jstack日志文件,查找关键字 11679
2.7 根据日志,发现出问题的代码在 FmmallApp类的 第14行。
至此,我们就把问题定位完成了,接下来就可以去源代码中进行核对了。
三. 相关命令总结
本文中,我们所使用的Linux服务器端操作命令如下:
# 1.先通过top命令找到消耗cpu很高的进程id
top
# 通过jps的输出配合上面的pid可以定位到出问题的应用是哪个
jps -lv
# 这一步可以得到出问题的进程pid 71288
# 2.执行top -p pid单独监控该进程
top -p pid
# 3.监控界面输入H,获取当前进程下的所有线程信息,找到消耗cpu特别高的线程编号
# 这一步可以得到出问题的线程的pid 71289
# 4.jstack 输出线程信息
jstack pid >> stack.txt
#注意,这里要使用的是java进程的pid
# 5.查找高占用线程,这里需要把线程id转16进制
printf "%x\n" pid
# 6.在stack.txt 中查找线程信息,定位到问题线程的问题方法
# 7.查找出问题的方法的源代码,解决问题。
以后如果你再遇到线上的服务器出现了故障,知道该怎么解决了吗?如果你还有其他问题,可以在评论区留言哦。