
1. Linux服务器CPU占用过高排查指南作为一名运维老兵我处理过的服务器CPU爆满问题不下百次。每次半夜被报警短信吵醒看着监控图上那条直冲100%的红线都得迅速定位问题根源。本文将分享我多年实战中总结的CPU问题排查方法论从快速止血到深度分析手把手带你掌握这套望闻问切的排查流程。2. 核心排查思路与工具选型2.1 诊断工具全景图Linux系统自带的性能分析工具链堪称运维人员的瑞士军刀。根据问题场景不同我会分层使用这些工具全局监控层top/htop实时、vmstat系统级、dstat增强版进程分析层pidstat细粒度、ps aux --sort-%cpu排序线程级分析top -H -p 、pstree -p调用链追踪strace系统调用、perf性能热点高级诊断sar历史数据、bpftrace内核级经验安装sysstat包后使用pidstat 1比单纯用top更能看清瞬时CPU波动2.2 快速定位问题方向通过几个关键指标可以快速判断问题类型CPU负载与使用率关系load average CPU核心数且%us高 → 应用层问题%sy过高 → 内核或系统调用频繁%wa高 → I/O等待导致CPU闲置用户态/内核态占比# 查看CPU模式分布 mpstat -P ALL 1输出示例08:30:01 AM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle 08:30:02 AM all 85.23 0.00 12.31 0.25 0.00 0.21 0.00 0.00 0.00 2.00典型问题特征速查表现象组合可能原因下一步动作%us高 load高业务代码问题分析Java/Python进程%sy高 上下文切换频繁锁竞争/进程调度检查mutex和线程数%wa高 iowait高磁盘IO瓶颈检查await和%util软中断高网络包处理检查网络流量和网卡队列3. 详细排查实战流程3.1 第一响应快速止血当CPU持续满载时首先要防止系统雪崩隔离问题节点如果是集群# 从负载均衡池摘除节点 echo 0 /proc/sys/net/ipv4/ip_forward限制异常进程# 临时限制CPU使用 cpulimit -l 50 -p PID # 或使用cgroups cgcreate -g cpu:/limit_group echo 100000 /cpu/limit_group/cpu.cfs_quota_us echo PID /cpu/limit_group/tasks保留现场证据# 抓取进程快照 ps auxf /tmp/ps_$(date %s).log # 保存JVM线程栈如果是Java应用 jstack PID /tmp/jstack_$(date %s).log3.2 深度分析五步定位法步骤1定位问题进程# 按CPU排序显示进程 top -c -o %CPU # 或使用更直观的htop F6 - PERCENT_CPU - 回车步骤2分析进程内部# 查看进程的线程CPU占用 top -H -p PID # 统计系统调用 strace -cp PID # 采样调用栈30秒 perf record -F 99 -p PID -g -- sleep 30 perf report步骤3检查关联资源# 查看文件打开数 ls -l /proc/PID/fd | wc -l # 检查内存使用 pmap -x PID # 网络连接统计 ss -tunap | grep PID步骤4验证配置参数# 检查进程限制 cat /proc/PID/limits # 查看内核参数 sysctl -a | grep sched\|timer步骤5历史对比分析# 查看sar历史数据 sar -u -f /var/log/sa/sa$(date %d -d yesterday) # 对比正常时段的CPU使用模式4. 典型场景案例库4.1 Java应用CPU飙升特征%us高大量RUNNABLE线程可能存在锁竞争排查步骤获取线程栈jstack PID jstack.log转换线程IDprintf %x\n 十进制线程ID分析热点代码# 采样Java方法调用 perf record -e cpu-clock -g -p PID perf report常见原因死循环如while(true)空转锁竞争查看BLOCKED状态线程频繁GC配合jstat -gcutil分析4.2 内核态CPU占用高特征%sy 30%上下文切换频繁cs/sec高排查命令# 查看系统调用统计 perf top -e raw_syscalls:sys_enter # 检查软中断 watch -d -n 1 cat /proc/softirqs解决方案调整内核参数echo net.ipv4.tcp_max_tw_buckets20000 /etc/sysctl.conf sysctl -p优化进程调度chrt -f -p 99 PID4.3 定时任务风暴现象CPU使用率周期性飙升存在大量sh或cron进程定位方法# 查看最近执行的命令 grep CRON /var/log/cron | tail -20 # 检查anacron任务 ls -l /etc/cron.*/处理方案# 临时禁用cron systemctl stop crond # 调整任务时间分布 for i in {0..59}; do echo $i * * * * sleep $(($RANDOM % 30)); /path/to/job /etc/crontab done5. 高级诊断技巧5.1 使用BPF深度分析# 跟踪CPU使用最高的函数 bpftrace -e profile:hz:99 { [ustack] count(); } # 统计进程调度延迟 bpftrace -e tracepoint:sched:sched_switch { [kstack] hist(args-prev-prio); }5.2 性能热点火焰图生成步骤采集数据perf record -F 99 -a -g -- sleep 60生成SVGperf script | stackcollapse-perf.pl | flamegraph.pl flame.svg分析要点看最宽的火苗注意平顶部分检查调用链深度5.3 容器环境特殊处理在Docker中需要额外注意# 进入容器namespace nsenter -t PID -m -u -i -n -p # 查看cgroups限制 cat /sys/fs/cgroup/cpu/cpu.cfs_quota_us6. 长效防护机制6.1 监控告警配置推荐Prometheus监控指标node_cpu_seconds_total{modeuser}process_cpu_seconds_totalrate(node_cpu_seconds_total[1m])告警规则示例- alert: HighCPUUsage expr: 100 - (avg by(instance)(rate(node_cpu_seconds_total{modeidle}[5m])) * 100) 85 for: 10m6.2 自动化排查脚本保存以下为cpu_diag.sh#!/bin/bash LOG_DIR/tmp/cpu_diag_$(date %s) mkdir $LOG_DIR # 基础信息 top -b -n 1 $LOG_DIR/top.log ps aux --sort-%cpu $LOG_DIR/ps.log vmstat 1 10 $LOG_DIR/vmstat.log # 深度诊断 for pid in $(ps -eo pid,%cpu --sort-%cpu | awk $230 NR1 {print $1}); do echo PID $pid $LOG_DIR/deep.log cat /proc/$pid/cmdline $LOG_DIR/deep.log echo $LOG_DIR/deep.log strace -cp $pid $LOG_DIR/deep.log 21 done tar czf $LOG_DIR.tar.gz $LOG_DIR echo 诊断包已保存到 $LOG_DIR.tar.gz6.3 内核参数调优建议# 调整进程调度 echo kernel.sched_min_granularity_ns 10000000 /etc/sysctl.conf echo kernel.sched_wakeup_granularity_ns 15000000 /etc/sysctl.conf # 减少上下文切换 echo vm.dirty_ratio 10 /etc/sysctl.conf echo vm.dirty_background_ratio 5 /etc/sysctl.conf sysctl -p7. 避坑指南与经验总结不要立即kill进程先保留现场证据避免问题复现困难注意观察间隔top默认3秒刷新可能错过瞬时峰值建议用top -d 0.5 -c警惕监控盲区某些CPU密集型操作可能在采样间隔之间完成容器环境差异容器内看到的CPU是宿主机的使用docker stats看到的才是容器真实的CPU限制多核CPU陷阱# 查看CPU亲和性 taskset -pc PID # 绑定到特定核心可能提升缓存命中率 taskset -c 0,1 command历史数据分析技巧# 查看过去24小时的CPU峰值时刻 sar -u -f /var/log/sa/sa$(date %d) | awk $NF 40 {print $1,$3}硬件因素排查# 检查CPU频率 cat /proc/cpuinfo | grep MHz # 查看CPU节流适用于云环境 grep -E thermal_throttle|clock_limiting /var/log/messages终极排查思路用户态问题 → 分析应用代码/配置内核态问题 → 检查系统调用/驱动硬件问题 → 查看dmesg/温度传感器