1. PSI 概念与背景:什么是 PSI,为什么需要关注延迟尖峰

1.1 什么是 PSI(Pressure Stall Information)

PSI(Pressure Stall Information)是 Linux 内核 4.20 版本引入的资源压力度量机制,由 Facebook 工程师 Johannes Weiner 主导设计。它通过跟踪任务因等待 CPU、内存 或 I/O 资源而处于不可运行状态的时间比例,量化系统资源的“拥堵程度”。

与传统的 CPU 使用率、内存占用率等均值指标不同,PSI 直接测量任务因资源争抢而产生的 延迟,能够更真实地反映终端用户和应用程序的体验。

1.2 PSI 的三种资源维度

资源类型 PSI 文件路径 度量对象 典型场景
CPU /proc/pressure/cpu 任务因 CPU 资源不足而等待运行的时间比例 高并发计算、线程池满载
内存 /proc/pressure/memory 任务因内存回收或 swap 而等待的时间比例 内存泄漏、OOM 前兆、频繁缺页
I/O /proc/pressure/io 任务因磁盘/网络 I/O 等待而阻塞的时间比例 日志刷盘、数据库写放大、存储瓶颈

1.3 PSI 的度量指标:some 与 full

每个资源维度下,PSI 提供两种压力指标:

  • some:系统中至少有一个任务因该资源而 stall 的时间比例。反映资源争抢的“广度”。
  • full:系统中所有非 idle 任务都因该资源而 stall 的时间比例。反映资源争抢的“深度”,通常与服务质量下降直接相关。

每个指标包含三个时间窗口的累计值:avg10(10 秒平均)、avg60(60 秒平均)、avg300(300 秒平均),以及 total(自系统启动以来的总 stall 微秒数)。

示例: 查看当前内存压力情况
cat /proc/pressure/memory
some avg10=2.35 avg60=1.87 avg300=1.12 total=8543210
full avg10=0.89 avg60=0.64 avg300=0.38 total=3210987

解读:过去 10 秒内,平均有 2.35% 的时间至少有一个任务因内存而 stall;平均有 0.89% 的时间所有非 idle 任务都因内存而 stall。

1.4 为什么需要关注延迟尖峰

传统的系统监控指标(如 CPU 使用率 95%、内存使用率 80%)存在两个致命缺陷:

  1. 均值掩盖尖峰:1 分钟内 CPU 平均使用率 60%,可能掩盖了 3 次持续 5 秒的 100% 使用率尖峰,而这 5 秒足以导致服务超时雪崩。
  2. 资源使用率 ≠ 延迟:CPU 使用率 70% 时,任务可能已经因锁竞争或调度延迟而等待了数百毫秒;而 CPU 使用率 90% 时,如果任务亲和性良好,延迟可能仍然很低。

延迟尖峰是 系统可观测性中最难捕捉、破坏性最大 的异常模式。一次 200ms 的延迟抖动,在微服务调用链中可能放大为 2s 的端到端超时,引发级联故障。

关键认知: PSI 不是替代 CPU/内存使用率,而是补充。使用率告诉你“资源有多忙”,PSI 告诉你“任务有多痛”。在延迟尖峰告警场景中,PSI 是比使用率更直接的信号源。

1.5 PSI 与延迟尖峰的关系

延迟尖峰的本质是任务在短时间内经历 非预期的资源等待。PSI 的 full 指标天然适合检测这种场景:

  • 当 full avg10 从 0.1% 跳变到 5%,意味着过去 10 秒内所有任务有 5% 的时间在空转等待资源——这几乎必然对应着请求延迟的显著增加。
  • PSI 的 total 累积值可以用于计算 瞬时压力增量,从而在秒级粒度上识别尖峰。

下图展示了 PSI 在系统资源压力传递链中的位置:

PSI 在系统资源压力传递链中的位置 应用 / 服务 内核调度器 PSI 度量 CPU 资源 内存资源 I/O 资源 延迟尖峰 告警系统 说明: PSI 位于内核调度器与资源之间,直接度量任务因资源 争抢而产生的 stall 时间。当 PSI full 指标出现瞬时跳变, 意味着所有任务都在等待资源,延迟尖峰几乎必然发生。

1.6 PSI 的典型应用场景

  • 延迟敏感服务告警:对 full avg10 设置阈值,当压力超过 1% 时触发 P1 告警,比 CPU 使用率告警提前 10-30 秒发现异常。
  • 容量规划:通过 PSI 趋势判断资源是否接近瓶颈,在延迟恶化前扩容。
  • 根因定位:结合 cpu、memory、io 三个 PSI 文件,快速定位延迟尖峰的资源维度。
  • 混部场景:在离线任务混部时,PSI 可以量化在线任务被离线任务干扰的程度。
实践建议: 在首次部署 PSI 监控时,建议先以 some avg10 > 5% 或 full avg10 > 1% 作为初始告警阈值,运行 1-2 周后根据实际基线调整。不要直接使用内核默认的 10%/5% 阈值,那通常已经太晚了。