温馨提示×

Ubuntu Swap如何提升启动速度

小樊
42
2025-12-06 12:16:43
栏目: 智能运维

Ubuntu 中 Swap 与启动速度的关系与优化要点

一、先判断是否需要 Swap 优化

  • 使用 systemd 分析启动耗时:systemd-analyze blamesystemd-analyze critical-chain。如果耗时集中在“swap”相关单元或挂载阶段,再按下方步骤处理。
  • 检查当前 Swap 状态:swapon --showfree -h。若几乎未使用 Swap,通常不是 Swap 导致启动慢。
  • 查看内存与 Swappiness:cat /proc/sys/vm/swappiness(默认多为60)。内存充足(如≥16GB)时,可适当降低以减少不必要的交换倾向。
  • 核对 Swap 的持久化配置:
    • 传统方式:grep -n swap /etc/fstab
    • systemd 方式:systemctl list-unit-files | grep swap,可见类似 dev-disk-by\\x2duuid-<UUID>.swap 的单元。
  • 若曾调整过分区/扩容导致 UUID 变化,需同步更新 /etc/fstab 中的 Swap 条目,否则开机可能因等待挂载失败而变慢。

二、常见导致“启动慢”的 Swap 原因与修复

  • 原因 1:Swap 条目配置错误(如 UUID 不匹配、设备名变更、fstab 语法错误)
    • 修复:
      • 获取真实 Swap 标识:sudo blkid -t TYPE=swap
      • 更新 /etc/fstab:将旧的 UUID=.../dev/sdX 改为新的 UUID;或改用 sudo systemctl enable --now dev-disk-by\\x2duuid-<UUID>.swap 方式管理。
      • 验证:sudo mount -a(无报错即正常),systemctl status <swap-unit> 查看单元状态。
  • 原因 2:旧版系统上 /etc/fstab 中 swap 行未正确注释,导致启动阶段反复尝试挂载失败(常见于虚拟机或克隆镜像)
    • 修复:在 /etc/fstab 中将 swap 行注释;或在新版本使用 systemctl mask swap.target 彻底屏蔽自动挂载(见下文)。
  • 原因 3:系统默认 swappiness=60,在内存充足时仍可能触发早期交换,叠加 I/O 抖动影响启动观感
    • 修复:将 vm.swappiness 调低(见下一节)。

三、把 Swap 调优为“不拖慢启动”的配置

  • 降低 Swappiness(减少早期换出,提升启动与交互流畅度)
    • 临时:sudo sysctl vm.swappiness=10
    • 永久:在 /etc/sysctl.conf 添加 vm.swappiness=10,重启生效。内存较大(≥16GB)且主要交互/开发场景,建议维持在10左右。
  • 使用 Swapfile 并放在更快的存储上(SSD/NVMe)
    • 创建与启用示例:
      • sudo fallocate -l 2G /swapfile && sudo chmod 600 /swapfile
      • sudo mkswap /swapfile && sudo swapon /swapfile
      • 持久化:在 /etc/fstab 添加 /swapfile none swap sw 0 0
    • 说明:Swapfile 更灵活,迁移/调整大小更容易;若系统盘是 SSD,整体 I/O 更可控。
  • 内存充足且明确不需要 Swap 的场景(如桌面端 ≥16GB、服务器已配足内存)
    • 为“加快启动”可直接禁用 Swap:
      • 临时:sudo swapoff -a
      • 永久:
        • Ubuntu 20.04+ 推荐:sudo systemctl mask swap.target(屏蔽自动挂载);
        • 旧版或通用:sudo sed -i '/swap/s/^/# /' /etc/fstab 注释 fstab 中的 swap 行。
      • 风险提示:禁用后若内存耗尽,可能出现 OOM 杀进程 或系统不稳定,仅在内存充足时采用。

四、验证与回退

  • 启动耗时:systemd-analyze timesystemd-analyze blame(对比优化前后关键阶段耗时)。
  • Swap 状态:swapon --showfree -h(确认启用/禁用是否生效)。
  • fstab 与单元一致性:grep -n swap /etc/fstabsystemctl list-unit-files | grep swapsystemctl status <swap-unit>(确保无报错、无失败依赖)。
  • 回退思路:
    • 重新启用 Swapfile:先 sudo swapon /swapfile,再在 /etc/fstab 取消注释;
    • 重新启用被 mask 的 Swap:sudo systemctl unmask swap.target,或在 /etc/fstab 恢复 swap 行后 sudo systemctl daemon-reload

0