面试拆解:系统上线后Cpu使用率飙升如何排查?

简介: 面试拆解:系统上线后Cpu使用率飙升如何排查?

大家好,我是飘渺。

上次面试官问了个问题:应用上线后Cpu使用率飙升如何排查?

其实这是个很常见的问题,也非常简单,那既然如此我为什么还要写呢?因为上次回答的时候我忘记将线程PID转换成16进制的命令了。

所以我决定再重温一遍这个问题,当然贴心的我还给大家准备好了测试代码,大家可以实际操作一下,这样下次就不会忘记了。


模拟一个高CPU场景


public class HighCpuTest {
    public static void main(String[] args) {
        List<HignCpu> cpus = new ArrayList<>();
        Thread highCpuThread = new Thread(()->{
            int i = 0;
            while (true){
                HignCpu cpu = new HignCpu("Java日知录",i);
                cpus.add(cpu);
                System.out.println("high cpu size:" + cpus.size());
                i ++;
            }
        });
        highCpuThread.setName("HignCpu");
        highCpuThread.start();
    }
}

在main方法中开启了一个线程,无限构建HighCpu对象。

@Data
@AllArgsConstructor
public class HignCpu {
    private String name;
    private int age;
}

准备好上面的代码,运行HighCpuTest,然后就可以开始一些列的操作来发现问题原因了。


排查步骤


第一步,使用 top 找到占用 CPU 最高的 Java 进程

1. 监控cpu运行状,显示进程运行信息列表
top -c
2. 按CPU使用率排序,键入大写的P
P

第二步,用 top -Hp 命令查看占用 CPU 最高的线程

上一步用 top命令找到了那个 Java 进程。那一个进程中有那么多线程,不可能所有线程都一直占着 CPU 不放,这一步要做的就是揪出这个罪魁祸首,当然有可能不止一个。

执行top -Hp pid命令,pid 就是前面的 Java 进程,我这个例子中就是 16738 ,完整命令为:

top -Hp 16738,然后键入P (大写p),线程按照CPU使用率排序

执行之后的效果如下

查到占用CPU最高的那个线程 PID 为 16756

第三步,查看堆栈信息,定位对应代码

通过printf命令将其转化成16进制,之所以需要转化为16进制,是因为堆栈里,线程id是用16进制表示的。(我当时就是忘记这个命令了~)

[root@review-dev ~]# printf "%x\n" 16756
4174

得到16进制的线程ID为4174。

通过jstack命令查看堆栈信息

jstack 16738 | grep '0x4174' -C10 --color

如上图,找到了耗CPU高的线程对应的线程名称“HighCpu”,以及看到了该线程正在执行代码的堆栈。

最后,根据堆栈里的信息,定位到对应死循环代码,搞定。


小结


cpu使用率飙升后如何排查这个问题不仅面试中经常会问,而且在实际工作中也非常有用,大家最好根据上述步骤实际操作一下,这样才能记得住记得牢。

目录
相关文章
|
10天前
|
XML Ubuntu Linux
部署08---扩展-Win10配置WSL(Ubuntu)环境,WSL系统是什么意思,是Windows系统上的一个子系统, xml的一大特点是直链系统,直接链接你的CPU,硬盘和内存,如何用 WSL部署
部署08---扩展-Win10配置WSL(Ubuntu)环境,WSL系统是什么意思,是Windows系统上的一个子系统, xml的一大特点是直链系统,直接链接你的CPU,硬盘和内存,如何用 WSL部署
|
12天前
|
监控 Python
paramiko 模块 ---Python脚本监控当前系统的CPU、内存、根目录、IP地址等信息
paramiko 模块 ---Python脚本监控当前系统的CPU、内存、根目录、IP地址等信息
|
17天前
|
Arthas Java 数据库连接
「性能指标」CPU飙高排查实战
在新应用接入高流量业务后,CPU利用率在压力测试中飙升。通过`top`命令发现Java进程占用CPU高。使用Arthas工具定位到JDBC的TCP套接字读取导致阻塞,问题源于频繁的数据库交互。代码优化后,初始化Sequence实例减少数据库交互,CPU使用下降。后续发现预发布环境的日志采集工具开启导致额外CPU消耗,关闭该功能后问题完全解决。排查CPU问题需耐心和系统性分析。
「性能指标」CPU飙高排查实战
|
22天前
|
Linux 数据处理
Linux中的nproc命令:轻松查看系统CPU核心数
`nproc`命令在Linux中用于查看CPU核心数,简洁高效,无参数直接运行。它读取`/proc/cpuinfo`获取信息,适用于资源分配。例如,`nproc`显示核心数,`nproc --all`(非标准选项,可能需结合其他命令)展示更多详情。在脚本中,可将`nproc`输出赋值给变量以适应动态资源管理。使用时注意文件访问权限,检查结果准确性,并结合其他工具如`lscpu`获取更全面硬件信息。
|
10天前
|
Linux 调度
部署02-我们一般接触的是Mos和Wimdows这两款操作系统,很少接触到Linux,操作系统的概述,硬件是由计算机系统中由电子和机械,光电元件所组成的,CPU,内存,硬盘,软件是用户与计算机接口之间
部署02-我们一般接触的是Mos和Wimdows这两款操作系统,很少接触到Linux,操作系统的概述,硬件是由计算机系统中由电子和机械,光电元件所组成的,CPU,内存,硬盘,软件是用户与计算机接口之间
|
14天前
|
缓存 弹性计算 监控
云服务器 CPU 使用率高的问题排查与优化
云服务器 CPU 使用率高的问题排查与优化
26 0
|
17天前
|
Linux Perl
如何在Linux系统中确定CPU架构
如何在Linux系统中确定CPU架构
17 0
|
2月前
|
Linux
Linux rsyslog占用内存CPU过高解决办法
该文档描述了`rsyslog`占用内存过高的问题及其解决方案。
107 4
|
2月前
|
存储 弹性计算 固态存储
阿里云服务器CPU内存配置详细指南,如何选择合适云服务器配置?
阿里云服务器配置选择涉及CPU、内存、公网带宽和磁盘。个人开发者或中小企业推荐使用轻量应用服务器或ECS经济型e实例,如2核2G3M配置,适合低流量网站。企业用户则应选择企业级独享型ECS,如通用算力型u1、计算型c7或通用型g7,至少2核4G配置,公网带宽建议5M,系统盘可选SSD或ESSD云盘。选择时考虑实际应用需求和性能稳定性。
654 6
|
26天前
汇编语言(第四版) 实验一 查看CPU和内存,用机器指令和汇编指令编程
汇编语言(第四版) 实验一 查看CPU和内存,用机器指令和汇编指令编程

热门文章

最新文章