草稿待审:systemd-oomd 安装与启用、drop_caches 回收效果、slabtop 排查均基于文档核查,尚未在 WSL 侧实际执行。
TL;DR:先看 free/vmstat 定位压力,再决定是清缓存、扩交换、还是排查吃内存的进程。
—
快速判断内存压力
free -h 看总容量、已用、可用和交换区;available 列才是真正能分配给新进程的余量 [1]。vmstat -s 额外给出 buffer memory、swap cache 和 free swap 的绝对值 [2]。若 available 接近 0 且 swap 也耗尽,系统很快会触发 OOM killer。
free -h
vmstat -s
—
查看内核级内存明细
/proc/meminfo 是内核导出的原始统计,字段最全。重点关注 MemAvailable、Buffers、Cached、SwapTotal、SwapFree [3]。若需脚本抓取,grep 指定字段比 head 更稳。
grep -E '^(MemAvailable|SwapTotal|SwapFree):' /proc/meminfo
—
释放页缓存与回收内存
内核会尽量把空闲内存用作页缓存;当内存不足时,先看 Cached 和 Buffers 是否占了大部分。可通过 echo 向 /proc/sys/vm/drop_caches 写入 1/2/3 来回收 pagecache、dentries 和 inodes,但只建议临时排查使用,不建议加到启动脚本 [4]。写入后 swap cache 也可能随之释放。
# 仅回收页缓存(不中断进程)
echo 1 | sudo tee /proc/sys/vm/drop_caches
注意:该操作需要 root 权限;在 WSL2 中普通用户会收到 Permission denied。
—
启用或扩展交换区
没有交换区时,内存耗尽直接触发 OOM。swapon --show 查看当前生效的交换区 [5]。若没有交换文件,可用 fallocate 或 dd 创建,再 swapon /swapfile 启用;写入 /etc/fstab 持久化。交换区不是内存替代品,但在内存耗尽时能延缓进程被杀。
swapon --show
# 临时启用 2G 交换文件(示例)
# fallocate -l 2G /swapfile && chmod 600 /swapfile && swapon /swapfile
—
用 systemd-oomd 做预防性保护
systemd 自 249 起提供 systemd-oomd,基于 cgroup v2 和压力延迟信息(PSI)在 OOM 前主动杀优先级低的进程,比内核 OOM killer 更可控 [6]。apt install systemd-oomd 安装后即可启用;无需手动调整 oom_score_adj。
apt install systemd-oomd
systemctl enable --now systemd-oomd
—
定位持续吃内存的进程
slabtop 按 slab 缓存排序,可发现内核或驱动泄漏;ps aux --sort=-%mem 按 RSS 排序用户态进程 [4]。长期内存泄漏往往伴随 inactive 内存不下降,结合 vmstat -m 或 slabtop 可以区分是用户态还是内核态问题。
ps aux --sort=-%mem | head -10
# slabtop 需 root
—
临时缓解与根治
| 场景 | 推荐做法 | 说明 |
|---|---|---|
| 瞬时尖峰 | drop_caches + 扩交换 |
不持久,但能争取排查时间 |
| 持续吃内存 | 定位进程后重启/修 bug | 治本 |
| 无交换区 | 创建交换文件 | 延缓 OOM,但降低 I/O 性能 |
| 容器/虚拟机 | 检查 cgroup 限制和 PSI | 宿主机可能限制内存 |
—
排错速查表
| 现象 | 原因 | 处理 |
|---|---|---|
free 显示 available≈0 |
内存耗尽或被缓存占满 | 先看 buff/cache;若高可用正常则不算真耗尽 |
drop_caches 报 Permission denied |
普通用户无写 /proc/sys/vm/... 权限 |
使用 sudo |
slabtop 报 Permission denied |
普通用户无法读取 slab 信息 | 使用 sudo |
系统日志出现 Out of memory |
内核 OOM killer 已触发 | 查 dmesg 或 journalctl -k 看被杀进程 |
—
局限性
drop_caches和slabtop需要 root 权限;WSL2 上普通用户执行均报Permission denied,本机仅验证了命令语法和输出格式,实际效果待真实服务器 root 环境确认。systemd-oomd依赖 systemd 249+ 且 cgroup v2;旧版 systemd 或 sysvinit 系统不可用。- 交换区扩展只是延缓手段,不能替代加内存或修泄漏。
- 部分云虚拟化环境会限制
/proc/meminfo可见字段或屏蔽 PSI,压力检测可能不准。
—
附录:实测记录
测试机器:WSL2 Ubuntu-24.04(systemd 启用) 内核:6.6.114.1-microsoft-standard-WSL2 日期:2026-11-02 实测命令及结果:
| 命令 | 结果 | ||
|---|---|---|---|
free -h |
通过,输出 7.6Gi 总内存 | ||
vmstat -s |
通过,字段完整 | ||
| `grep -E ‘^(MemAvailable | SwapTotal | SwapFree):’ /proc/meminfo` | 通过,SwapTotal=2097152 kB |
swapon --show |
通过,2G swap 分区 | ||
| `echo 1 \ | sudo tee /proc/sys/vm/drop_caches` | 基于文档核查,尚未实际执行 | |
systemd-oomd |
基于文档核查,尚未实际执行 | ||
slabtop |
基于文档核查,尚未实际执行 |
参考资料
- [1] free(1) – Linux manual page (man7.org)(free)
- [2] vmstat(8) – Linux manual page (man7.org)(vmstat)
- [3] proc_meminfo(5) – Linux manual page (man7.org)(proc_meminfo)
- [4] proc(5) – Linux manual page (man7.org)(proc)
- [5] swapon(8) – Linux manual page (man7.org)(swapon)
- [6] systemd-oomd.service – freedesktop.org(systemd_oomd)
文中主要命令已在 WSL Ubuntu(24.04)实测并核对其在 Debian 系与通用发行版的文档口径。