PSI 与 cpu 压力
PSI(Pressure Stall Information,内核 4.20 起)量化任务因为等资源而被迫停顿的比例,/proc/pressure/cpu 给出 CPU 侧视图。文件里 some avg10/avg60/avg300 是过去 10、60、300 秒内「至少有一个任务因等 CPU 而停下」的时间百分比,total 是自开机以来的累计微秒数。与 CPU 使用率不同,它衡量的是调度延迟造成的实际损失,因此常用来解释尾延迟恶化与容量不足。
基本信息
| 路径 | /proc/pressure/cpu;cgroup v2 下为 <组>/cpu.pressure |
|---|---|
| 字段 | some(avg10/avg60/avg300/total);CPU 不提供 full |
| 统计口径 | 停顿时间百分比(avg)与累计微秒(total) |
| 前提 | 内核 CONFIG_PSI=y;部分版本需 psi=1 启动参数 |
| 生效范围 | 全局文件给系统视图,cgroup 文件给该组视图 |
| 常用配套 | cpu.stat、load average、pidstat、mpstat |
典型使用场景
- 判断 CPU 是否真的成为瓶颈:使用率不高但 some 上升,说明调度延迟已在影响任务
- 容器/服务级观测:读自己的 cpu.pressure,判断是否被同机邻居或限额拖慢
- 尾延迟分析:把应用 P99 与 avg60 曲线对齐,验证延迟尖刺是否来自 CPU 争用
- 容量规划:压测中记录不同并发下的 avg300,找出压力开始持续上扬的拐点
- 与 load average 对比:load 含不可中断任务,PSI 只反映停顿,两者互为补充
查看与采样
查看与采样
cat /proc/pressure/cpu # 看全局 some 行的 avg10/avg60/avg300 与 total
cat /sys/fs/cgroup/myapp.slice/cpu.pressure # 只看该 cgroup 自己的压力视图
awk '/some/{print $1,$2,$3,$4}' /proc/pressure/cpu # 精简输出,便于脚本采集
total1=$(awk '/some/{print $NF}' /proc/pressure/cpu | sed 's/total=//'); sleep 30
# 30 秒后再读一次做差分,得到本时段的停顿增量(绝对值没有意义)
mpstat -P ALL 1 3 # 与每核使用率交叉验证,确认是整体还是个别核的问题
cat /sys/fs/cgroup/myapp.slice/cpu.max # 若在容器内,同时看限额是否过紧字段读法
| 字段 | 含义 | 判读 |
|---|---|---|
| some avg10 | 最近 10 秒的停顿占比 | 波动大,适合即时观察 |
| some avg60 | 最近 60 秒均值 | 判断当前压力状态的主力指标 |
| some avg300 | 最近 300 秒均值 | 看长期趋势与容量水位更稳 |
| total | 累计停顿微秒 | 必须两次采样求差,绝对值不说明现状 |
/proc/pressure/cpu 没有 full 行:CPU 上总会有任务在运行,内核因此只报告 some。需要「全体任务都被拖住」的语义时要去看 io 与 memory 的 pressure 文件。
PSI 与使用率是互补指标:使用率 100% 但任务都能按期望运行,some 可以很低;反过来使用率只有 60%、some 持续走高,说明存在明显的调度延迟。判断是否需要扩容,应看 some 的趋势而不是单看使用率。