温馨提示×

ubuntu swap占用高为何

小樊
47
2026-09-22 11:31:36
栏目: 智能运维

在 Ubuntu 中,swap 占用高通常并不是“swap 本身有问题”,而是内存压力或系统行为导致系统在频繁使用 swap。下面从「原因 → 排查 → 解决」系统说明。


一、常见原因

1️⃣ 物理内存不足(最常见)

当 RAM 用满,内核会把不常用的内存页换到 swap。

表现:

  • free -h 中 Mem 几乎用满
  • Swap 占用持续增长

排查:

free -h
top
htop

2️⃣ swappiness 设置偏高

swappiness 决定系统“多早开始用 swap”。

Ubuntu 默认:

  • 服务器:60
  • 桌面:可能更低

查看:

cat /proc/sys/vm/swappiness

如果值很高(如 60~100),即使内存还没满,也可能用 swap。


3️⃣ 某些进程长期占用内存但很少活动

例如:

  • 数据库(MySQL / PostgreSQL)
  • Java 应用
  • Docker 容器
  • 后台服务

这些进程不活跃但占内存,内核会优先 swap 它们。


4️⃣ 内存泄漏

某个程序内存只增不减,最终逼系统用 swap。

排查:

ps aux --sort=-%mem

5️⃣ Swap 被“用进去后不释放”

⚠️ 注意:

  • swap 占用高 ≠ 当前内存紧张
  • 一旦换出,即使内存空闲,也不会自动换回

这是正常现象。


6️⃣ 休眠(hibernate)相关

如果启用过 hibernate:

  • swap 会保留大量数据
  • 即使唤醒也不会立即清空

二、如何判断“是否真的有问题”

✅ 正常情况:

  • swap 占用高,但 si/so 为 0
  • 系统不卡

❌ 异常情况:

vmstat 1

看到:

  • si / so 持续 > 0
  • 系统卡顿、IO 高

说明:正在频繁 swap(thrashing)


三、解决方案

✅ 1. 降低 swappiness(推荐)

sudo sysctl vm.swappiness=10

永久生效:

echo 'vm.swappiness=10' | sudo tee -a /etc/sysctl.conf

✅ 2. 找出并限制内存大户

ps aux --sort=-%mem | head
  • 限制 Docker 内存
  • 调整 JVM 参数
  • 优化数据库缓存

✅ 3. 增加物理内存 or Swap

  • 内存 < 4G:swap ≥ 2G
  • 内存 ≥ 8G:swap 可 2–4G

✅ 4. 手动释放 swap(谨慎)

⚠️ 仅用于“确认内存足够”的情况:

sudo swapoff -a
sudo swapon -a

✅ 5. 关闭 swap(仅服务器且内存充足)

sudo swapoff -a

并注释 /etc/fstab 中的 swap 行


四、一句话总结

Ubuntu swap 占用高,本质是“内存不够 or 内核认为可以换出”,不一定是故障。

如果你愿意,可以贴出:

free -h
swapon --show
vmstat 1 5

我可以帮你精确定位是哪一类问题。

0 踩