4. PSI 监控工具介绍:从内核接口到生产级采集

PSI 指标的内核接口是统一的,但生产环境需要将原始数据转化为可告警、可可视化的时间序列。本章介绍三种核心工具:内核 proc 文件、轻量级 CLI 工具 psi、以及 Prometheus 生态的 psi_exporter。理解它们的差异与适用场景,是后续设定阈值的基础。

4.1 内核原始接口:/proc/pressure

Linux 内核 4.20+ 通过 /proc/pressure 目录暴露三个文件,分别对应 CPU、内存、I/O 的 PSI 数据。这是所有上层工具的数据源。

文件路径 资源类型 输出格式示例
/proc/pressure/cpu 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 I/O 等待 some avg10=0.00 avg60=0.00 avg300=0.00 total=0
full avg10=0.00 avg60=0.00 avg300=0.00 total=0

字段说明:

  • some:至少有一个任务因资源不足而 stall 的时间占比。
  • full:所有非空闲任务同时 stall 的时间占比(仅 memory 和 io 有)。
  • avg10 / avg60 / avg300:过去 10 秒 / 60 秒 / 300 秒的滑动平均百分比。
  • total:系统启动以来的累计 stall 微秒数。
生产建议: 直接读取 /proc/pressure/* 适合脚本验证,但不适合大规模采集。内核接口无历史存储、无聚合、无告警逻辑,必须配合上层工具使用。

4.2 轻量级 CLI 工具:psi

psi 是一个用 Go 编写的开源命令行工具,专门用于实时观察 PSI 指标。它不依赖任何外部服务,适合在单机排障时快速查看压力状态。

安装与使用:

# 从 GitHub Release 下载二进制
wget https://github.com/xxxx/psi/releases/latest/download/psi-linux-amd64
chmod +x psi-linux-amd64
sudo mv psi-linux-amd64 /usr/local/bin/psi

# 实时监控(每秒刷新)
psi watch

# 查看当前快照
psi snapshot

输出示例:

┌──────────┬──────────┬──────────┬──────────┐
│ Resource │ avg10    │ avg60    │ avg300   │
├──────────┼──────────┼──────────┼──────────┤
│ cpu      │ 0.00%    │ 0.00%    │ 0.00%    │
│ memory   │ 0.50%    │ 0.30%    │ 0.10%    │
│ io       │ 2.10%    │ 1.80%    │ 1.20%    │
└──────────┴──────────┴──────────┴──────────┘
适用场景: 临时诊断、容器内快速验证、无 Prometheus 环境下的应急排查。不适合长期存储和告警。

4.3 生产级采集:Prometheus psi_exporter

psi_exporter 是 Prometheus 生态的专用 exporter,将 /proc/pressure 指标转换为 Prometheus 格式的 metrics,支持标签、聚合、告警规则集成。

架构位置:

psi_exporter 采集架构 Linux 内核 /proc/pressure/* psi_exporter :9100/metrics Prometheus Server scrape / 告警评估 read HTTP scrape Alertmanager 告警通知 告警规则 Grafana 仪表盘 查询 说明: psi_exporter 作为内核与监控系统的桥梁,将原始 proc 数据转换为带标签的 Prometheus metrics, 支持 avg10/avg60/avg300 和 total 四个维度的告警与可视化。

部署示例:

# 使用 systemd 管理 psi_exporter
cat <<EOF | sudo tee /etc/systemd/system/psi_exporter.service
[Unit]
Description=PSI Exporter
After=network.target

[Service]
ExecStart=/usr/local/bin/psi_exporter --web.listen-address=:9100
Restart=always
User=nobody

[Install]
WantedBy=multi-user.target
EOF

sudo systemctl daemon-reload
sudo systemctl enable --now psi_exporter

暴露的 Prometheus metrics 示例:

# HELP psi_cpu_some_avg10 CPU PSI some avg10 percentage
# TYPE psi_cpu_some_avg10 gauge
psi_cpu_some_avg10 0.0

# HELP psi_memory_some_avg10 Memory PSI some avg10 percentage
# TYPE psi_memory_some_avg10 gauge
psi_memory_some_avg10 0.5

# HELP psi_io_full_avg10 IO PSI full avg10 percentage
# TYPE psi_io_full_avg10 gauge
psi_io_full_avg10 2.1

4.4 工具选型对比

维度 /proc/pressure psi CLI psi_exporter
数据持久化 无 无 通过 Prometheus 存储
告警能力 无 无 支持 Prometheus 告警规则
可视化 无 终端表格 Grafana 仪表盘
多机聚合 无 无 支持
适用规模 单机调试 单机排障 生产集群
资源开销 极低 低 中(Go 进程)
注意: 不要在生产环境直接使用 cat /proc/pressure/* 做高频轮询(如每秒一次)。内核接口的读取本身有轻微开销,高频读取可能干扰 PSI 统计精度。推荐使用 psi_exporter 的默认采集间隔(15s)。

4.5 本章小结

  • /proc/pressure 是内核原始接口,提供 some/full 和 avg10/60/300 四个维度的数据。
  • psi CLI 适合单机快速诊断,无持久化能力。
  • psi_exporter 是生产环境的标准选择,与 Prometheus + Alertmanager + Grafana 形成完整可观测链路。
  • 后续章节的阈值设定和告警规则,均基于 psi_exporter 暴露的 metrics 进行配置。