3、PSI数据获取:通过 /proc/pressure 目录读取PSI指标
在设定告警阈值之前,必须掌握PSI原始数据的获取方法。Linux内核从4.20版本开始,通过 /proc/pressure 伪文件系统暴露PSI指标,无需额外安装工具即可直接读取。
3.1 /proc/pressure 目录结构
该目录下包含三个文件,分别对应CPU、内存和IO三种资源的压力统计:
| 文件路径 | 资源类型 | 监控维度 | 内核版本要求 |
|---|---|---|---|
/proc/pressure/cpu |
CPU | some(部分任务受阻) | ≥ 4.20 |
/proc/pressure/memory |
内存 | some + full(全部任务受阻) | ≥ 4.20 |
/proc/pressure/io |
IO | some + full | ≥ 4.20 |
注意: CPU资源只有
some 维度,因为CPU不存在"全部任务阻塞"的场景——至少空闲任务(idle)可以运行。而内存和IO的 full 维度表示所有非空闲任务均处于等待状态,是衡量系统"完全卡死"的关键指标。
3.2 使用cat命令读取原始数据
直接使用 cat 命令即可查看当前PSI快照:
# 查看CPU压力
cat /proc/pressure/cpu
# 查看内存压力
cat /proc/pressure/memory
# 查看IO压力
cat /proc/pressure/io
典型输出示例:
# /proc/pressure/cpu
some avg10=0.00 avg60=0.00 avg300=0.00 total=0
# /proc/pressure/memory
some avg10=0.00 avg60=0.00 avg300=0.00 total=0
full avg10=0.00 avg60=0.00 avg300=0.00 total=0
# /proc/pressure/io
some avg10=0.00 avg60=0.00 avg300=0.00 total=0
full avg10=0.00 avg60=0.00 avg300=0.00 total=0
3.3 文件格式详解
每个文件由一行或多行组成,每行包含以下字段:
| 字段 | 含义 | 数据类型 | 说明 |
|---|---|---|---|
some / full |
压力类型 | 字符串 | some=至少一个任务受阻;full=所有非空闲任务受阻 |
avg10 |
最近10秒平均压力 | 浮点数(0.00~1.00) | 百分比值,如0.50表示50%的时间存在压力 |
avg60 |
最近60秒平均压力 | 浮点数(0.00~1.00) | 反映中期趋势,适合作为告警基准 |
avg300 |
最近300秒平均压力 | 浮点数(0.00~1.00) | 反映长期基线,用于容量规划 |
total |
累计压力时间(微秒) | 无符号64位整数 | 系统启动至今的总延迟累积,用于计算增量 |
关键解读: avg10/avg60/avg300 的值范围是 0.00 ~ 1.00,对应 0% ~ 100%。例如
avg10=0.85 表示在过去10秒内,有85%的时间至少有一个任务因资源不足而等待。这个百分比直接决定了告警阈值的大小——通常生产环境建议在 0.30~0.70 区间设置告警。
3.4 PSI数据获取流程
3.5 数据解读实战示例
以下是一个真实生产环境的IO压力输出:
# cat /proc/pressure/io
some avg10=0.72 avg60=0.45 avg300=0.21 total=2847123456
full avg10=0.35 avg60=0.18 avg300=0.08 total=987654321
解读要点:
- some avg10=0.72:过去10秒内,72%的时间有任务在等待IO,属于严重告警级别。
- full avg10=0.35:35%的时间所有非空闲任务都在等待IO,系统已出现明显卡顿。
- avg60=0.45 / avg300=0.21:中期和长期趋势显示压力正在快速上升,需要立即介入。
- total:累计延迟时间,可用于计算每秒增量,判断压力是否持续恶化。
常见误区: 不要只看
avg10 就下结论。短时突发可能导致avg10偏高,但avg60和avg300如果很低,说明只是瞬时抖动。建议将三个时间窗口结合判断:avg10 > 阈值 且 avg60 > 阈值×0.7 时再触发告警,可有效减少误报。
3.6 文件格式与监控工具对照
| 监控工具 | 数据来源 | 是否依赖/proc/pressure | 典型采集间隔 |
|---|---|---|---|
| Prometheus + node_exporter | /proc/pressure | 是(≥0.18.0版本) | 15s |
| Telegraf | /proc/pressure | 是(≥1.14.0版本) | 10s |
| Datadog Agent | /proc/pressure | 是(≥7.27.0版本) | 15s |
| 自定义Shell脚本 | 直接cat读取 | 是 | 自定义 |
最佳实践: 在采集PSI数据时,建议同时记录
total 字段的增量变化。通过计算 Δtotal / Δtime 可以得到每秒压力持续时间(微秒/秒),这个指标比avg值更敏感,适合作为早期预警信号。