首页/系统/Linux 内核与性能调优速查/内存压力 PSI(/proc/pressure/memory)
内存与 OOM58 条

内存压力 PSI(/proc/pressure/memory)

量化因内存不足导致的停顿:some 表示至少一个任务受影响,full 表示所有任务都被回收阻断;avg300 适合看长期趋势。

文件是什么

PSI 的内存视图在 /proc/pressure/memory:some 表示至少有一个任务因为内存不足(等分配、等回收)而停顿的时间占比,full 表示所有可运行任务都被内存相关操作挡住的时间占比。内存与 IO 是仅有的两个提供 full 语义的资源,因此 full 行是判断「系统级卡顿」的关键信号;avg300 更适合观察长期趋势,绝对值需要靠差分理解增量。

基本信息

文件路径/proc/pressure/memory;cgroup 视图为 <组>/memory.pressure
字段some 与 full 各自带 avg10、avg60、avg300 与 total
前提内核 CONFIG_PSI=y,部分版本需要 psi=1 启动参数
语义差异some 表示至少一个任务受影响,full 表示全部任务被挡
配套指标memory.events、/proc/vmstat 的回收与换页计数
观测视角全局文件是宿主视图,cgroup 文件才代表该组自身

典型使用场景

  • 定位容器内存压力:把 memory.pressure 与 memory.events 结合看是限额还是节点资源问题
  • 区分「内存不够」与「内存够但回收慢」:前者 some 与 full 同时上升,后者多表现为回收计数高
  • 量化 swap 使用带来的停顿,判断是否应该限制换出
  • 评估 memory.high 软限额的代价:节流期间 pressure 会明显抬高
  • 容量规划:在压测中记录不同负载下的 avg60,找出压力上扬的拐点

查看与交叉验证

查看与交叉验证
cat /proc/pressure/memory  # 全局视图,包含 some 与 full 两行
cat /sys/fs/cgroup/myapp.slice/memory.pressure  # 只看该 cgroup 的压力
awk '/full/{print $1,$2,$3,$4}' /proc/pressure/memory  # 单独看 full 的三个时间窗均值
cat /sys/fs/cgroup/myapp.slice/memory.events  # 交叉验证:high/max/oom_kill 计数
grep -E 'allocstall|pgscan_direct|pswpout' /proc/vmstat  # 回收与换出的原始计数
vmstat 1 5  # 观察 si/so 是否持续非零,判断是否在频繁换页

行与字段读法

行/字段含义判读要点
some至少一个任务因内存而停顿偶发增长在批量回收时常见
full所有可运行任务都被内存操作挡住持续增长才说明系统级卡顿
avg10/60/300不同时间窗的停顿百分比趋势看 avg300,即时看 avg10
total累计停顿微秒必须两次采样求差
full 行持续增长才代表到了全局受制的程度;some 偶发上升在页缓存回刷、周期性回收时属于正常现象,单凭 some 增长不能断定内存不足。
内存压力可能来自物理内存不足,也可能来自 cgroup 限额。容器里出现 full 增长时,先对照 memory.events 与 memory.max:若 high/max 计数同步增长,多半是本组限额过紧而非节点资源告急。

易错点

  • 只看 some 忽略 full:两者的严重程度完全不同,只读一行容易低估问题
  • 在 CPU 压力文件里找 full 行:CPU 侧只有 some,属内核设计,不是配置错误
  • 用 total 的绝对值判断现状:累计值必须差分,否则无法回答「最近是否仍在发生」
  • 在容器里读到宿主视图:需 cgroup v2 与正确路径权限,否则结论会张冠李戴
  • 文件不存在时不查前提条件:应确认内核版本、CONFIG_PSI 与 psi 启动参数,而不是直接放弃观测

数据来源与参考

  • Linux 内核 Documentation/accounting/psi.rst
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