0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

典型CPU故障应急处理实战

马哥Linux运维 来源:马哥Linux运维 2025-08-13 15:53 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

线上CPU 100%故障应急处理实战:3分钟内快速定位问题的终极指南

真实案例背景:凌晨2点,监控告警疯狂响起,电商网站访问缓慢,用户投诉激增。服务器CPU使用率飙升至100%,你有3分钟时间找到问题根源,否则将面临巨大的业务损失...

作为一名有着8年运维经验的老司机,我经历过无数次深夜被电话叫醒的"惊喜"。今天分享一次典型的CPU 100%故障处理全过程,希望能帮你在关键时刻快速定位问题。

故障现象:用户体验急剧下降

时间线回顾

• 02:15 - 监控告警:服务器CPU使用率持续超过95%

• 02:16 - 用户反馈:页面加载超过10秒

• 02:17 - 运营通知:订单量断崖式下跌

• 02:18 - 开始紧急排查...

关键指标异常

# 系统负载异常高
load average: 8.5, 7.2, 6.8 # 正常应该在2以下
# CPU使用率
%Cpu(s): 98.2 us, 1.2 sy, 0.0 ni, 0.6id
# 内存使用正常
KiB Mem : 16GB total, 2GB free

第一步:快速定位CPU消耗大户(30秒内)

使用top命令进行初步排查

# 按CPU使用率排序,实时刷新
top -o %CPU

# 输出示例
PID  USER  PR NI  VIRT  RES  SHR S %CPU %MEM   TIME+ COMMAND
12847 www  20  0 2.2g  1.8g  12m R 89.5 11.2  145:32 java
8934  mysql 20  0 1.6g  800m  32m S 8.2  5.1  23:45 mysqld
3421  nginx 20  0 128m  45m  8m  S 1.2  0.3   2:34 nginx

关键发现:Java进程(PID 12847)占用89.5%的CPU!

深入分析Java进程内部线程

# 查看Java进程内部线程CPU使用情况
top -H -p 12847

# 输出关键信息
PID  USER  PR NI  VIRT  RES  SHR S %CPU %MEM   TIME+ COMMAND
12851 www  20  0 2.2g  1.8g  12m R 45.2 11.2  89:23 java
12856 www  20  0 2.2g  1.8g  12m R 44.3 11.2  78:45 java
12863 www  20  0 2.2g  1.8g  12m S 2.1 11.2  5:34 java

重要线索:两个线程(12851、12856)消耗了近90%的CPU资源!

第二步:精确定位问题代码(2分钟内)

获取Java线程堆栈信息

# 将线程ID转换为16进制(Java堆栈中使用16进制)
printf"0x%x
"12851 # 输出:0x3233
printf"0x%x
"12856 # 输出:0x3238

# 获取Java进程完整堆栈
jstack 12847 > /tmp/java_stack.txt

# 在堆栈中查找对应线程
grep -A 20"0x3233"/tmp/java_stack.txt

堆栈分析结果

"pool-2-thread-1"#23prio=5os_prio=0tid=0x... nid=0x3233runnable
 java.lang.Thread.State: RUNNABLE
    at com.company.service.OrderService.calculateDiscount(OrderService.java:245)
    at com.company.service.OrderService.processOrder(OrderService.java:189)
    at com.company.controller.OrderController.submitOrder(OrderController.java:67)
    - locked <0x000000076ab62208> (a java.lang.Object)

"pool-2-thread-2"#24prio=5os_prio=0tid=0x... nid=0x3238runnable 
 java.lang.Thread.State: RUNNABLE
    at com.company.service.OrderService.calculateDiscount(OrderService.java:245)
    - waiting to lock <0x000000076ab62208> (a java.lang.Object)

关键发现

1. 问题定位到OrderService.calculateDiscount方法的245行

2. 存在锁竞争问题,多个线程在争夺同一个锁资源

3. 线程状态显示为RUNNABLE但实际在等待锁

