2、PSI数据采集原理:Linux内核PSI接口、/proc/pressure/目录结构、CPU/内存/IO的PSI文件解读

PSI(Pressure Stall Information)是 Linux 内核 4.20 版本引入的资源压力统计机制,用于量化 CPU、内存和 IO 资源因竞争导致的任务延迟比例。理解 PSI 的数据采集原理,是合理设定告警阈值的前提。

2.1 Linux 内核 PSI 接口

PSI 由内核调度器在每次任务状态切换时采样,统计任务因等待资源而停滞的时间。内核通过 /proc/pressure/ 伪文件系统暴露这些指标,用户态工具(如 cat、监控 Agent)可直接读取。

关键机制:PSI 不依赖外部探测器,而是内核在调度路径上插入的轻量级统计点,开销极低(< 1% CPU),适合生产环境持续采集。

2.2 /proc/pressure/ 目录结构

该目录包含三个文件,分别对应三种资源类型:

文件路径 资源类型 统计维度 典型场景
/proc/pressure/cpu CPU 任务等待 CPU 运行的时间占比 CPU 密集型服务、高并发线程池
/proc/pressure/memory 内存 任务等待回收页或分配内存的时间占比 内存超卖、OOM 边缘、大页分配
/proc/pressure/io IO 任务等待块设备或文件系统 IO 完成的时间占比 磁盘高延迟、日志落盘、数据库 WAL 写入
采集建议:监控 Agent 应每 5–10 秒读取一次这三个文件,避免高频读取增加内核锁竞争。推荐使用 prometheus/node_exporter 或自研采集器,解析 some 和 full 两行数据。

2.3 CPU / 内存 / IO 的 PSI 文件解读

每个 PSI 文件内容格式相同,包含两行统计:some 和 full。下面以 /proc/pressure/cpu 为例:

# cat /proc/pressure/cpu
some avg10=0.12 avg60=0.08 avg300=0.05 total=1234567890
full avg10=0.05 avg60=0.03 avg300=0.02 total=987654321

字段含义

字段 含义 单位 用途
some 至少有一个任务因资源不足而停滞的时间占比 百分比(0–100) 检测资源是否存在竞争
full 所有非空闲任务都因资源不足而停滞的时间占比 百分比(0–100) 检测资源是否严重过载
avg10 最近 10 秒的滑动平均压力值 百分比 短时告警(秒级抖动)
avg60 最近 60 秒的滑动平均压力值 百分比 中时告警(分钟级趋势)
avg300 最近 300 秒的滑动平均压力值 百分比 长时基线(小时级负载)
total 自系统启动以来的累计压力微秒数 微秒(μs) 计算增量速率,用于长期趋势分析
常见误解:PSI 的 avg10 不是瞬时值,而是指数加权滑动平均(EWMA),对突发抖动有平滑效果。告警阈值应基于 avg60 或 avg300 设定,避免被短时毛刺误触发。

2.4 三种资源的 PSI 差异对比

CPU、内存、IO 的 PSI 统计行为存在本质差异,直接影响阈值设定策略:

资源 some 典型含义 full 典型含义 内核统计触发点 告警敏感度
CPU 部分线程等待 CPU 时间片 所有可运行线程都在等待 CPU 调度器 pick_next_task 路径 中(受 CFS 调度影响)
内存 部分进程因缺页或回收阻塞 所有进程因内存不足阻塞 页面分配器 __alloc_pages_slowpath 高(内存抖动时飙升快)
IO 部分进程等待块设备 IO 所有进程因 IO 阻塞 块层 submit_bio 完成回调 高(磁盘故障时瞬间拉满)

2.5 PSI 数据采集流程(SVG 架构图)

下图展示了从内核统计点到用户态监控系统的完整数据流:

PSI 数据采集流程架构 内核调度器 内存页面分配器 块设备 IO 层 内核 PSI 统计模块(EWMA 计算 + total 累计) /proc/pressure/ 伪文件系统 cpu 文件 | memory 文件 | io 文件 用户态监控 Agent(node_exporter / 自研采集器)

2.6 PSI 数据采集与阈值设定的关系

理解采集原理后,可总结出以下阈值设定原则:

  • CPU PSI:关注 some avg60,阈值建议 5–10%。CPU 的 full 通常较低,除非发生硬锁或调度饥饿。
  • 内存 PSI:关注 full avg60,阈值建议 1–3%。内存 full 飙升往往预示 OOM 风险,需立即响应。
  • IO PSI:关注 some avg60 和 full avg60,阈值建议 5–10%。IO 压力具有突发性,建议结合 avg300 做基线对比。
  • total 增量:计算 total 字段的每秒增量(μs/s),可发现缓慢累积的资源压力,适合做预测性告警。
最佳实践:在采集层对 total 做差值计算,得到每秒压力微秒数(pressure_rate),再转换为百分比。例如:pressure_rate = (total_now - total_prev) / (采集间隔秒数 * 1000000) * 100。此指标比 avg10 更灵敏,适合早期预警。