2. 核心指标采集:CPU、内存、磁盘、网络IO的采集原理与工具

监控系统要干活,第一步就是拿到数据。拿不到准确的数据,后面所有的告警、扩缩容都是瞎猜。

我个人习惯把指标采集分成四个维度:CPU、内存、磁盘、网络。这四个维度基本能覆盖一个容器或虚机的健康状态。今天我们就聊聊每个维度的采集原理,以及我平时最常用的那几个工具——top、vmstat、iostat、sar。

2.1 CPU 指标:到底谁在抢时间片?

CPU 指标说白了就是看「时间片怎么分的」。Linux 内核把 CPU 时间分成用户态、内核态、空闲、I/O 等待等几块。你想想看,如果 I/O 等待占比太高,那 CPU 其实是在等磁盘或网络,不是真的忙。

2.1.1 核心指标解读

指标 含义 正常范围
%user 用户态进程占用 CPU 比例 通常 < 70%
%system 内核态(系统调用、中断)占用比例 通常 < 30%
%iowait CPU 等待磁盘 I/O 完成的时间比例 持续 > 30% 需关注
%idle 空闲比例 长期 < 10% 说明过载
load average 1/5/15 分钟平均运行队列长度 一般不超过 CPU 核数的 70%
我的经验:别只看 %idle。有时候 %idle 很高,但 load average 也高,说明进程在排队等 CPU,但 CPU 本身有空闲——这往往是锁竞争或调度问题。我在排查一个 Java 应用时遇到过,%idle 有 40%,但 load 是 CPU 核数的 3 倍,最后发现是线程池配置不合理。

2.1.2 top:最直观的 CPU 监控

top 是我上手最快的一个工具。它每秒刷新一次,直接告诉你当前谁在吃 CPU。

# 常用方式
top -b -n 1 | head -20

# 按 CPU 使用率排序(进入 top 后按 P)
top -o %CPU

输出里有个关键字段叫 %CPU,它是所有核的累加值。比如 4 核机器上一个进程显示 300%,说明它占用了 3 个核。嗯,这里要注意:如果你看到某个进程长期超过 100%,别慌,先看看是不是多线程应用。

2.1.3 vmstat:轻量级 CPU 快照

vmstat 比 top 更轻量,适合脚本采集。我一般用它来快速判断系统是不是在「假死」。

# 每 2 秒采集一次,共 5 次
vmstat 2 5

重点关注 r(运行队列)和 b(不可中断睡眠进程数)。如果 r 持续大于 CPU 核数,说明 CPU 已经饱和了。

避坑:我曾经在生产环境用 vmstat 1 连续采集,结果发现采集本身占用了 2% 的 CPU。对于高负载系统,采集间隔别太短,建议至少 5 秒以上。

2.2 内存指标:别被「已用」骗了

内存监控最容易踩的坑就是「已用内存」这个数字。Linux 的内存管理很聪明,它会尽量用空闲内存做缓存和缓冲区。你看到的「已用」可能大部分是 cache,随时可以释放给应用。

2.2.1 关键指标

指标 含义 说明
total 物理内存总量 固定值
free 完全未使用的内存 通常很小,正常
buff/cache 内核缓存和缓冲区 可回收,不是真的占用
available 估算的可用于新进程的内存 这才是真正该看的指标
swap used 已使用的交换分区 持续增长说明物理内存不足

2.2.2 free 和 vmstat 怎么看内存

# 以人类可读方式显示
free -h

# vmstat 也能看内存
vmstat -s | grep -E "memory|swap"

我个人习惯用 free -h 快速扫一眼 available 列。如果 available 低于总内存的 10%,我就开始紧张了。另外,vmstat 的 si 和 so 字段表示 swap 换入换出,这两个值如果持续大于 0,说明内存真的不够了。

核心原则:监控内存只看 available,别盯着 free。available 是内核帮你算好的「真正可用内存」,包含了可回收的 cache。

2.3 磁盘指标:IO 延迟才是命门

磁盘监控有两个维度:容量和性能。容量好办,df -h 一看就知道。性能才是真正让人头疼的——磁盘 IO 延迟高了,整个应用都会卡。

