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 分钟内 CPU 平均使用率 60%,可能掩盖了 3 次持续 5 秒的 100% 使用率尖峰,而这 5 秒足以导致服务超时雪崩。
- 资源使用率 ≠ 延迟: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 在系统资源压力传递链中的位置:
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% 阈值,那通常已经太晚了。