作者:Hollis
来源:公众号Java之道

在国外开发者平台发布的2018年开发者技能调查报告中,有一项关于“哪些核心能力最受雇主看重”的调查,结果如下:

高防服务器服务_服务器的cpu

最受重视的能力是:问题解决、编程语言熟练程度、调试、系统设计和性能优化。

解决问题的能力以超高的比例排在第一位,这也是为什么面试官在很多面试中喜欢问以下问题:

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

接下来通过命令查看堆栈信息:

服务器的cpu_高防服务器服务

通过上面的代码我们可以清楚的看到.java的第30行可能有问题。

问题解决了

接下来就是通过看代码来解决问题了。 我们发现我们自定义了一个,封装了,然后在方法中通过.().()初始化了一个实例。 通过分析,我们发现实例化过程比较耗时。 小时。

我们重构了代码,在方法外提到了实例的初始化,在类初始化的时候就创建了一次,解决了问题。

总结

上面展示了一个比较完整的在线问题定位流程。主要用到的命令有:top、and

此外,还可以使用开源工具来排查线上问题。 可以使用如下命令来定位上述问题:

thread -n 3 //查看cpu占比前三的线程

以上,本文介绍了如何排查线上服务器CPU占用率高的问题。 如果有兴趣,后面可以介绍一些针对负载高、GC频繁等问题的排查方法。

对于此次故障排除,您有什么想说的吗? 欢迎交流。

好了,今天的主题就讲到这里吧,不管如何,能帮到你我就很开心了,如果您觉得这篇文章写得不错,欢迎点赞和分享给身边的朋友。

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注