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% |
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 | 每秒读写请求数 | 取决于磁盘规格 |
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 知识体系总览
下面这张图把四个维度的采集工具和关键指标串起来了,方便你快速回顾。
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 天,方便回溯。