1. 为什么需要监控CPU占用率?
在Linux系统管理中,CPU占用率是最基础也最重要的性能指标之一。想象一下CPU就像是餐厅的后厨,当订单(进程请求)突然暴增时,厨师(CPU核心)们就会忙得不可开交。如果长期处于超负荷状态,就会导致新订单处理延迟(系统卡顿)、厨师累倒(进程崩溃)甚至整个餐厅停业(系统宕机)。
通过实时监控CPU占用率,我们可以:
- 快速定位异常进程(比如某个程序突然占用90%的CPU)
- 评估系统负载是否合理(比如4核CPU平均占用75%说明资源吃紧)
- 排查性能瓶颈(比如数据库查询导致CPU飙升)
- 合理规划资源扩容(是否需要增加CPU核心)
实际运维中,我曾遇到过一个Java应用因内存泄漏导致频繁GC,CPU持续100%的情况。通过监控工具快速定位后,节省了至少3小时的盲目排查时间。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 基础命令:top与htop
2.1 top命令详解
在终端直接输入top,你会看到如下关键信息:
code复制top - 14:30:45 up 10 days, 3:22, 2 users, load average: 1.25, 0.95, 0.88
Tasks: 215 total, 2 running, 213 sleeping, 0 stopped, 0 zombie
%Cpu(s): 35.1 us, 8.2 sy, 0.0 ni, 56.2 id, 0.3 wa, 0.0 hi, 0.2 si, 0.0 st
KiB Mem : 16302048 total, 2543124 free, 8984572 used, 4774352 buff/cache
KiB Swap: 2097148 total, 2097148 free, 0 used. 6542348 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
4567 mysql 20 0 12.345g 2.456g 12344 S 78.6 15.8 10:30.25 mysqld
1234 www-data 20 0 456789 56789 2345 R 23.4 0.3 0:12.34 nginx
重点解读:
%Cpu(s)行显示总体CPU使用情况:us:用户空间占用百分比(应用进程)sy:内核空间占用百分比(系统调用)id:空闲百分比(数值越高说明CPU越闲)
- 进程列表中的
%CPU列显示单个进程的实时占用 - 按
1键可展开多核CPU的详细数据
2.2 htop的进阶用法
安装命令:
bash复制sudo apt install htop # Debian/Ubuntu
sudo yum install htop # CentOS/RHEL
htop相比top的优势:
- 彩色界面直观显示负载情况
- 鼠标点击即可排序(比如点%CPU列按占用排序)
- 树状视图展示进程关系
- 直接支持进程操作(如kill、renice)
小技巧:在htop中按
F2进入设置,可以调整显示列。我通常会添加IO_READ_RATE和IO_WRITE_RATE来综合判断是否是IO密集型任务导致CPU等待。
3. 专业级监控工具
3.1 vmstat:系统级监控
示例命令:
bash复制vmstat 1 5 # 每隔1秒采样,共5次
输出示例:
code复制procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
2 0 0 2543124 4774352 8984572 0 0 12 34 567 1234 35 8 56 0 0
关键指标:
r:运行队列长度(大于CPU核数说明过载)us+sy:总CPU使用率wa:IO等待占比(高说明磁盘是瓶颈)
3.2 mpstat:多核CPU分析
需要先安装sysstat包:
bash复制sudo apt install sysstat
使用示例:
bash复制mpstat -P ALL 1 # 监控所有CPU核心,每秒刷新
输出示例:
code复制Linux 5.4.0-135-generic (hostname) 01/01/2023 _x86_64_ (8 CPU)
14:45:03 CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
14:45:04 all 35.12 0.00 8.25 0.25 0.00 0.12 0.00 0.00 0.00 56.25
14:45:04 0 40.00 0.00 10.00 0.00 0.00 0.00 0.00 0.00 0.00 50.00
14:45:04 1 30.00 0.00 5.00 1.00 0.00 0.00 0.00 0.00 0.00 64.00
这个案例清晰显示:
- 8号核心负载最高(%usr达40%)
- 1号核心存在IO等待(%iowait=1%)
- 整体利用率56.25%空闲
3.3 pidstat:进程级监控
示例(监控指定进程的CPU使用):
bash复制pidstat -p 4567 1 5 # 监控PID为4567的进程,每秒1次共5次
4. 自动化监控方案
4.1 使用sar记录历史数据
sar是sysstat工具包的一部分,能自动记录系统指标。确保服务已启用:
bash复制sudo systemctl enable sysstat
sudo systemctl start sysstat
查看历史CPU数据:
bash复制sar -u -f /var/log/sysstat/sa01 # 查看当月1号的数据
4.2 Prometheus + Grafana方案
生产环境推荐部署:
- 安装node_exporter采集数据
- Prometheus定时抓取指标
- Grafana配置仪表盘
示例Grafana面板应包含:
- CPU总体使用率曲线
- 各核心负载热图
- 占用Top 10进程列表
- 负载与运行队列关联分析
4.3 自定义监控脚本
简易脚本示例:
bash复制#!/bin/bash
CRITICAL=90 # 定义阈值
while true; do
CPU_USAGE=$(top -bn1 | grep "Cpu(s)" | sed "s/.*, *\([0-9.]*\)%* id.*/\1/" | awk '{print 100 - $1}')
if (( $(echo "$CPU_USAGE > $CRITICAL" | bc -l) )); then
echo "[$(date)] CPU超过阈值!当前:${CPU_USAGE}%" >> /var/log/cpu_alert.log
# 可以添加邮件/短信报警逻辑
fi
sleep 60
done
5. 常见问题排查手册
5.1 CPU占用高但top找不到进程?
可能原因:
- 短时进程已消失 → 使用
perf top分析 - 内核线程占用 → 查看
ps auxf中的方括号进程 - 中断风暴 →
cat /proc/interrupts
5.2 如何定位Java进程高CPU?
步骤:
top -p <java_pid>确认占用情况jstack <java_pid> > thread_dump.log- 将占用最高的线程ID(16进制)转换后搜索日志
5.3 容器环境如何监控?
Docker命令:
bash复制docker stats --format "table {{.Container}}\t{{.CPUPerc}}\t{{.MemUsage}}"
K8s环境:
bash复制kubectl top pods --containers
6. 性能优化实战技巧
6.1 调整进程优先级
降低非关键进程的优先级:
bash复制renice +10 -p 1234 # 将PID为1234的进程nice值设为10
6.2 CPU绑核处理
将关键进程绑定到特定核心:
bash复制taskset -cp 0,1 4567 # 将PID 4567绑定到0、1号核心
6.3 中断负载均衡
查看中断分布:
bash复制cat /proc/interrupts | grep eth0
手动调整(需根据具体网卡驱动):
bash复制echo 2 > /proc/irq/123/smp_affinity # 将中断123分配到核心1(二进制掩码)
经验分享:在数据库服务器上,我们通常会把网卡中断和MySQL进程绑定到不同的CPU核心,避免网络IO影响查询性能。实测可使TPS提升15%-20%。
