服务器卡顿之——CPU 性能分析

服务器卡顿很大一部分时候都和 CPU 性能瓶颈 有关,尤其是线上环境突然响应慢、卡顿、甚至假死时,第一反应往往是“CPU 是不是爆了”。

下面用最实操的思路、步骤和命令,带你从“现象 → 定位 → 根因 → 优化”完整走一遍。适用于 CentOS / Ubuntu / Rocky / Debian 等主流发行版(2025-2026 年环境通用)。

第一步:快速 60 秒诊断(先判断是不是 CPU 问题)

敲下面这组命令(复制粘贴执行),60 秒内基本能看出 CPU 是否真的饱和、是哪个方向的问题。

# 1. 系统负载 & 运行时间(最先看)
uptime

# 2. 整体 CPU 使用率 + 每个核分布(sysstat 包里的 mpstat)
mpstat -P ALL 1 5    # 每秒采样 5 次,看每个核心的 %usr %sys %iowait %idle

# 3. 进程级 CPU 占用(top 加强版)
top   # 按 P 按 CPU 降序;按 1 看每个核;按 H 看线程级

# 或者更轻量实时看进程/线程
pidstat 1 5          # 每秒显示一次进程 CPU 使用(需 sysstat 包)

# 4. 经典 vmstat 一眼三行(CPU + 内存 + 上下文切换)
vmstat 1 5

重点看这几个指标怎么判断

指标含义异常阈值建议可能问题方向
load average1/5/15min 平均可运行+不可中断进程数> 核数 × 1.5–2 持续高系统整体超载
%usr用户态 CPU(业务代码、应用)>70–80% 持续业务逻辑 / 死循环 / 计算密集
%sys内核态 CPU(系统调用、调度、驱动)>30–40% 持续频繁系统调用 / 锁竞争 / 网络/IO
%iowait等待 IO 的 CPU>20–30% 持续磁盘/网络 IO 瓶颈(伪 CPU 高)
%idle真正空闲<10–20% 持续CPU 真饱和
context switches (vmstat cs)上下文切换次数/秒> 几千–上万持续线程/进程过多、锁竞争

如果 %idle 很低 + load 高 → CPU 真饱和,继续往下查。
如果 %iowait 高 → 先别纠结 CPU,去查磁盘/网络。

第二步:定位“罪魁祸首”进程 / 线程

# 按 CPU 降序看前 10 个吃 CPU 的进程
top -b -n 1 -o %CPU | head -n 20

# 或者直接用 pidstat 更清晰
pidstat -u 1 10          # 每秒采样 10 次
pidstat -u -t 1 5        # 显示线程级(-t 超级有用!)

# 找出 PID 后,看它的线程谁在吃 CPU
top -H -p <PID>          # -H 显示线程,-p 只看这个进程

常见吃 CPU 的进程类型:

  • java / python / node / php-fpm → 业务代码问题
  • mysqld / redis-server → 慢查询 / 大 key
  • nginx / envoy → 高并发连接处理
  • kswapd0 / jbd2 → 内存压力导致假象
  • unknown / [kworker] → 内核线程(驱动、加密等)

第三步:深入根因分析(分场景用不同工具)

场景推荐工具 & 命令示例看什么 / 判断标准
业务代码死循环 / 热点函数perf top / perf record -p PID -g — sleep 30 ; perf report火焰图中业务函数占比 >60–70%
Java 应用 CPU 高jstack PID > jstack.txt ; 看 RUNNABLE 线程栈某个方法反复出现
频繁系统调用 / 锁竞争strace -p PID -c 或 perf record -e syscalls:*futex / poll / read 高频
短时进程 / fork 炸弹execsnoop-bpfcc 或 perf record –all-cpus -e sched:*大量 sched_process_exec 事件
内核态高(%sys 高)perf top -a 或 sar -P ALL 1 5kernel 函数占比高(如 tcp/udp 处理)
挖矿 / 恶意程序top + ps auxf ; lsof -p PID ; strings /proc/PID/exe进程名奇怪、连矿池 IP

火焰图生成快速三步(最推荐可视化方式)

# 安装(大部分系统已有 perf)
# Ubuntu/Debian: sudo apt install linux-tools-common linux-tools-$(uname -r)
# CentOS/RHEL:   sudo yum install perf

perf record -F 99 -p <高CPU的PID> -g -- sleep 30
perf script > out.perf
# 下载 out.perf 到本地,用 https://www.brendangregg.com/FlameGraph/flamegraph.pl 生成火焰图
# 或服务器直接:
git clone https://github.com/brendangregg/FlameGraph
cd FlameGraph
./stackcollapse-perf.pl ../out.perf > out.folded
./flamegraph.pl out.folded > flame.svg

火焰图宽的地方 = 热点!(宽度越大越耗 CPU)

第四步:常见 10 大 CPU 高根因 & 快速应对(2025-2026 实测高频)

  1. 死循环 / 无限递归 → strace/perf 定位 → 修代码
  2. 低效算法 / 全表扫描 → 火焰图看热点函数 → 加缓存 / 优化逻辑
  3. 高并发锁竞争 → strace 看 futex 调用 → 细粒度锁 / 无锁结构
  4. GC 频繁(Java) → jstat -gcutil 看 Full GC → 调 JVM 参数
  5. 慢查询 / 大 key(数据库) → 业务进程 CPU 高 → 查 DB 慢日志
  6. 短时高频 fork/exec → execsnoop 确认 → 限流 / 改写脚本
  7. 网络洪水 / DDoS → %sys 高 + sar -n DEV 看包量 → 加 WAF / 限速
  8. 挖矿木马 → top 看到奇怪进程 → kill + 查入侵
  9. 内存 swapping 导致假高 → vmstat si/so >0 → 加内存 / 降 oom
  10. 驱动 / 内核 bug → %sys 高 + dmesg 有异常 → 更新内核

最后口诀(背下来排查快 3 倍)

uptime 看负载 → mpstat 看核分布 → top/pidstat 找进程 → perf/strace 深挖热点 → 火焰图确认函数 → 针对性优化

服务器卡顿时,先别急着重启或加机器,80% 的情况用上面 3–5 个命令就能定位 80% 的根因。

你现在遇到的是哪种情况?

  • CPU 使用率高但 load 不高?
  • 某个特定进程(如 java)吃满?
  • 全核都 100%?
  • 还是 %iowait 很高?

贴一下 topmpstat 1 5uptime 的截图或输出,我帮你进一步分析~

文章已创建 4237

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部