Ubuntu 中 Swap 与 SSD 的搭配建议
一 核心结论与取舍
- 在现代 SSD 上启用 Swap 是可行且常见的做法,能显著降低因内存不足导致的 OOM 风险;与 HDD 相比,SSD 的延迟更低,交互更顺畅。需要权衡的是 SSD 的写入寿命,应避免长期、频繁的大页换出。若内存充足,可降低内核换出倾向(如 vm.swappiness 调低),必要时仅保留少量 Swap 作为兜底。若需要 休眠(Hibernate),Swap 容量必须不小于物理内存大小。对于大内存机器(如 ≥64GB),通常保留 4–8GB 或至多约 0.5×RAM 的 Swap 即可,无需“倍数级”配置。
二 容量与形式选择
- 容量建议(是否需要休眠是决定性因素):
- 需要休眠:Swap ≥ RAM 容量(常见做法为 RAM + 少许余量,便于安全边界)。
- 不需要休眠:
- ≤2GB RAM:Swap ≈ 2×RAM
- 2–8GB RAM:Swap ≈ RAM
- ≥16GB RAM:Swap ≈ 4–8GB(服务器可更低,如 2–4GB 作应急)
- 形式选择:
- Swap 文件:现代 Ubuntu 默认,灵活易调整大小,性能接近分区。
- Swap 分区:传统方式,连续空间、微幅性能优势,但扩容不便。
- 快速创建与启用示例(Swap 文件):
- 创建与启用
- sudo fallocate -l 4G /swapfile
- sudo chmod 600 /swapfile
- sudo mkswap /swapfile
- sudo swapon /swapfile
- 开机自动挂载:在 /etc/fstab 添加
- /swapfile none swap sw 0 0
- 验证
三 SSD 优化要点
- 降低换出倾向:将 vm.swappiness 设为 10–30(桌面可略高,服务器更低),减少不必要的磁盘写入。
- 查看:cat /proc/sys/vm/swappiness
- 临时:sudo sysctl vm.swappiness=10
- 永久:在 /etc/sysctl.conf 写入 vm.swappiness=10 并执行 sudo sysctl -p
- 启用 TRIM:保持 SSD 长期性能(现代 Ubuntu 桌面/服务器通常默认已启用;如使用 btrfs,请确认挂载选项包含 discard 或定期 fstrim)。
- 减少元数据写入:在 /etc/fstab 为 ext4 等挂载项增加 noatime(或 relatime),降低访问时间更新带来的写放大。
- 使用 Zswap(内核内置,优先于磁盘 Swap):在内存中先压缩页面,只有无法压缩的才写盘,能显著减少 I/O。
- 启用示例:编辑 /etc/default/grub,在 GRUB_CMDLINE_LINUX 添加
- zswap.enabled=1 zswap.compressor=lz4
- 更新并重启:sudo update-grub && sudo reboot
- 监控与告警:关注 si/so(swap in/out)与可用内存,长期高换出需评估是否扩容内存或优化应用内存占用。
四 场景化配置建议
- 桌面用户(如 8GB RAM,需要休眠):Swap 建议 8–12GB(满足休眠的 ≥RAM,并留有余量);若内存 ≥16GB 且不常休眠,Swap 4–8GB 通常足够。
- 服务器(如 32–64GB RAM):以稳定性兜底为主,Swap 2–8GB 即可;若内存 ≥64GB,可保留 4–8GB 或约 0.5×RAM,避免过大导致“假性存活”和性能劣化。
- 虚拟机/容器宿主机:为突发负载准备 1–2GB 的轻量 Swap 更稳妥,同时严格控制内存超卖与 OOM 策略。
五 常见问题与排错
- 查看与验证:free -h、swapon --show、cat /proc/swaps;必要时用 vmstat 1 观察 si/so 活动。
- 调整/关闭 Swap:临时 sudo swapoff -a;永久则在 /etc/fstab 注释对应行(谨慎,避免 OOM)。
- 文件系统注意:btrfs 不支持 Swap 文件;如需在独立分区使用 Swap,请确保文件系统支持。
- 休眠失败排查:确认 Swap 容量 ≥ RAM,且内核启动参数包含 resume= 指向正确的 Swap 分区/文件(使用 Swap 文件时通常需额外步骤生成并指定 resume_offset)。