第三步:代码层面问题分析

查看问题代码

// OrderService.java 第245行附近
publicsynchronizedBigDecimalcalculateDiscount(Order order){
 // 问题代码:在同步方法中执行了耗时的外部API调用
 try{
   // 调用第三方优惠券验证API - 耗时3-5秒
   CouponValidationResultresult=thirdPartyApi.validateCoupon(order.getCouponCode());
   
   // 复杂的折扣计算逻辑
   for(inti=0; i < 1000000; i++) {  // 模拟复杂计算
            // 大量计算操作
        }
        
        return calculateFinalDiscount(result, order);
    } catch (Exception e) {
        log.error("折扣计算失败", e);
        return BigDecimal.ZERO;
    }
}

问题根因分析

1.锁粒度过大:整个方法使用synchronized,导致所有折扣计算串行执行

2.耗时操作在锁内:第三方API调用在锁保护范围内,严重影响并发性能

3.复杂计算逻辑:大量循环计算进一步加剧了锁竞争

第四步:紧急处理方案(1分钟内执行)

临时解决方案:限流 + 缓存

# 1. 紧急重启应用(如果可接受短暂中断)
systemctl restart your-app

# 2. 开启Nginx限流(降低并发压力)
# /etc/nginx/conf.d/rate-limit.conf
limit_req_zone$binary_remote_addrzone=order:10m rate=10r/s;

location /api/order {
  limit_req zone=order burst=20 nodelay;
  proxy_pass http://backend;
}

# 重载Nginx配置
nginx -s reload

# 3. 临时禁用优惠券功能(业务降级)
# 在配置中心快速切换feature flag
curl -X PUT http://config-center/api/features/coupon-validation 
 -d'{"enabled": false}'

第五步:根本性修复方案

代码重构:异步化 + 细粒度锁

@Service
publicclassOrderService{
 
 privatefinalRedisTemplate redisTemplate;
 privatefinalCouponValidationService couponService;
 
 // 移除synchronized,改为细粒度锁控制
 publicCompletableFuturecalculateDiscountAsync(Order order){
   returnCompletableFuture.supplyAsync(() -> {
     StringlockKey="discount_calc_"+ order.getUserId();
     
     // 使用Redis分布式锁,避免单机锁竞争
     returnredisTemplate.execute(newRedisCallback() {
       @Override
       publicBigDecimaldoInRedis(RedisConnection connection){
         try{
           // 尝试获取锁,超时时间1秒
           BooleanlockAcquired=connection.setNX(
              lockKey.getBytes(),"1".getBytes()
            );
            connection.expire(lockKey.getBytes(),5);// 5秒过期
           
           if(lockAcquired) {
             returndoCalculateDiscount(order);
            }else{
             // 获取锁失败,返回默认折扣
             returngetDefaultDiscount(order);
            }
          }finally{
            connection.del(lockKey.getBytes());
          }
        }
      });
    });
  }
 
 privateBigDecimaldoCalculateDiscount(Order order){
   // 1. 先检查缓存
   StringcacheKey="discount_"+ order.getCouponCode();
   BigDecimalcachedDiscount=(BigDecimal) redisTemplate.opsForValue().get(cacheKey);
   if(cachedDiscount !=null) {
     returncachedDiscount;
    }
   
   // 2. 异步调用第三方API,设置超时时间
    CompletableFuture apiCall =
      couponService.validateCouponAsync(order.getCouponCode())
        .orTimeout(2, TimeUnit.SECONDS) // 2秒超时
        .exceptionally(ex -> {
          log.warn("优惠券验证超时,使用默认策略", ex);
         returnCouponValidationResult.defaultResult();
        });
   
   try{
     CouponValidationResultresult=apiCall.get();
     BigDecimaldiscount=calculateFinalDiscount(result, order);
     
     // 3. 缓存结果,避免重复计算
      redisTemplate.opsForValue().set(cacheKey, discount, Duration.ofMinutes(10));
     
     returndiscount;
    }catch(Exception e) {
      log.error("折扣计算异常", e);
     returngetDefaultDiscount(order);
    }
  }
}

