首页 > Sysadmin > 正文

Linux 系统内存不足时的 6 个缓解思路

huyuanwen 2026-11-02 Sysadmin

草稿待审: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 基于文档核查,尚未实际执行

参考资料

文中主要命令已在 WSL Ubuntu(24.04)实测并核对其在 Debian 系与通用发行版的文档口径。