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 架构图)
下图展示了从内核统计点到用户态监控系统的完整数据流:
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 更灵敏,适合早期预警。