性能监控改进

// 添加方法级别的性能监控
@Around("@annotation(Timed)")
publicObjectlogExecutionTime(ProceedingJoinPoint joinPoint)throwsThrowable {
 longstart=System.currentTimeMillis();
 Objectproceed=joinPoint.proceed();
 longexecutionTime=System.currentTimeMillis() - start;
 
 // 超过1秒的方法记录告警
 if(executionTime >1000) {
    log.warn("方法执行时间过长: {} ms, 方法: {}",
        executionTime, joinPoint.getSignature());
  }
 
 returnproceed;
}

第六步:效果验证与长期监控

修复前后对比

指标 修复前 修复后 改善幅度
CPU使用率 98% 25% ↓ 73%
响应时间 8-12秒 200-500ms ↓ 95%
并发处理能力 10 TPS 200 TPS ↑ 1900%
系统负载 8.5 1.2 ↓ 86%

建立预警机制

# Prometheus告警规则
groups:
- name: cpu_alerts
 rules:
 - alert: HighCPUUsage
 expr: cpu_usage_percent > 80
 for: 2m
  annotations:
   summary:"服务器CPU使用率过高"
   description:"CPU使用率已达到{{$value}}%,持续超过2分钟"
  
 - alert: JavaThreadBlocked
 expr: jvm_threads_blocked_count > 10
 for: 1m
  annotations:
   summary:"Java线程阻塞数量异常"
   description:"阻塞线程数量:{{$value}}"

业务影响与价值总结

直接收益

故障处理时间:从平均30分钟缩短到3分钟

用户体验提升:页面响应时间从10秒降至0.5秒

业务损失避免:预估避免每小时50万元的订单损失

技术债务清理

• 重构了23个类似的同步方法

• 建立了完整的性能监控体系

• 制定了代码review检查清单

经验总结:运维老司机的5个黄金法则

1. 建立分层监控体系

# 系统层监控
- CPU/Memory/Disk/Network基础指标
- Load Average和进程状态

# 应用层监控 
- JVM堆内存、GC状况、线程状态
- 接口响应时间、错误率、TPS

# 业务层监控
- 关键业务指标实时追踪
- 用户行为数据异常检测

2. 掌握快速定位工具链

# CPU问题定位三板斧
top → jstack → 代码分析

# 常用命令组合
ps aux | grep java     # 找到Java进程
top -H -p       # 查看进程内线程
jstack  | grep -A 10 # 分析线程堆栈

3. 制定标准化应急预案

2分钟:问题确认和初步定位

5分钟:实施临时解决方案

30分钟:根因分析和永久修复

1小时:复盘总结和预防措施

4. 重视代码性能review

锁使用原则:锁粒度最小化,锁持有时间最短化

异步化改造:耗时操作必须异步化处理

缓存策略:合理使用多级缓存避免重复计算

5. 建立知识库和工具箱

每次故障处理后都要沉淀:

故障案例库:典型问题的诊断和解决步骤

脚本工具箱:自动化诊断和修复脚本

监控仪表板:可视化的系统健康状态

写在最后

作为运维工程师,我们就是系统的"医生"。面对CPU 100%这样的"急症",需要的不仅是技术能力,更重要的是冷静的分析思路和系统性的解决方案。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • cpu
    cpu
    +关注

    关注

    68

    文章

    11216

    浏览量

    222914
  • 服务器
    +关注

    关注

    13

    文章

    10094

    浏览量

    90875

原文标题:线上CPU 100%故障应急处理实战:3分钟内快速定位问题的终极指南