2.3.1 iostat:磁盘性能诊断神器

# 每 2 秒采集一次,关注磁盘性能
iostat -x 2 5

输出里我最关注这几个字段:

字段 含义 警戒线
%util 磁盘忙绿时间百分比 > 80% 需关注
r_await / w_await 读/写平均响应时间(毫秒) SSD > 10ms 异常,HDD > 50ms 异常
svctm 平均服务时间 接近 r_await 说明磁盘本身慢
r/s / w/s 每秒读写请求数 取决于磁盘规格
我的经验:%util 到 100% 不一定代表磁盘坏了。我曾经遇到一个场景,%util 100% 但 r_await 只有 2ms,后来发现是 SSD 并发能力太强,请求队列一直满着但响应很快。这时候真正该看的是 r_await 和 队列长度。

2.3.2 容量监控用 df

# 查看磁盘使用率
df -h

# 查看 inode 使用率(小文件多时会爆)
df -i

很多人只盯磁盘空间,忘了 inode。我曾经在日志服务器上遇到过 inode 用满导致无法创建新文件,但磁盘空间还剩 60%。那场面,排查了半天才发现是大量小日志文件把 inode 吃光了。

2.4 网络 IO:带宽和连接数两手抓

网络监控我分成两层:带宽使用率和连接状态。带宽决定能不能跑得快,连接状态决定服务稳不稳定。

2.4.1 sar:网络流量统计利器

# 查看网络接口流量(每 2 秒一次)
sar -n DEV 2 5

# 查看网络错误和丢包
sar -n EDEV 2 5

sar -n DEV 输出里,rxkB/s 和 txkB/s 是实时流量。我一般会跟网卡带宽做对比,比如千兆网卡理论带宽约 125MB/s,如果持续超过 80% 就要考虑扩容了。

2.4.2 ss:连接状态排查

# 查看当前连接数统计
ss -s

# 查看 TIME_WAIT 状态的连接
ss -tan | grep TIME_WAIT | wc -l

TIME_WAIT 过多会导致端口耗尽。我记得有一次线上服务突然变慢,排查发现 TIME_WAIT 连接数超过 3 万,把 ephemeral 端口池占满了。后来调整了 net.ipv4.tcp_tw_reuse 才解决。

2.5 知识体系总览

下面这张图把四个维度的采集工具和关键指标串起来了,方便你快速回顾。

核心指标采集知识体系 CPU top / vmstat / sar • %user / %system • %iowait / %idle • load average • 运行队列长度 • 上下文切换 内存 free / vmstat / sar • total / free • buff / cache • available • swap used • si / so 磁盘 iostat / df / sar • %util • r_await / w_await • r/s / w/s • 磁盘使用率 • inode 使用率 网络 sar / ss / iftop • rxkB/s / txkB/s • 丢包率 • 连接数统计 • TIME_WAIT 数量 • 带宽使用率 采集原则 1. 采集间隔:生产环境建议 5-15 秒,避免采集本身影响性能 2. 数据持久化:用 sar 或 sysstat 服务自动记录历史数据 3. 异常检测:关注趋势变化,而非值 推荐组合 日常巡检:top + free + iostat + sar -n DEV 深度排查:vmstat + iostat -x + ss -s + sar -n EDEV

2.6 实战:一条命令搞定四维采集

我平时写脚本时,喜欢用 sar 一次性把四个维度的数据都拉出来。它自带历史记录功能,不用额外搭存储。

# 一条命令采集 CPU、内存、磁盘、网络
sar -u -r -b -n DEV 5 3

# 输出解读:
# -u: CPU 使用率
# -r: 内存和 swap
# -b: 磁盘 IO
# -n DEV: 网络接口流量

这个命令每 5 秒采集一次,共 3 次。输出会依次显示 CPU、内存、磁盘、网络的数据。我个人习惯把它写到 cron 里,每 5 分钟跑一次,数据保留 7 天,方便回溯。

一句话总结:CPU 看 load 和 iowait,内存看 available,磁盘看 await,网络看带宽和 TIME_WAIT。工具只是手段,理解指标背后的含义才是关键。