为什么需要监控CPU与内存?

说实话,我刚入行那会儿,觉得监控就是个锦上添花的事。只要服务能跑,看一眼负载不高就完事了。结果有一次线上压测,流量一上来,CPU直接飙到 100%,然后整组机器都 hang 住了。我连问题在哪都找不到,因为根本没留下历史曲线。

那次教训让我明白——监控不是为了好看,是为了在出事之前能「看到信号」。CPU 和内存是系统的两大核心资源。CPU 不够,请求就排队,延迟飙升;内存不够,系统就会用 swap,性能直接跳水。你想想看,一个 2C4G 的云服务器,跑 Java 应用,内存用到 90% 以上,GC 频率翻倍,吞吐量掉一半——这都是我亲眼见过的。

所以,监控这两样东西,说白了就是回答三个问题:

  • 资源还够不够用?
  • 有没有异常消耗?
  • 瓶颈在哪,该怎么调?
注意: 千万不要等到CPU打满或内存OOM了才去看监控。那叫事后复盘,不是监控。监控应该是提前预警——比如CPU使用率持续超过80%,就立刻收到告警。

核心指标一览

指标很多,但真正常用的就那么十几个。我把常用的CPU和内存指标整理了一张表,方便你对照。

类别 指标 说明 我常用的命令
CPU CPU使用率 user + system + nice + iowait + irq 的总占用百分比 top, mpstat
Load Average 1/5/15分钟的平均运行队列长度。超过CPU核数说明过载 uptime
上下文切换(context switch) 每秒发生多少次进程/线程切换。太高说明锁竞争或线程数过多 vmstat 1
中断(interrupts) 硬件中断与软中断。网络包太多会导致软中断飙高 cat /proc/interrupts
CPU Steal 虚拟化环境下,宿主机偷走的时间。超过10%说明宿主机超分严重 top 中的 %st
内存 总内存 / 已用 / 可用 可用内存 = 空闲 + buffer/cache(可回收部分) free -h
Buffer / Cache Buffer是块设备缓存,Cache是文件页缓存。Linux会尽量用满来提升IO free -m
Swap 使用率 一旦开始用swap,性能就会下降。建议关闭或把swappiness调低 swapon --show
缺页异常(page fault) major fault(磁盘IO)和minor fault(内存分配)。major高说明频繁缺页 sar -B
小诀窍: 我习惯用 dstat 来同时看CPU、内存、网络、磁盘,比分别开几个窗口方便很多。dstat -c -m -n -d 1 一秒一刷,很直观。

理解CPU使用率——别被数字骗了

很多人看CPU使用率只看一个数,比如 80%。其实这里头水挺深的。你用 top 看,会分成 us(用户态)、sy(内核态)、id(空闲)、wa(iowait)、st(steal)。

我记得有一次线上告警说CPU 90%,我跑上去一看,wa 占了 70%。那不是CPU不够用,是磁盘太慢了。程序在做大量随机IO,CPU都在等磁盘响应。你加CPU核数根本没用,得换SSD或者优化IO路径。

# 用 mpstat 看CPU分解,1秒一次
$ mpstat -P ALL 1
Linux 5.15.0-91-generic (host01)     03/21/2025     _x86_64_    (2 CPU)

10:21:30  CPU    %usr   %nice    %sys %iowait   %steal   %idle
10:21:31  all    12.50   0.00    3.50    35.25   0.00   48.75
10:21:31    0    15.00   0.00    4.00    41.00   0.00   40.00
10:21:31    1    10.00   0.00    3.00    30.00   0.00   57.00

看到没?%iowait 比 %usr 还高。这时你应该去查磁盘的 iops 和 await,而不是盯着CPU。

避坑指南: 我曾经以为 iowait 高就是CPU满,加了两台机器,结果问题依旧。后来才搞清楚——iowait 表示CPU空闲时有多少时间在等IO完成。真正占用CPU的仍然是 us+sy。如果 iowait 高但 us 低,CPU是有富余的,瓶颈在磁盘。

另一个容易踩的坑是 Load Average。很多人以为 Load 超过 1 就危险了。其实得看 CPU 核数。比如 8 核的机器,Load 跑到 6 都还算正常。如果不到核数的一半,基本上很轻松。我习惯用 uptime 看这三个数字,配合 CPU 使用率一起判断:

  • 如果 load 高但 CPU 空闲率也高 → 很可能是在等 IO(iowait 高)
  • 如果 load 高且 CPU 使用率也高 → 真的是计算密集型负载
  • 如果 load 很高但CPU很低 → 大量进程在 D 状态(不可中断睡眠),查磁盘

理解内存使用——free 输出的坑

free -m 的输出,新手一般只看第二行「used」和「free」。但 Linux 的内存管理机制很聪明:它会尽量把空闲内存用作 cache,来加速文件读写。所以你看「free」列可能只有几百 MB,但实际系统并不缺内存。

应该看的是第二行 available 列。这个值才是真正可用的内存,包括可回收的 cache。如果 available 低于总内存的 10%~20%,就要警惕了。

$ free -h
              total        used        free      shared  buff/cache   available
Mem:           7.6G        2.1G        1.2G        124M        4.3G        5.1G
Swap:          2.0G          0B        2.0G

这里 total 7.6G,free 只有 1.2G,但 available 有 5.1G。说明系统很健康,cache 占了 4.3G,随时可以释放。

另一个我特别关注的点是 swap。只要 swap 被用了,哪怕只有几十 MB,我都觉得是危险的信号。因为 swap 意味着内存不够,部分数据被换到磁盘上了。而磁盘速度比内存慢几个数量级,一旦访问到换出的页,就会产生 major fault,应用延迟瞬间升高。

我的做法: 在大部分服务器上,我会把 swappiness 改成 1(sysctl vm.swappiness=1),让内核尽量不用 swap,除非逼不得已。对于数据库、缓存类的服务,我甚至直接 swapoff -a。

知识体系图:CPU与内存监控全景

下面这张图梳理了整个监控体系的脉络。你可以把它当作自己脑子里的一份地图——从应用层到底层硬件,每个环节都有对应的指标。

CPU与内存监控知识体系 应用层:进程 / 线程 / 容器 CPU使用率、内存使用量、线程数、上下文切换 CPU 子系统 调度器 / 中断 / 软中断 Load Average / 上下文切换 iowait / steal / nice 内存子系统 虚拟内存 / 页表 / slab 缺页异常 / 页换入换出 buffer / cache / swap CPU 硬件 物理核 / 超线程 / 时钟频率 内存硬件 DIMM条 / 带宽 / NUMA节点 关键:每个箭头代表一种资源交互,监测点应覆盖三个层次

记住这张图,以后不管是排查 CPU 飙高,还是内存泄漏,你都能快速定位问题出在哪一层,然后去查看对应的指标。后面几节我们会逐步深入每个指标的使用方法和调优技巧。