PSI告警阈值设定从入门到实践 - 第1节

1.1 什么是 PSI(Pressure Stall Information)

PSI(Pressure Stall Information)是 Linux 内核 4.20 版本引入的一项资源压力度量机制,用于量化 CPU、内存和 IO 资源因竞争而导致的任务停滞时间比例。它从“任务等待资源”的角度出发,直接反映系统是否处于过载状态。

核心定义:PSI 指标衡量的是任务因等待某种资源(CPU、内存、IO)而处于不可运行状态的时间占总时间的百分比。数值越高,表示资源竞争越激烈,任务被“压住”的时间越长。

PSI 通过 /proc/pressure/ 接口暴露三个文件:

# 查看 CPU 压力
cat /proc/pressure/cpu

# 查看内存压力
cat /proc/pressure/memory

# 查看 IO 压力
cat /proc/pressure/io

每个文件输出格式示例:

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 至少有一个任务因资源不足而停滞的时间比例
full 所有任务都因资源不足而停滞的时间比例(系统完全卡住)
avg10 过去 10 秒的滑动平均压力百分比
avg60 过去 60 秒的滑动平均压力百分比
avg300 过去 300 秒的滑动平均压力百分比
total 自系统启动以来的累计压力微秒数
PSI 数据采集与输出架构 内核调度器 任务状态跟踪 资源压力检测 等待队列统计 PSI 计算引擎 滑动平均 / 累计 /proc/pressure/ cpu / memory / io 监控告警系统 some vs full 部分 vs 全部任务停滞

1.2 PSI 产生的背景与意义

传统指标的局限性

在 PSI 出现之前,运维人员主要依赖 CPU 使用率、内存使用量、IOPS 等传统指标判断系统负载。但这些指标存在明显盲区:

  • CPU 使用率 100% 并不一定意味着任务被阻塞——可能只是计算密集型任务在高效运行。
  • 内存使用率 90% 也不直接说明有内存回收压力——可能只是缓存占用了大量空间。
  • IOPS 很高 可能是正常业务流量,而非存储瓶颈。
关键问题:传统指标衡量的是“资源用了多少”,而非“任务等了多少”。PSI 直接测量后者,填补了“资源竞争导致任务停滞”这一关键观测空白。

PSI 的诞生背景

Google 工程师在数据中心运维中发现,许多“看起来正常”的机器实际上存在严重的资源竞争问题,导致应用延迟飙升。传统指标无法准确捕捉这类“隐形压力”。2018 年,Facebook 工程师 Johannes Weiner 主导将 PSI 合入 Linux 内核主线,旨在提供:

需求 传统指标能否满足 PSI 如何解决
量化任务等待时间 ❌ 无法直接测量 ✅ 直接统计不可运行时间占比
区分部分阻塞与完全阻塞 ❌ 无法区分 ✅ 提供 some / full 两个维度
短期与长期趋势 ❌ 缺乏滑动平均 ✅ 10s / 60s / 300s 三档滑动窗口
低开销持续监控 ⚠️ 采样间隔难平衡 ✅ 内核原生统计,几乎零开销

PSI 的运维意义

  • 提前发现资源瓶颈:在 CPU 使用率飙升至 100% 之前,PSI 可能已经显示 5%~10% 的压力值,提供预警窗口。
  • 精准定位瓶颈资源:通过对比 cpu / memory / io 三个维度的 PSI 数值,快速判断系统瓶颈所在。
  • 量化服务质量:PSI 的 full 指标直接反映“系统完全卡住”的时间比例,是衡量用户体验的重要依据。
  • 指导容量规划:长期 PSI 趋势数据可用于判断是否需要扩容或优化。

1.3 PSI 与 CPU / 内存 / IO 压力的关系

PSI 并非替代传统指标,而是从任务等待的视角补充传统资源指标。下面分别说明三种资源压力在 PSI 中的表现。

CPU 压力

当多个任务争抢 CPU 时间片时,部分任务会进入 TASK_RUNNING 但无法获得调度(即 runqueue 等待)。PSI 的 cpu.some 反映至少一个任务在等待 CPU 的时间比例。

  • 典型场景:Web 服务器并发过高、计算密集型批处理任务。
  • 关联传统指标:CPU 使用率、load average、上下文切换次数。
  • PSI 阈值参考:cpu.some avg10 > 10% 通常表示 CPU 资源紧张。

内存压力

内存压力主要来自回收机制(kswapd 或直接回收)。当系统内存不足时,内核需要回收页面,导致任务等待内存分配。PSI 的 memory.some 和 memory.full 反映这种等待。

  • 典型场景:内存泄漏、cgroup 内存限制过紧、大页分配失败。
  • 关联传统指标:内存使用率、swap 使用量、OOM 事件。
  • PSI 阈值参考:memory.some avg10 > 5% 或 memory.full avg10 > 1% 需关注。

IO 压力

IO 压力发生在任务等待块设备(磁盘、网络存储)完成读写操作时。这是最常见的性能瓶颈之一。PSI 的 io.some 和 io.full 直接量化 IO 等待对任务的影响。

  • 典型场景:数据库大量随机读写、日志写入过密、存储设备性能不足。
  • 关联传统指标:IOPS、IO 延迟、await、svctm、iowait。
  • PSI 阈值参考:io.some avg10 > 10% 或 io.full avg10 > 5% 通常表示 IO 瓶颈。
PSI 与三种资源压力的关系模型 用户任务 等待资源 → 停滞 CPU 压力 runqueue 等待 cpu.some 内存压力 页面回收等待 memory.some/full IO 压力 块设备等待 io.some/full CPU 使用率 / load 内存使用率 / swap IOPS / 延迟 / iowait PSI 从任务等待视角补充传统资源指标,两者结合才能全面评估系统健康度
实践建议:在搭建监控系统时,建议同时采集传统资源指标和 PSI 指标。传统指标用于判断“资源用了多少”,PSI 用于判断“任务等了多少”。两者结合才能全面评估系统健康度,避免误判。