一、紧急响应:5秒定位问题进程
# 1. 快速查看CPU占用TOP进程(按CPU降序)
top -c -o %CPU          # 传统top工具
htop                    # 更直观的替代方案(需安装)

# 2. 精简版命令(适用于自动化监控)
ps -eo pid,ppid,cmd,%cpu,%mem --sort=-%cpu | head -n 10

输出关键列解读

  • %CPU:进程CPU占用百分比

  • COMMAND:进程名(注意异常路径如/tmp/.xxx可能是恶意程序)


二、深度诊断:4类常见原因与排查方法
1. 用户空间进程占用高(90%场景)

排查工具

# 查看进程的详细线程占用
pidstat -p <PID> 1 5     # 监控特定进程
perf top -p <PID>        # 分析热点函数(需root)

# 检查是否挖矿病毒(常见特征)
ls -al /proc/<PID>/exe   # 查看进程真实路径
netstat -tulnp | grep <PID> # 检查异常连接

典型案例

  • Java应用崩溃jstack <PID> > thread_dump.log 分析线程死锁

  • PHP-FPM进程暴增:调整pm.max_children并检查慢查询日志

2. 内核态占用高(sy%异常)

诊断命令

vmstat 1 10              # 查看系统上下文切换(cs列)
dmesg | grep "CPU"       # 检查CPU相关内核报错
perf record -a -g        # 记录内核调用栈(生成flame graph)

常见原因

  • 网络中断集中cat /proc/interrupts 查看IRQ分布

  • 文件系统频繁sync:优化/etc/fstab挂载参数(如noatime

3. I/O等待导致CPU假高(wa%>30%)
iostat -x 1 10           # 查看await/%util指标
iotop -o                 # 显示实时I/O进程

优化方案

  • 数据库:调整innodb_io_capacity

  • 日志服务:改用异步写入或限制日志级别

4. 硬件/内核问题
  • CPU过热sensors查看温度(超过90°C需警惕)

  • 内核BUGcat /var/log/kern.log | grep "CPU"


三、优化方案:对症下药
问题类型 短期解决 长期优化
异常进程 kill -9 <PID> 配置进程监控(如supervisor)
线程阻塞 重启服务 代码优化(避免死锁/无限循环)
配置不合理 调整进程数(如nginx worker) 压力测试+弹性伸缩
内核瓶颈 重启服务器 升级内核或切换发行版

具体操作示例

# 限制进程CPU使用(临时方案)
cpulimit -p <PID> -l 50   # 将进程CPU限制在50%

# 调整进程优先级
renice -n 19 -p <PID>     # 设置为最低优先级

四、防御性运维:预防CPU爆满
  1. 监控告警

    # 添加Zabbix监控项(触发告警阈值)
    system.cpu.util[,user,avg1]>90
  2. 资源限制

    # 使用cgroups限制组资源
    cgcreate -g cpu:/app_group
    cgset -r cpu.cfs_quota_us=50000 app_group  # 限制50%CPU
  3. 自动化脚本

    # 当CPU>95%时自动抓取分析(保存到/var/log/cpu_emergency)
    #!/bin/bash
    if [ $(top -bn1 | grep "Cpu(s)" | awk '{print 100 - $8}') -gt 95 ]; then
        ps -eo pid,ppid,cmd,%cpu > /var/log/cpu_emergency/$(date +%s).log
    fi

五、经典案例库

案例1:MySQL CPU 100%

  • 现象mysqld进程持续高占用

  • 排查

    sql

    SHOW PROCESSLIST;          -- 查看运行中的查询
    SELECT * FROM sys.schema_table_lock_waits; -- 检查锁竞争
  • 解决:优化慢查询(添加索引)或kill阻塞进程

案例2:Docker容器占用高

  • 命令

    docker stats              # 查看容器资源占用
    docker exec -it <容器ID> top
  • 方案:限制容器CPU份额:docker run --cpus=0.5


总结:CPU 100%问题解决流程
1️⃣ 快速定位top → pidstat → perf 三层分析
2️⃣ 分类处理:区分用户态/内核态/I/O等待
3️⃣ 根治优化:代码/配置/架构级改进
4️⃣ 建立防御:监控+资源限制+自动化响应

附:推荐工具包

  • 火焰图生成:perf + FlameGraph

  • 压力测试:stress-ng

  • 容器诊断:cadvisor

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