psi是linux内核4.20引入的压力停滞信息机制,通过精确统计任务因cpu、内存或io资源不足而停滞的时间占比,真实反映系统资源争用程度,比cpu利用率和load average更准确。

Linux 查看系统资源争用压力,不能只看 CPU 利用率或内存使用率——那些反映的是“用了多少”,不是“等了多久”。真正衡量争用程度的指标是 PSI(Pressure Stall Information),它直接统计任务因缺 CPU、内存或 IO 而停滞的时间占比。
PSI 是什么,为什么比 load average 更准
PSI 从内核 4.20 开始默认启用(主流发行版如 Ubuntu 20.04+/RHEL 8+ 均支持),它不依赖采样或估算,而是通过调度器和内存子系统埋点,精确记录:
- CPU:任务就绪但无 CPU 可运行的时间
- memory:任务等待内存分配、回收或 swap-in 的时间
- io:任务等待块设备 I/O 完成的时间
相比 load average(只统计就绪队列长度,受进程数干扰大),PSI 的 some 和 full 指标能区分“变慢”和“卡死”:
- some > 5% 表示延迟开始上升(比如 GC 频繁、page reclaim 加剧)
- full > 1% 就意味着吞吐量已严重受损(如所有进程都在等 swap)
快速查看 PSI 的三个命令
PSI 数据暴露在 /proc/pressure/ 下,无需安装额外包:
-
cat /proc/pressure/cpu—— 显示 CPU pressure 的 10s/1m/5m 滑动平均值(some和full) -
cat /proc/pressure/memory—— 同上,但对内存压力更敏感(OOM 前几秒full会跳升) -
cat /proc/pressure/io—— 注意:该值在无 I/O 竞争时可能长期为 0,不代表磁盘健康,只反映当前是否阻塞
输出格式示例:some=0.50 full=0.05 avg10=0.12 avg60=0.08 avg300=0.03 total=123456789,其中 avg10 单位是毫秒,表示过去 10 秒内有 123ms 处于 some 压力状态。
用 psi-monitor 实时观察压力趋势
原生 PSI 输出是静态快照,要持续监控需轮询。推荐轻量工具 psi-monitor(非系统自带,需手动编译或下载二进制):
- 它每秒读取
/proc/pressure/并计算增量,避免自己写 while 循环解析文本 - 支持阈值告警:比如
psi-monitor -m "memory:full>0.5"在内存full压力超 0.5% 时触发通知 - 注意:不要用
watch -n1 cat /proc/pressure/memory—— 高频轮询会增加 scheduler 开销,反而抬高 PSI 值
PSI 和传统命令的配合逻辑
单独看 PSI 只知“有多堵”,需结合其他命令定位“堵在哪”:
- 当
memory:full高 → 立即执行cat /sys/fs/cgroup/memory/memory.pressure(若用 cgroup v2)确认是否某容器导致;再用ps aux --sort=-%mem | head -5查内存大户 - 当
io:some持续 > 10% → 用iostat -x 1看%util是否接近 100%,同时检查await是否飙升(说明 I/O 响应慢,不一定是磁盘满) - 当
cpu:some高但top中 %CPU 不高 → 很可能是短时突发任务(如 cron job、日志刷盘),用pidstat -u 1捕获 1 秒粒度的 CPU 使用峰值
PSI 的关键价值在于它不撒谎:load average 可能因大量 sleep 进程虚高,free 显示内存充足却仍发生 OOM——只有 PSI 能告诉你“任务到底被卡住了多久”。生产环境里,它应该成为你第一个检查的指标,而不是最后一个。











