2. RHEL监控数据采集基础
在RHEL服务器上做监控,第一步不是装Agent,而是理解内核已经把哪些数据“摆在了桌面上”。Linux内核通过两个虚拟文件系统向用户态暴露运行状态:/proc和/sys。它们不占用磁盘空间,读取时由内核实时生成内容,因此是成本最低、最原始的数据源。绝大多数监控工具(包括sysstat、top、Prometheus node_exporter)本质上都是在解析这两个目录下的文件。
/proc:进程与内核统计的入口
/proc以“文件即接口”的方式呈现内核数据。与监控最相关的几个文件是:
/proc/stat:CPU时间片累计值,按user、nice、system、idle、iowait、irq、softirq、steal等维度分行给出。它是计算CPU使用率的基础。/proc/meminfo:内存总量、可用量、缓存、缓冲区、Swap等,单位kB。/proc/loadavg:1、5、15分钟平均负载,以及当前可运行进程数/总进程数。/proc/diskstats:每块磁盘的读写次数、扇区数、耗时,是iostat的数据来源。/proc/net/dev:每张网卡的收发字节、包数、错误与丢包计数。/proc/<pid>/:单个进程的status、stat、io、fd等,用于进程级监控。
以CPU使用率为例,/proc/stat给出的是自开机以来的累计jiffies,必须取两次采样做差才能得到区间使用率。设两次采样间隔为Δt,则:
CPU% = 1 - Δ(idle + iowait) / Δ(total)
其中 total = user + nice + system + idle + iowait + irq + softirq + steal
这里有一个容易踩的坑:iowait是否计入“空闲”取决于监控口径。若关注CPU是否被IO拖住,应把iowait单独观察,而不是简单并入idle。
/sys:设备与内核子系统的结构化视图
/sys(sysfs)比/proc更规整,按设备、总线、类、模块组织,适合做设备级和参数级采集。例如:
/sys/class/net/eth0/statistics/:rx_bytes、tx_bytes、rx_dropped等,比解析/proc/net/dev更直接。/sys/block/sda/stat:块设备IO统计。/sys/class/thermal/thermal_zone*/temp:温度传感器读数。/sys/fs/cgroup/:cgroup资源限制与用量,容器监控的关键路径。
与/proc相比,/sys的字段更稳定、语义更清晰,适合脚本化采集;而/proc中部分文件格式随内核版本略有差异,解析时需做兼容。
sysstat工具集:把瞬时值变成可回看的历史
sysstat是RHEL上最经典的性能数据采集套件,核心组件包括:
sar:系统活动报告,可实时也可读历史文件。sadc:系统活动数据收集器,由cron或systemd timer定时调用。sa1、sa2:封装脚本,分别负责“采集”和“生成日报”。iostat、mpstat、pidstat:分别面向磁盘、CPU、进程的专项统计。
安装后需启用采集服务:
dnf install -y sysstat
systemctl enable --now sysstat
# 查看采集配置
grep -E '^HISTORY|^COMPRESSAFTER|^SA_DIR' /etc/sysconfig/sysstat
默认情况下,sysstat每10分钟采集一次,日志保存在/var/log/sa/下,文件名形如sa01(当月1日)。保留天数由HISTORY控制,默认28天。要回看昨天14:00到15:00的CPU:
sar -f /var/log/sa/sa$(date -d yesterday +%d) -s 14:00:00 -e 15:00:00 -u
若需要更细粒度,可修改/etc/cron.d/sysstat或对应的systemd timer,把采集间隔从10分钟缩短到1分钟。但要注意:间隔越短,/var/log/sa增长越快,需同步调整HISTORY或启用压缩。
top / vmstat / iostat / sar 的分工
这四个命令常被混用,实际各有侧重:
| 命令 | 数据来源 | 典型用途 | 关键字段 |
|---|---|---|---|
| top | /proc/stat、/proc/<pid> | 实时看进程级CPU/内存 | %us、%sy、%wa、RES、S |
| vmstat | /proc/stat、/proc/meminfo、/proc/vmstat | 看CPU、内存、IO、上下文切换的整体平衡 | r、b、si、so、bi、bo、cs |
| iostat | /proc/diskstats | 看每块磁盘的吞吐、IOPS、await、%util | r/s、w/s、await、%util |
| sar | sadc采集的历史文件 | 事后回溯、趋势对比 | 与vmstat/iostat字段对应 |
一个实用的排查顺序是:先用vmstat 1看整体是否有IO等待或内存回收压力,再用iostat -x 1定位具体磁盘,最后用pidstat -d 1或top找到消耗IO的进程。若问题发生在过去,则用sar回放对应时段。
采集频率与数据精度控制
采集频率不是越高越好。频率提高会带来三方面代价:采集进程自身消耗CPU;写入/var/log/sa增加磁盘IO;历史数据体积膨胀。同时,采样间隔本身决定了能捕捉到的最短事件——若一个毛刺只持续3秒,而采样间隔是10分钟,它几乎必然被平均掉。
因此需要按监控目标分层设置:
- 容量与趋势类(磁盘使用率、内存增长):5~15分钟一次即可。
- 性能基线类(CPU、IO、网络):1~5分钟一次,兼顾精度与开销。
- 故障复现类(短时抖动、连接风暴):临时用1秒间隔的
vmstat或sar抓取,事后关闭。
另一个影响精度的是“平均口径”。sar默认输出的是区间平均值,若某分钟内前30秒CPU 100%、后30秒0%,平均值只有50%,看起来并不危险。要发现这种问题,需要缩短采样间隔,或结合%util、await等分布敏感指标一起判断。
sysstat-collect.timer驱动,可用systemctl list-timers sysstat*确认下一次采集时间;修改间隔后需systemctl daemon-reload并重启timer。/proc/stat的累计值当作使用率上报。任何基于累计计数器的指标都必须做差分,并处理计数器回绕或重启归零的情况,否则会出现负值或尖峰。掌握/proc与/sys的读取方式、sysstat的采集与回放机制,以及四个命令的分工和采样频率的取舍,就具备了在RHEL上自主构建监控数据源的能力。后续无论是接入Zabbix、Prometheus还是自研脚本,底层都绕不开这些接口和工具。