作者:Hollis 来源:公众号Java之道
在国外开发者平台发布的2018年开发者技能调查报告中,有一项关于“哪些核心能力最受雇主看重”的调查,结果如下:
最受重视的能力是:问题解决、编程语言熟练程度、调试、系统设计和性能优化。
解决问题的能力以超高的比例排在第一位,这也是为什么面试官在很多面试中喜欢问以下问题:
1、你这个项目遇到的最大挑战是什么?如何解决的? 2、如果线上发生了报警你回如何排查呢? 3、你有解决过什么线上问题吗? 4、能列举几个你知道的排查Linux服务器线上问题的命令吗?
这些都是比较常见的问题,还有一些更具体的问题是很多开发者需要掌握的,比如:
1、线上服务器Load飙高如何排查? 2、线上服务器CPU占用率高如何排查? 3、线上服务器频繁发生Full GC如何排查? 4、线上服务器发生死锁如何排查?
这些问题的回答,一方面考察面试官是否具有较强的实践经验,另一方面也能体现其解决问题的能力。
毫无疑问,作为一名开发人员,定位和解决问题的能力至关重要。 因为一旦线上出现问题,比如CPU占用率高,如果不及时解决,很容易导致网站响应慢、服务器宕机等问题。
那么,本书又回到了主线故事。 本文简单介绍一下线上服务器CPU占用率过高时如何排查和定位问题。
问题发现
本文根据真实案例整理而成,是楼主的生意。 这个问题是在大促前的压力测试中发现的。
每次大促之前,我们的测试人员都会对网站进行压力测试。 这时他们会检查服务的cpu、内存、负载、rt、qps等指标。
在一次压力测试中,测试人员发现我们的一个接口在qps升至500后,CPU占用率急剧上升。
CPU利用率,也称为CPU使用率。 顾名思义,CPU利用率是用来描述CPU的使用情况,表示CPU在一段时间内被占用的情况。 使用率越高,说明此时你的机器正在运行很多程序,反之亦然。
找出问题
遇到此类问题,首先登录服务器查看具体情况。
定位过程
登录服务器,执行top命令,查看CPU占用率:
top命令是Linux下常用的性能分析工具,它可以实时显示系统中各个进程的资源使用状况,类似于任务管理器。
通过上面的命令,我们可以看到进程ID为1893的Java进程的CPU使用率已经达到了181%,我们基本可以定位是我们的Java应用程序导致了整个服务器的CPU使用率飙升。
定位螺纹
我们知道Java是单进程多线程的,所以我们同样使用top命令来看看PID=1893的Java进程中各个线程的CPU占用情况:
通过top -Hp 1893命令可以发现,当前1893进程中,ID为4519的线程占用CPU最高。
定位码
通过top命令,我们现在已经定位到导致CPU占用率高的具体线程,那么我们来定位哪一行代码出现了问题。
首先,我们需要将线程 4519 转换为十六进制:
$printf %x 4519 11a7
接下来通过命令查看堆栈信息:
通过上面的代码我们可以清楚的看到.java的第30行可能有问题。
问题解决了
接下来就是通过看代码来解决问题了。 我们发现我们自定义了一个,封装了,然后在方法中通过.().()初始化了一个实例。 通过分析,我们发现实例化过程比较耗时。 小时。
我们重构了代码,在方法外提到了实例的初始化,在类初始化的时候就创建了一次,解决了问题。
总结
上面展示了一个比较完整的在线问题定位流程。主要用到的命令有:top、and
此外,还可以使用开源工具来排查线上问题。 可以使用如下命令来定位上述问题:
thread -n 3 //查看cpu占比前三的线程
以上,本文介绍了如何排查线上服务器CPU占用率高的问题。 如果有兴趣,后面可以介绍一些针对负载高、GC频繁等问题的排查方法。
对于此次故障排除,您有什么想说的吗? 欢迎交流。
好了,今天的主题就讲到这里吧,不管如何,能帮到你我就很开心了,如果您觉得这篇文章写得不错,欢迎点赞和分享给身边的朋友。