线上CPU飙升问题如何排查 - Java版

Java线上CPU飙升问题如何排查

CPU飙高是一个在线上环境常见且严重的问题,通常会导致系统响应变慢、服务不可用,甚至引发崩溃

对于后端开发来说,学会排查处理问题也是自身综合能力的体现,有效的梳理排查和解决CPU飙高问题的思路

常见的CPU飙高原因

线上CPU飙高,一般是由以下这些因素引起的:

  1. 代码出现死循环,结合应用日志分析
  2. 大量FullGC,结合JVM监控GC相关指标,可能内存也存在异常
  3. 突发压力,通过反向代理的 Access Log 进行细化定位
  4. 不当的线程同步,比如死锁,结合线程堆栈分析deadlock
  5. 大量的线程上下文切换
  6. 出现耗时过长的密集计算,通常需要结合监控平台响应时间来分析

案例分析

假设线上有一份SpringBoot的Web工程CpuLoadDemo,写一个死循环代码,把代码跑起来

java 复制代码
@RestController
public class Controller {

    @GetMapping("/cpuLoadTest")
    public String cpuLoadTest() {
        while(true) {
            
        }
    }
}

1.定位高CPU占用进程

服务启动后,在浏览器地址栏访问http://ip:port/cpuLoadTest,浏览器会一直处于等待状态,用top命令查看

可以看到我们刚才启动的java进程几乎快占满了CPU,记录下这个java进程的进程ID为1

2.根据进程ID查找导致CPU飙高的线程

shell 复制代码
ps H -eo pid,tid,%cpu | grep 2044058

这个命令显示3列,第一列为进程2044058,第二列位2044058进程内的各个线程ID,第三列为各个线程所占用的CPU。

这里可以看到2044276这个线程占用的cpu最高,快占用了50%,这里我们定位到了导致CPU飙高的线程,获取这个线程ID

3.将线程ID转换为16进制

用以下命令将线程1转换为16进制

shell 复制代码
printf "%x\n" 2044276

获取到这个线程的16进制为1

4.获取线程堆栈信息

执行以下命令获取这个高CPU线程的堆栈信息

shell 复制代码
jstack 1|grep -A 10 2044276

jstack <线程ID> :用于查找这个java进程的所有的线程快照,线程快照包含线程堆栈的详细信息

从线程的堆栈信息可以看出,问题代码在cpuloaddemo着个模块的Controller代码的第11行,位于cpuloadTest函数

5.根因分析

检查Controller代码的第11行

发现11行这里写了死循环,导致程序运行过程中CPU飙高

总结

线上CPU使用率突然飙升是一个相当复杂的问题,可能由很多种原因引发,本文举的只是一个简单案例,真实场景远比这复杂的多

通过简单案例的思路梳理,在脑海里有排查问题的思路,从基础的初步检查和问题定位开始,逐步深入分析线程、代码,以及系统资源

和运行环境。同时,构建全面的性能监控体系、定期进行代码评审与系统优化,开展压力测试等,都是预防CPU飙高问题的重要手段

相关推荐
GreenTea1 小时前
7000 万 QPS、500 PB:OpenAI 如何用一个 Python 存储平台撑住 10 亿用户
后端·架构
Flynt2 小时前
Java 27 升级实测:默认值动得比新特性多,有个老参数会让 JVM 直接起不来
java·jvm·后端
Bs_MoneyMagnet2 小时前
基于springboot+vue的个人健康管理系统的设计与实现 源码+文档
java·vue.js·spring boot·后端·vue3·springboot3·计算机毕业设计
GreenTea2 小时前
OpenAI Agents API 上手实测:一次调用把整个 agent loop 甩给 OpenAI
前端·后端·算法
Bs_MoneyMagnet4 小时前
基于springboot+vue的心理咨询预约与随访平台的设计与实现 源码+文档
vue.js·spring boot·后端·spring·毕业设计·旅游·计算机毕业设计
IT_陈寒5 小时前
Vue的响应式更新把我坑惨了,原来问题出在这
前端·人工智能·后端
陌シ未央ゞ6 小时前
基于BM25算法和RRF实现的混合索引(java版)
人工智能·spring boot·后端·算法
第五页的你6 小时前
SpringBoot基础设施配置(Redis序列化,JJWT新版)
后端
吃饱了得干活6 小时前
RabbitMQ 原理解析(下):存储、集群与可靠投递
后端·rabbitmq
SelectDB6 小时前
某头部保险公司基于 SelectDB 的统一 OLAP 架构实践
后端