在 Ubuntu(以及其他 Linux 发行版)中,使用 swap 时出现“卡顿”是非常常见的现象,本质原因是:系统被迫使用磁盘代替内存,而磁盘速度远低于内存。下面从原理到具体原因系统说明。
一、为什么 swap 会导致卡顿(核心原理)
- 内存(RAM):速度极快(GB/s 级)
- Swap(磁盘/SSD):速度慢得多(HDD 几 MB/s,SSD 也远慢于 RAM)
当物理内存不足时:
- 系统把不常用的内存页写到 swap
- 当这些页面再次被访问时,必须从磁盘读回内存
- 应用线程被阻塞,等待 I/O
➡ 结果:界面卡、鼠标动不了、程序无响应
二、Ubuntu 中常见的 swap 卡顿原因
1. 物理内存不足(最常见)
- 开太多浏览器标签
- 跑 Docker / 虚拟机
- 编译大型项目
- 内存小于 4–8GB 却跑桌面环境
✅ 表现:
- 卡顿前风扇转
free -h 看到 swap 被大量使用
2. swappiness 设置不合理
Ubuntu 默认:
cat /proc/sys/vm/swappiness
- 60 表示:内存用到 40% 就可能开始 swap
- 对桌面系统偏高
✅ 结果:
- 明明还有内存,却开始 swap
- 导致“莫名其妙卡”
3. 使用了 HDD 作为 swap
- HDD 随机读写极慢
- 一旦开始 swap,系统几乎“假死”
✅ 对比:
- HDD swap:非常卡
- SATA SSD:可接受
- NVMe SSD:影响较小
4. Swap 文件/分区碎片化或位置差
- swap 文件在 HDD 上
- 文件碎片化严重
- 磁盘本身 IO 已饱和
5. 系统“抖动”(Thrashing)
- 内存极小
- 不断 swap in / swap out
- CPU 大量时间花在等磁盘
✅ 表现:
6. zram / zswap 未启用(内存小机器)
Ubuntu 默认:
- 20.04+ 桌面版:通常用 swap file
- 服务器版:可能没有压缩 swap
❌ 没用 zram:
三、如何判断是否 swap 导致卡顿
1. 查看内存和 swap
free -h
如果:
2. 查看 IO 等待
top
看 %wa(IO wait)是否很高
3. 看谁在用 swap
sudo smem -s swap -r | head
四、解决 / 缓解方案(实用)
✅ 1. 降低 swappiness(强烈推荐)
sudo sysctl vm.swappiness=10
永久生效:
echo 'vm.swappiness=10' | sudo tee -a /etc/sysctl.conf
✅ 2. 增加物理内存(根本方案)
✅ 3. 使用 SSD / NVMe 做 swap
避免 HDD swap
✅ 4. 启用 zram(小内存神器)
sudo apt install zram-tools
自动压缩内存,减少磁盘 swap
✅ 5. 限制内存占用程序
- 浏览器标签数
- Docker 内存限制
- 关闭无用服务
五、一句话总结
Ubuntu swap 卡顿的本质是:内存不够 → 系统用慢速磁盘代替内存 → 程序等待 I/O → 卡死感
如果你愿意,可以告诉我:
- Ubuntu 版本
- 内存大小
- 是否 SSD
- 卡顿时在干什么
我可以给你针对性的优化方案。