登录
推荐 文章 Go 技术 课程 下载 专题 AI
首页 >  文章 >  linux

Linux PSI判断内存压力来源

来源:17golang原创

时间:2026-11-15 17:01:16 430浏览 收藏

Linux PSI 判断内存压力来源,关键不是看“内存用了多少”,而是看任务因为内存资源等待了多久,再把这段等待与回收、swap、cgroup 限制和 OOM 证据对齐。先读 /proc/pressure/memory:some 表示至少有一部分任务被内存拖住,full 表示所有非空闲任务同时陷入该类等待;当 full 持续升高时,通常已经接近系统抖动,而不是普通缓存增长。

官方地址:https://docs.kernel.org/accounting/psi.html

要点速览
  • 先看 some/full 的时间趋势,再看单点内存占用。
  • 用回收、swap 和 cgroup 指标确认压力来自哪里。
  • PSI 是压力信号,不单独等于 OOM;必须与日志和业务延迟闭环。
一个可靠的判断链是:PSI 证明任务在等内存,vmstat 与 meminfo 解释内核正在做什么,cgroup 指标说明谁触顶,OOM 日志和延迟则说明结果有多严重。

先把 PSI 的内存信号读成两种压力

先用下面的命令查看主机级内存 PSI。命令只读取 procfs,不需要把输出误认为某次真实压测结果。

# 查看主机级内存压力;some 和 full 分别代表两种等待范围
cat /proc/pressure/memory

# 只提取近 10 秒、60 秒和 300 秒的平均压力,便于做趋势对比
awk '{print $1, $2, $3, $4}' /proc/pressure/memory

典型格式包含 avg10、avg60、avg300 和累计的 total。avg10 突然升高而长期值接近零,多半是短时回收或突发分配;三个窗口一起抬升,说明压力已经持续。total 适合配合采集器计算增量,但不能单独说明当前是否正在恶化。

some 升高只说明部分任务在等待,CPU 仍可能有其他工作可做;full 升高则说明所有非空闲任务同时卡在内存压力上,持续时间过长就应优先排查抖动。两者都不是“已发生 OOM”的同义词。

Linux PSI 内存压力中 some、full 与 avg10、avg60、avg300 的静态关系图
图1:结构说明图展示 Linux PSI 的内存压力信号、时间窗口与 some/full 含义,不是截图或运行证据。

用回收与 swap 证据解释压力来源

确认 PSI 有压力后,不要马上扩大内存。把同一时刻的回收和 swap 指标放在一起看:

# 观察回收、运行队列和 swap 活动;采样间隔按现场容量调整
vmstat 1 5

# 查看可回收内存、匿名页、文件页和提交量等背景信息
grep -E 'MemAvailable|SwapFree|SwapTotal|AnonPages|SReclaimable|Commit' /proc/meminfo
观察组合更可能的解释下一步
PSI some 上升,si/so 近零,回收不高短时分配竞争或文件页回收按时间窗口对照业务请求和缓存变化
some 与直接回收、si/so 同时升高匿名页紧张,swap 或内存回收拖慢任务检查 swap 延迟、匿名内存和分配峰值
full 持续升高,运行队列和服务延迟一起恶化系统出现明显内存抖动优先保护关键服务,再定位大户或容量边界

这里的“来源”是证据链,不是单个指标的标签。例如 MemAvailable 下降但 PSI 不升,可能只是缓存布局变化;反过来,内存占用不满但某个 cgroup 的 PSI 很高,通常应查它自己的限制。

Linux PSI 从内存压力到回收、swap、cgroup 与 OOM 证据的静态关系图
图2:关系说明图把 PSI、内存回收、swap、cgroup 边界和 OOM 日志放在同一排障模型中,不代表实际运行结果。

按 cgroup 区分整机压力与服务触顶

容器或 systemd 服务出现延迟时,主机级 PSI 可能把局部问题稀释掉。cgroup v2 通常可以查看对应目录下的 memory.pressure、memory.current、memory.max 和 memory.events。如果服务的 memory.pressure 明显升高,而主机级信号平稳,说明资源边界更可能在该组内部。

# 把 CGROUP_DIR 替换为已确认的 cgroup v2 目录,不要盲目遍历生产树
CGROUP_DIR=/sys/fs/cgroup/example.service

# 对照当前用量、硬上限、局部压力和内存事件
cat "$CGROUP_DIR/memory.current" "$CGROUP_DIR/memory.max"
cat "$CGROUP_DIR/memory.pressure" "$CGROUP_DIR/memory.events"

memory.max 受限时,服务可能在整机仍有余量的情况下先感到压力;memory.events 中的 high、max 或 oom 计数可以帮助确认是否越过了该边界。读取路径和字段会受 cgroup 版本、挂载方式及发行版配置影响,排查时先确认实际层级。

把 PSI 变成可行动的判断清单

值班时可以按四个问题收敛判断:第一,full 是否持续而不是瞬时尖峰;第二,回收和 swap 是否在同一窗口增加;第三,压力集中在主机还是某个 cgroup;第四,是否有 OOM、分配失败或业务延迟作为结果证据。四项都对上时,优先做限流、迁移或扩容;只有占用高而 PSI 平稳时,才适合把重点放在容量规划和缓存策略。

如果需要事件触发,内核 PSI 文档支持把阈值写入 /proc/pressure/memory,再用 poll、select 或 epoll 等待。阈值格式是 some|full stall_us window_us,窗口范围为 500ms 到 10s;生产环境应让采集器管理文件描述符生命周期,避免重复注册。

常见问题

PSI memory 高就等于内存不够吗?

不一定。它表示任务因内存资源发生等待,可能来自回收、cgroup 上限或突发分配;要结合回收、swap 和事件计数判断。

为什么内存还有空闲,cgroup 仍然有压力?

因为 cgroup 有自己的 memory.max 或其他边界,局部资源触顶时不能直接使用主机其他组的余量。

some 和 full 应该看哪个?

先看两者的时间趋势。some 用来发现部分任务受阻,full 用来识别全体非空闲任务同时等待的严重抖动,不能只盯一个数字。

总结

Linux PSI 最适合回答“任务是否真的被内存拖住”,而不是回答“谁占了多少内存”。先用 some/full 和多个时间窗口确认压力,再用回收、swap、cgroup 和 OOM 证据定位来源,最后把压力和业务延迟关联起来,才能把一个模糊的内存告警变成可执行的处理方案。

声明:本文转载于:17golang原创 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>