服务器变慢了,是 CPU 扛不住还是内存不够用?本文系统梳理 Linux 下 CPU 和内存监控的 5 大核心命令——top、mpstat、sar、free、vmstat,从输出解读到瓶颈判断,一篇建立完整的性能分析方法论。写在前面
性能问题排查的第一步,永远是搞清楚瓶颈在哪里。CPU 过载?内存不足?IO 阻塞?还是网络延迟?
本文聚焦 CPU 和内存两个维度,带你掌握 5 个核心监控命令的使用方法、输出解读,以及关键指标的判断标准。
一、CPU 监控
1.1 top — 实时进程资源监控
top 是 Linux 下最常用的性能分析工具,实时显示系统整体状态和各进程的资源占用情况。
命令格式
top [选项]
常用参数
| 参数 | 说明 |
|---|
-d N | 刷新间隔(秒),默认 3 秒 |
-p PID | 只监控指定进程 |
-c | 显示完整命令行(而非仅进程名) |
-i | 不显示闲置和僵死进程 |
-S | 累计模式 |
-s | 安全模式(禁用交互命令) |
输出解读
执行 top 后,屏幕分为统计信息区和进程信息区两部分。
第一行:系统概览
top - 17:32:33 up 120 days, 8:34, 1 user, load average: 0.15, 0.10, 0.08
| 字段 | 含义 |
|---|
17:32:33 | 当前系统时间 |
up 120 days, 8:34 | 系统连续运行时间 |
1 user | 当前登录用户数 |
load average: 0.15, 0.10, 0.08 | 1/5/15 分钟平均负载 |
负载判断标准:load average 的值应该小于 CPU 核心数。例如 4 核 CPU,负载长期超过 4 就需要关注。超过核心数的 2 倍则说明系统严重过载。
第二行:进程统计
Tasks: 210 total, 1 running, 209 sleeping, 0 stopped, 0 zombie
第三行:CPU 使用率(重点)
%Cpu(s): 0.5 us, 0.2 sy, 0.0 ni, 99.3 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
| 指标 | 含义 | 关注点 |
|---|
%us | 用户态 CPU 占用 | 应用程序消耗 |
%sy | 内核态 CPU 占用 | 系统调用消耗 |
%ni | nice 值调整后的进程 CPU 占用 | 通常很低 |
%id | CPU 空闲率 | 核心指标,低于 20% 需关注 |
%wa | IO 等待占用 | 高说明存在 IO 瓶颈 |
%hi | 硬件中断占用 | 网卡、磁盘中断 |
%si | 软件中断占用 | 网络包处理 |
%st | 虚拟机被偷走的 CPU | 仅虚拟化环境有意义 |
第四、五行:内存统计
MiB Mem : 7821.5 total, 215.3 free, 4102.8 used, 3503.4 buff/cacheMiB Swap: 2048.0 total, 1920.0 free, 128.0 used. 3352.1 avail Mem
| 字段 | 含义 |
|---|
total | 物理内存/交换区总量 |
free | 完全空闲的内存 |
used | 已使用的内存 |
buff/cache | 缓冲区和缓存占用的内存 |
avail Mem | 可供应用程序使用的内存(含可回收缓存) |
注意:free 很小不一定说明内存不足,Linux 会积极使用空闲内存做缓存。真正反映内存压力的是 avail Mem。
进程信息区关键列
| 列名 | 含义 |
|---|
PID | 进程 ID |
USER | 进程属主 |
PR | 优先级 |
NI | nice 值(负值 = 高优先级) |
VIRT | 虚拟内存总量(含 SWAP) |
RES | 物理内存占用(未被换出) |
SHR | 共享内存大小 |
S | 进程状态(R=运行, S=睡眠, D=不可中断睡眠, Z=僵尸, T=停止) |
%CPU | CPU 使用率 |
%MEM | 内存使用率 |
COMMAND | 命令名 |
top 交互命令
进入 top 后,可以使用以下快捷键:
| 按键 | 功能 |
|---|
1 | 切换显示每个 CPU 核心的使用率 |
M | 按内存使用率排序 |
P | 按 CPU 使用率排序 |
T | 按累计 CPU 时间排序 |
k | 终止指定进程 |
q | 退出 top |
H | 显示线程 |
c | 切换显示完整命令行 |
常用命令
# 默认每 3 秒刷新top# 每 2 秒刷新top -d 2# 显示完整命令行top -c# 只监控指定进程top -p 12345# 监控多个进程top -p 12345 -p 6789# 组合使用top -d 2 -c -p 12345
1.2 mpstat — 多核 CPU 统计
mpstat(Multiprocessor Statistics)专注于 CPU 统计,能够分别显示每个 CPU 核心的使用情况,特别适合多核环境下定位 CPU 热点。
安装
mpstat 属于 sysstat 工具包:
yum install -y sysstat # RHEL/CentOSapt install -y sysstat # Debian/Ubuntu
命令格式
mpstat [-A] [-u] [-I {SUM|CPU|SCPU|ALL}] [-P {cpu|ALL}] [间隔] [次数]核心参数
| 参数 | 说明 |
|---|
-P ALL | 显示所有 CPU 核心(最常用) |
-P N | 只显示第 N 个 CPU |
-I SUM | 显示中断总数 |
-I SCPU | 显示软中断统计 |
-u | 显示 CPU 使用率 |
-A | 等同于 -u -I ALL -P ALL |
输出字段说明
| 字段 | 含义 |
|---|
%usr | 用户态 CPU 使用率 |
%nice | nice 进程 CPU 使用率 |
%sys | 内核态 CPU 使用率 |
%iowait | IO 等待占 CPU 百分比 |
%irq | 硬中断占 CPU 百分比 |
%soft | 软中断占 CPU 百分比 |
%steal | 被虚拟机管理器偷走的 CPU |
%guest | 运行虚拟机占用的 CPU |
%idle | CPU 空闲百分比 |
常用命令
# 每秒输出所有 CPU 核心使用情况(最常用)mpstat -P ALL 1# 每 2 秒输出一次,共 3 次mpstat 2 3# 查看软中断统计mpstat -I SCPU 1# 只看第 0 号 CPUmpstat -P 0 1 5
mpstat vs top:top 显示的是所有 CPU 的平均值,mpstat 能分别看每个核心。当系统整体 CPU 不高但响应慢时,用 mpstat 检查是否存在单核过载(某个核心 100% 而其他空闲)。
1.3 sar — 系统活动报告(CPU 部分)
sar(System Activity Reporter)是最全面的系统监控工具,不仅能实时采集,还能将数据保存到 /var/log/sa/ 目录供事后分析。
命令格式
sar [选项] [间隔] [次数]
CPU 相关参数
| 参数 | 说明 |
|---|
-u | CPU 使用率统计 |
-P ALL | 显示每个 CPU 核心 |
-P N | 显示第 N 个 CPU |
-q | 运行队列长度和平均负载 |
-w | 系统上下文切换统计 |
-I XALL | 所有中断统计 |
-o file | 输出保存到二进制文件 |
-f file | 从二进制文件读取历史数据 |
CPU 使用率输出字段
sar -u 3 5# 每 3 秒采样,共 5 次
| 字段 | 含义 |
|---|
%user | 用户态 CPU 百分比 |
%nice | nice 进程 CPU 百分比 |
%system | 内核态 CPU 百分比 |
%iowait | IO 等待 CPU 百分比 |
%steal | 被虚拟化偷走的 CPU |
%idle | CPU 空闲百分比 |
数据保存与回放
# 采样并保存到文件sar -u -o /tmp/cpu_report 10 3# 事后查看历史数据sar -u -f /tmp/cpu_report
这个功能在排查已经过去的性能问题时非常有用。sar 默认会每 10 分钟自动采集系统数据到 /var/log/sa/ 目录,可以查看过去几天的历史。
常用命令汇总
# 查看 CPU 使用率sar -u 3 5# 查看每个 CPU 核心sar -P ALL 3 5# 查看运行队列和负载sar -q 3 10# 查看上下文切换sar -w 3 10# 查看所有中断sar -I XALL 3 10
1.4 CPU 瓶颈判断标准(总结)
| 指标 | 正常范围 | 异常信号 |
|---|
%idle | > 20% | 持续低于 10% 说明 CPU 严重不足 |
%iowait | < 10% | 持续高于 20% 说明存在 IO 瓶颈 |
%sy | < 30% | %sy > 2 * %us 时需关注系统调用开销 |
load average | < CPU 核心数 | 超过核心数的 2 倍说明过载 |
vmstat r | < CPU 核心数 | r > 4 * CPU 核心数说明严重排队 |
快速定位 CPU 占用最高的进程:
# 按 CPU 使用率排序,取前 10ps auxw | head -1; ps auxw | sort -rn -k3 | head -10
查看 CPU Load 中不可中断睡眠的任务(通常是 IO 阻塞):
top -b -n 1 | awk '{if(NR<=7)print;else if($8=="D"){print;count++}}END{print "Total D-state:",count}' 不可中断睡眠(D 状态)的进程会被计入 load average。如果 load 高但 CPU 使用率不高,很可能是大量进程在等待 IO。
二、内存监控
2.1 free — 内存使用概览
free 是最快速查看内存使用情况的命令,一眼就能看出物理内存和交换空间的使用状态。
命令格式
free [选项]
常用参数
| 参数 | 说明 |
|---|
-h | 人类可读格式(自动选择 KB/MB/GB) |
-m | 以 MB 为单位 |
-g | 以 GB 为单位 |
-b | 以字节为单位 |
-s N | 每 N 秒刷新一次 |
-c N | 刷新 N 次后退出 |
-t | 显示总计行 |
输出解读
$ free -h total used free shared buff/cache availableMem: 7.6Gi 4.0Gi 210Mi 128Mi 3.4Gi 3.3GiSwap: 2.0Gi 128Mi 1.9Gi
| 字段 | 含义 |
|---|
total | 物理内存总量 |
used | 已使用内存(包含 buff/cache) |
free | 完全空闲的内存 |
shared | 共享内存(tmpfs 等) |
buff/cache | 缓冲区(buffers)+ 缓存(cached) |
available | 可供应用使用的内存(含可回收缓存) |
核心要点:判断内存是否不足,看的是 available 而不是 free。Linux 内核会将空闲内存用作磁盘缓存(buff/cache),这些缓存在应用程序需要时可以立即回收。所以 free 很小是正常的。
buffers vs cached:
常用命令
# 最常用:人类可读格式free -h# 以 MB 显示free -m# 每 3 秒刷新,共 5 次free -s 3 -c 5# 显示总计行free -ht
2.2 vmstat — 虚拟内存统计
vmstat 是综合性最强的监控工具之一,可以同时查看 CPU、内存、IO、上下文切换的整体状态。相比 top 侧重于进程维度,vmstat 侧重于系统整体维度。
命令格式
vmstat [选项] [间隔] [次数]
常用参数
| 参数 | 说明 |
|---|
-a | 显示活跃/非活跃内存 |
-s | 显示内存统计汇总 |
-d | 显示磁盘统计 |
-p 分区 | 显示指定分区统计 |
-f | 显示系统启动以来的 fork 次数 |
-S M | 以 MB 为单位显示 |
输出解读
$ vmstat 2 5procs ----memory-------------swap-------io-----system--------cpu----- r b swpd free buff cache si so bi bo in cs us sy id wa st100215360 102400 348160000512156320219700000215120 102400 348160000028142298109900
procs(进程)
| 字段 | 含义 | 判断标准 |
|---|
r | 运行队列中等待 CPU 的进程数 | 超过 CPU 核心数的 2 倍需关注 |
b | 不可中断睡眠(阻塞)的进程数 | 持续 > 0 说明有 IO 阻塞 |
memory(内存,单位 KB)
| 字段 | 含义 |
|---|
swpd | 已使用的虚拟内存(swap) |
free | 空闲物理内存 |
buff | 缓冲区内存 |
cache | 缓存内存 |
swap(交换区)
| 字段 | 含义 | 判断标准 |
|---|
si | 每秒从磁盘读入交换区的数据量(KB) | 持续 > 0 说明物理内存不足 |
so | 每秒写入交换区的数据量(KB) | 持续 > 0 说明物理内存不足 |
io(磁盘 IO)
| 字段 | 含义 |
|---|
bi | 每秒从块设备读取的块数 |
bo | 每秒写入块设备的块数 |
system(系统)
| 字段 | 含义 |
|---|
in | 每秒 CPU 中断次数 |
cs | 每秒上下文切换次数 |
cpu
| 字段 | 含义 |
|---|
us | 用户态 CPU 时间 |
sy | 内核态 CPU 时间 |
id | 空闲 CPU 时间 |
wa | IO 等待 CPU 时间 |
st | 被偷走的 CPU 时间 |
常用命令
# 每 2 秒采集,共 5 次(最常用)vmstat 2 5# 显示活跃/非活跃内存vmstat -a 2 5# 显示磁盘读写统计vmstat -d# 显示内存统计汇总vmstat -s# 显示 fork 次数vmstat -f
2.3 sar — 系统活动报告(内存部分)
sar 命令同样支持内存和交换空间的监控。
内存使用统计 sar -r
sar -r 3 5# 每 3 秒采样,共 5 次
| 字段 | 含义 |
|---|
kbmemfree | 空闲内存(KB) |
kbmemused | 已使用内存(含 buffer/cache) |
%memused | 内存使用率 |
kbbuffers | 内核 buffer 大小 |
kbcached | 内核 cache 大小 |
内存分页统计 sar -B
sar -B 3 5
| 字段 | 含义 |
|---|
pgpgin/s | 每秒从磁盘换入的数据量(KB) |
pgpgout/s | 每秒换出到磁盘的数据量(KB) |
fault/s | 每秒缺页总数(主缺页 + 次缺页) |
majflt/s | 每秒主缺页数(需要磁盘 IO) |
pgfree/s | 每秒释放到空闲队列的页数 |
pgscank/s | 每秒被 kswapd 扫描的页数 |
pgscand/s | 每秒被直接回收扫描的页数 |
pgsteal/s | 每秒被清除以满足内存需求的页数 |
%vmeff | 页面回收效率(pgsteal / 总扫描页) |
majflt/s 持续较高说明频繁发生磁盘换页,内存严重不足。%vmeff 接近 100% 表示回收效率高,远低于 30% 则内存压力很大。
常用命令
# 内存使用统计sar -r 3 5# 内存分页监控sar -B 3 5# 交换空间活动监控sar -W 1 5
2.4 内存瓶颈判断标准(总结)
| 指标 | 正常范围 | 异常信号 |
|---|
available(free -h) | > 总内存的 15% | 低于 10% 需关注 |
si / so(vmstat) | 均为 0 | 持续 > 0 说明物理内存不足,正在使用 swap |
swap used(free -h) | 接近 0 | 持续增长说明内存压力越来越大 |
majflt/s(sar -B) | 极低 | 持续较高说明频繁磁盘换页 |
b(vmstat) | 0 | 持续 > 3 且 swap 活跃,IO 和内存同时告急 |
快速定位内存占用最高的进程:
# 按物理内存使用率排序,取前 10ps auxw | head -1; ps auxw | sort -rn -k4 | head -10# 按虚拟内存使用排序,取前 10ps auxw | head -1; ps auxw | sort -rn -k5 | head -10
三、综合诊断方法论
3.1 性能排查流程
面对"服务器变慢了"这类问题,推荐按以下顺序排查:
1. top / uptime → 看整体负载和 CPU 概况 ↓2. vmstat 1 10 → 看 r/b 队列、si/so 换页、CPU 各状态 ↓3. mpstat -P ALL 1 → 看是否存在单核过载 ↓4. free -h → 看 available 内存和 swap 使用 ↓5. sar -r / sar -B → 看内存分页和回收情况 ↓6. ps aux --sort=... → 定位具体进程
3.2 常见场景速判
| 现象 | 可能原因 | 验证方法 |
|---|
| load 高,CPU us 高 | 应用程序 CPU 密集 | top -c 定位高 CPU 进程 |
| load 高,CPU wa 高 | IO 阻塞 | vmstat 看 b 列和 bi/bo |
| load 高,CPU 看起来不高 | 大量 D 状态进程 | top 中看 D 状态进程数 |
| free 很低 | 不一定是问题 | 看 available,看 si/so |
| swap 持续增长 | 物理内存不足 | free -h + vmstat 看 si/so |
| %sy 远大于 %us | 系统调用开销过大 | 可能是 IO 频繁或锁竞争 |
| 单核 100% 其他空闲 | 单线程程序瓶颈 | mpstat -P ALL 1 |
3.3 补充工具
除了本文详细介绍的 5 个核心命令,以下工具在特定场景下也很有价值:
| 工具 | 用途 | 安装 |
|---|
htop | top 的增强版,支持鼠标、进程树 | yum install htop |
nmon | 综合性能监控,支持输出报告 | yum install nmon |
dstat | vmstat 的现代替代,彩色输出 | yum install dstat |
pidstat | 单进程级别的 CPU/内存/IO 统计 | sysstat 包自带 |
perf top | CPU 热点函数级分析 | yum install perf |
atop | 带历史回放的进程级监控 | yum install atop |
四、命令速查表
CPU 监控
# 实时进程监控top -c# 所有 CPU 核心使用率mpstat -P ALL 1# CPU 使用率统计(可保存历史)sar -u 3 5# 运行队列和负载sar -q 3 5# 上下文切换sar -w 3 5# CPU 占用最高的 10 个进程ps auxw | head -1; ps auxw | sort -rn -k3 | head -10
内存监控
# 内存概览free -h# 综合状态(CPU + 内存 + IO)vmstat 2 5# 内存使用统计sar -r 3 5# 内存分页统计sar -B 3 5# 交换空间监控sar -W 1 5# 内存占用最高的 10 个进程ps auxw | head -1; ps auxw | sort-rn-k4 | head -10
写在最后
性能监控不是背命令,而是建立从指标到结论的思维链路:
看负载 → 系统是否过载
分维度 → 瓶颈在 CPU、内存还是 IO
看趋势 → 是突发还是持续恶化
定进程 → 是哪个进程在消耗资源
找根因 → 是代码问题、配置问题还是容量不足
掌握本文的 5 个核心命令和判断标准,你就具备了 Linux 性能问题排查的基本功。后续我们将继续探讨磁盘 IO 和网络性能监控。