Linux CPU 高占用、系统负载高完整排查流程
一、先分清两个核心指标:CPU 使用率 vs 系统负载
CPU 使用率(% Cpu)
单颗 CPU 满载 100%,多核则总上限 = CPU 核数 ×100%
- 用户 us:业务进程计算消耗
- 系统 sy:内核、磁盘 IO、中断、锁消耗
- iowait wa:等待磁盘 IO(负载高但 CPU 使用率低,多半是 IO 瓶颈)
系统负载 load average(1/5/15 分钟)
代表等待运行的任务队列长度,包含:正在运行 CPU 进程 + 等待 CPU 进程 + 不可中断睡眠 D 进程(IO 阻塞)
4 核 CPU:load>4 代表 CPU 排队拥堵;load 远大于核数说明严重瓶颈
top、htop、mpstat、%Cpu(s) 里的 100% 基准 = 逻辑 CPU 核(超线程算独立逻辑核)
- 怎么理解单颗 100%
1 个逻辑 CPU跑满,就是 100%;
4 物理核、无超线程 → 4 逻辑核,整机 CPU 上限 400%
4 物理核、开启超线程(8 逻辑核)→ 整机上限 800%
举例
plaintext
lscpu
CPU(s): 8 # 逻辑总核数
Thread(s) per core: 2 # 每个物理核2个超线程
Core(s) per socket: 4
Socket(s): 1
top 按 1 展开能看到 8 个独立 CPU 列,每列满负载都是 100%,整机满负载合计 800%。
- load average 对比参考(配套理解)
负载均衡判断标准同样看逻辑核数:
逻辑核 = 8,则 load 持续>8 代表 CPU 队列拥堵、处理不过来。 - 区分物理核 / 逻辑核命令
bash
运行# 逻辑核总数(top使用的基数)
nproc
lscpu | grep "^CPU(s)"
# 物理核心数
lscpu | grep "Core(s) per socket"
# CPU插槽数
lscpu | grep "Socket(s)"
# 超线程开关(每个物理核线程数)
lscpu | grep "Thread(s) per core"
- 补充容易混淆的点
进程绑核 taskset、容器 CPU 限制 --cpus 配额,单位也是逻辑核;
云服务器配置标注的 4 核 8 线程,性能上限按 800% 算,不是 400%;
只看物理核会低估整机 CPU 承载上限,排查高负载必须以逻辑核为准。
Linux CPU 高占用、系统负载高完整排查流程
一、先分清两个核心指标:CPU 使用率 vs 系统负载
-
CPU 使用率(% Cpu)
单颗 CPU 满载 100%,多核则总上限 = CPU 核数 ×100%
用户 us:业务进程计算消耗
系统 sy:内核、磁盘 IO、中断、锁消耗
iowait wa:等待磁盘 IO(负载高但 CPU 使用率低,多半是 IO 瓶颈) -
系统负载 load average(1/5/15 分钟)
代表等待运行的任务队列长度,包含:正在运行 CPU 进程 + 等待 CPU 进程 + 不可中断睡眠 D 进程(IO 阻塞)
4 核 CPU:load>4 代表 CPU 排队拥堵;load 远大于核数说明严重瓶颈
二、第一步:全局快速定位(一键看整体)
- top(最常用,实时)
bash
运行
top
常用快捷键
1 # 展开所有CPU核心,看单颗是否打满
P # 按CPU占用排序
M # 按内存排序
z # 彩色显示
k # 输入PID杀进程
Shift+W # 保存top配置
重点看:
% Cpu (s) us/sy/wa 区分是计算密集还是 IO 阻塞
Load average
占用 CPU 最高的 PID、COMMAND
- htop(可视化,推荐安装)
bash
运行
yum install htop -y # CentOS/RHEL
apt install htop -y # Ubuntu/Debian
htop
直观展示每核 CPU、线程、内存,支持鼠标操作。
3. 快速看负载与 CPU 核数
bash
运行
uptime # 只看负载
nproc # 查看CPU总核数
lscpu # 完整CPU信息(核数、超线程)
三、场景 1:CPU 使用率高(us 高,计算密集型)
- 定位占用 CPU 最高进程
bash
运行
# 一次性输出,不用进交互界面
top -b -n 1 | head -30
# 只展示CPU前10进程
ps -aux --sort=-pcpu | head -10
# 按线程维度看(Java/多进程服务必看)
ps -T -p <PID> -o pid,tid,pcpu,cmd
2. 查看进程内部线程消耗(Java、Nginx、数据库)
bash
运行
# 1. 找到高CPU进程PID
pidstat -u 1 # 每秒输出进程CPU统计
# 2. 打印进程所有线程CPU占用
top -H -p <PID>
# 3. 线程TID转16进制(Java栈定位专用)
printf "%x\n" <线程TID>
# 导出java栈日志,匹配16进制线程号
jstack <PID> > jstack.log
- 分析进程行为
Java 服务:死循环、FullGC、正则卡死、大量循环计算
Python/PHP:死循环、大量循环运算、未释放循环资源
编译 / 压缩任务:tar、gzip、gcc、ffmpeg 占满 CPU
恶意程序:挖矿程序(kdevtmpfsi、xmrig)
4. 临时处理
bash
运行
# 降低进程优先级
renice +10 -p <PID>
# 杀死异常进程
kill -9 <PID>
四、场景 2:sy 系统 CPU 高(内核占用高)
常见原因
- 大量频繁创建销毁进程、线程
- 磁盘频繁读写、大量 pagecache 刷新
- 软中断 / 硬中断飙升(网络流量暴打)
- 大量文件句柄、频繁文件操作
- 内核锁竞争、内存 swap 频繁
排查命令
bash
运行
# 查看中断消耗
mpstat -P ALL 1
# 软中断统计(si高=网络瓶颈)
cat /proc/softirqs
# 内核调用栈追踪,看系统CPU消耗来源
perf top
# 查看每秒系统调用次数
strace -p <PID> -c
五、场景 3:wa iowait 高(负载高,但 CPU 使用率低,IO 瓶颈)
特征:load 很高,但 us/sy 很低,wa 数值几十上百
排查步骤
全局磁盘 IO 负载
bash
运行
iostat -x 1
重点指标:%util接近100% 磁盘打满;await/r_await/w_await读写延迟
定位哪个进程疯狂读写磁盘
bash
运行
iotop -oP # 只展示有IO操作的进程
pidstat -d 1
查看读写文件
bash
运行
# 追踪进程读写文件
strace -p <PID> -e read,write
# 查看进程打开文件
lsof -p <PID>
IO 高常见诱因
- MySQL 大量慢查询、全表扫描、无索引写入
- 日志疯狂打盘、日志未分割
- 磁盘坏道、机械硬盘转速慢
- 大量小文件读写、频繁 rm/tar 压缩
- swap 频繁使用(内存不足,磁盘虚拟内存)
bash
运行
# 查看swap使用
free -h
vmstat 1 # si/so不为0代表swap交换频繁
六、场景 4:负载很高,但 CPU/IO 都不高(D 不可中断进程)
进程处于 D 状态(不可中断睡眠,等待硬件资源),会拉高 load 但不占用 CPU
bash
运行
# 查找D状态进程
ps -ef | awk '$8 ~ /D/'
# 详细展示进程状态
ps auxH | awk '$8 ~ /D/'
成因:磁盘卡死、NFS 挂载断连、内核 BUG、硬件故障,kill 无法杀死 D 进程,只能重启服务器
七、高级性能追踪(perf,内核级分析)
- 实时查看 CPU 热点函数
bash
运行
perf top
- 采集 CPU 调用栈,生成报告
bash
运行
perf record -g -p <PID> sleep 30
perf report
- 统计 CPU 上下文切换(cs 数值暴涨代表线程频繁切换)
bash
运行
vmstat 1
八、数据库专项高 CPU(MySQL 为例)
查看慢 SQL 占用 CPU
sql
show processlist;
开启慢查询日志,定位全表扫描、无索引SQL
查看 CPU 与 IO
bash
运行
pidstat -u -d 1 -p $(pidof mysqld)
优化:加索引、分库分表、减少大事务、限制并发连接
九、挖矿病毒排查(服务器莫名 CPU100%)
挖矿程序特征:陌生 PID 持续占满 CPU,进程名随机、隐藏
bash
运行
# 查看异常高CPU无名进程
ps -aux --sort=-pcpu
# 查看定时任务(病毒自启动)
crontab -l
ls /etc/cron.*
# 查看可疑启动项
systemctl list-unit-files
# 检查/tmp /var/tmp隐藏程序
ls -la /tmp
十、优化通用方案
CPU 计算密集
优化代码:去除死循环、缓存重复计算、异步任务
扩容 CPU 核心、负载均衡分流请求
限制进程 CPU 核数(taskset)
bash
运行
# 绑定进程到指定CPU核心
taskset -c 0-3 ./app
- IO 瓶颈优化
- 数据库加索引、分批次写入、减少大事务
- 日志切割、异步落盘、更换 SSD 高速磁盘
- 增加内存,减少 swap 使用
- 调整磁盘调度算法、挂载更高 IO 存储
- 内核调优(临时生效)
bash
运行
# 减少swap使用倾向
sysctl vm.swappiness=10
# 调整脏页刷新频率,降低IO抖动
sysctl vm.dirty_ratio=10
十一、排查完整顺序总结(标准流程)
- uptime /lscpu → 确认负载、CPU 核数,判断是否过载
- top/htop → 区分 us 高 (计算) /sy 高 (内核) /wa 高 (IO)
- us 高:ps/pidstat/top -H 定位进程 + 线程,Java 用 jstack 定位代码
- wa 高:iostat + iotop 定位磁盘 IO 进程,检查 swap、数据库日志
- sy 高:mpstat、perf、软中断查看网络 / 内核开销
- load 高但 CPU 低:查找 D 状态阻塞进程
- perf 内核采样定位底层热点
- 检查定时任务、挖矿病毒、数据库慢查询
- 临时限流 / 降优先级 / 杀异常进程,长期优化业务代码 / 硬件
需要我给你一套可直接复制的一键排查脚本,执行后自动输出负载、CPU、IO、高占用进程汇总吗?
更多推荐




所有评论(0)