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

  • Post author:
  • Post category:其他


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

再三考虑,准备出一些

Java面试系列

的文章,希望对你有帮助。



问你

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



作甚

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



解决

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

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



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


top -c

,可以显示当前进程的运行列表,然后输入

P

,按照 CPU 的使用率进行排序。

演示,非异常情况

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

PID



2479501

的 Java进程负载消耗最大。



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

使用命令

top -Hp 2479501

找到这个进程对应的线程,然后输入

P

,按照 CPU 的使用率进行排序。

如上图所示,我们可以看到

2479508

耗费 CPU 最大。



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

因线程 PID

2479508

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

25d594

接着,我们需要使用

jstack

打印进程的堆栈信息,再通过

grep

查看对应线程相关的东西。

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

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

好了,今天就到这里!

如上,希望对你有价值,感谢各位的点赞、收藏和评论,我们下期见!



版权声明:本文为weixin_43980975原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。