线上服务器CPU100%了,该怎么排查、定位、解决?

你好,我是洋一,一个持续向上生长的互联网人。

再三考虑,准备出一些 Java面试系列 的文章,希望对你有帮助。

问你

线上生产服务器 CPU 100%了,你是如何排查、定位以及解决问题?

作甚

面试官问你,主要是想看看你有没有处理高负载的线上问题。考察对于此类问题,是否有一套自己的打法,是否你能熟练运用一些命令去排查、定位和解决问题的能力。对于开发来讲,是基本功,是需要主动掌握的。

解决

一般 CPU 100%,基本都是代码死循环造成的。

排查的核心思路是 找到对应服务器,定位是哪个进程的哪个线程中的哪些代码引发的问题,可以简单介绍当时的异常代码示例。

1. 使用 top -c 命令定位当前进程

top -c,可以显示当前进程的运行列表,然后输入 P,按照 CPU 的使用率进行排序。

演示,非异常情况

如上图仅为演示效果,这样我们就能很清晰地看到哪个进程的 CPU 负载最大。比如 显示进程 PID2479501 的 Java进程负载消耗最大。

2. 定位负载最大进程对应的线程

使用命令 top -Hp 2479501 找到这个进程对应的线程,然后输入 P ,按照 CPU 的使用率进行排序。

如上图所示,我们可以看到 2479508 耗费 CPU 最大。

3. 定位哪段代码导致 CPU 过高

因线程 PID 2479508 是十进制,我们需要将其转换为 十六进制 ,为什么要将十进制转换为十六进制 ?因为计算机需要二进制,十六是二的四次方,而十进制不是二的整数次幂,十六进制方便我们可读。比如,其转换结果是:25d594

接着,我们需要使用 jstack 打印进程的堆栈信息,再通过 grep 查看对应线程相关的东西。

jstack 2479501 | grep ‘25d594’ -C5 --color

这个时候就可以打印出代码,基本上帮助我们定位到出问题的位置,可以看到是哪个类中的哪个方法导致此次 CPU 100% 的原因了。

好了,今天就到这里!如上,希望对你有价值,感谢各位的点赞、收藏和评论,我们下期见!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值