文章出处:【微信号:magedu-Linux,微信公众号:马哥Linux运维】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    CPU典型故障剖析

    CPU典型故障剖析 电脑故障急救系列之一:CPU典型
    发表于 01-05 16:01

    CPU常见故障处理

    CPU常见故障处理    1.质量问题导致的故障   我们经常遇到的电脑故障,虽然无奇不有,但还是那几个重要的硬件,比如:
    发表于 01-05 16:06

    CPU常见故障处理

    CPU常见故障处理一、CPU常见故障处理   1.质量问题导致的
    发表于 03-16 10:14

    eps应急电源常见故障和维修

    复位信号是不是正常,复位脉冲有没有正确送到CPU芯片的复位脚。4、eps应急电源中数据总线、地址总线、控制总线的任何一根开路或短路都可引发故障,可以通过测试平行总线的对地 电阻 比较某路有没有
    发表于 02-28 14:12

    【修复】消防应急故障检测及修复

    DIY&分享—GravityShare之前拆解的一款消防应急照明灯使用的时候出现故障了,只要接上市电就会故障指示灯常亮而且断掉市电之后照明灯闪一下就熄灭了,这次就来进一步对这款应急灯进
    发表于 05-24 16:33

    EJA智能双法兰差压变送器的典型故障处理

    摘要:针对EJA 智能双法兰差压变送器的具体应用情况,介绍了其典型故障的详细处理方法。实践证明:只有正确运用和维护,才能保证仪表的长期稳定运行。关键词智能变送器
    发表于 01-18 23:14 43次下载

    设备故障应急处理的方法与技巧

    论述掌握设备故障应急处理方法对企业生产的重要性,通过大量实例介绍设备抢修过程中常用的几种故障应急处理
    发表于 12-29 16:33 20次下载

    主动数据库在联锁故障应急处理中的应用

    根据计算机联锁故障应急处理系统的功能要求,提出了用于计算机联锁故障应急处理的主动数据库模型,定义
    发表于 02-25 14:51 8次下载

    常见CPU故障处理方法

    常见CPU故障处理方法 ●频率有时自动降低开机后本来166MHz的CPU
    发表于 01-12 10:21 1079次阅读

    笔记本启动故障修复实战

    笔记本启动故障修复实战 同学使用的一台IBM T23笔记本电脑,一个月前出现了偶尔不能启动的故障,由于出现故障的频率不高所以并未
    发表于 01-23 11:21 728次阅读

    视频系统的故障排除和应急处理

    视频系统的故障排除和应急处理 系统安全注意事项   设备在日常使用中要注意保持清洁和防尘,而且切忌勤开勤关。比如:在开启系
    发表于 02-21 09:12 881次阅读

    KGPS型可控硅中频电源典型故障处理

    KGPS型可控硅中频电源典型故障处理(电源技术存在的问题总结)-KGPS型可控硅中频电源典型故障处理
    发表于 09-24 09:15 19次下载
    KGPS型可控硅中频电源<b class='flag-5'>典型</b><b class='flag-5'>故障</b><b class='flag-5'>处理</b>

    常见的CPU故障有哪些

    中央处理器简称CPU,是计算机系统的执行单元,基本功能为处理指令、执行操作、控制时间、处理数据。那么常见的CPU
    的头像 发表于 01-17 15:41 1.4w次阅读

    消防应急灯常见故障问题及处理方法介绍

    消防应急灯常见故障问题及处理方法介绍 我们经常接触到的一些公共场所,比如大学、写字楼、大型商场、休闲娱乐俱乐部,就会看到很多消防应急灯。这种灯的主要用途往往被我们忽视,以为它们的作用只
    发表于 12-28 09:56 1.8w次阅读

    消防应急灯的主要故障及排除方法介绍

    【大成智慧】消防应急灯的主要故障及排除方法介绍 应急灯指的是电源发生故障时,正常照明无法使用的情况下启动的照明灯。比如说因为火灾导致正常照明系统失效时,消防疏散照明灯,消防
    的头像 发表于 07-13 16:35 1.3w次阅读