Ubuntu管理SWAP空间

一、SWAP 空间基础概念

1.1 什么是 SWAP?

当 Linux 系统的物理内存(RAM)耗尽时,内核会将内存中不活跃的“页面”移动到硬盘上的一个预配置区域,这个区域就是 SWAP 空间。物理内存与 SWAP 空间的总和称为虚拟内存

1.2 SWAP 的两种形式

  • SWAP 分区:硬盘上一个独立的、专门用于交换的分区。
  • SWAP 文件:文件系统中的一个特殊文件,功能与分区相同。

注意:在虚拟机中安装 Ubuntu 时,系统通常不会自动创建 SWAP 空间,需要手动配置。

1.3 为什么需要 SWAP?

  • 内存溢出保护:当 RAM 完全占满时,系统可将非关键数据移至 SWAP,防止系统崩溃(对小内存系统尤其重要)。
  • 释放物理内存:将启动后很少使用的程序“页面”交换出去,为更活跃的程序腾出 RAM。
  • 休眠支持:系统休眠(Hibernate)功能需要 SWAP 空间来保存内存状态。

1.4 SWAP 的潜在缺点

  • 速度差异:RAM 的访问速度是纳秒级,而硬盘(即使是 SSD)是毫秒级,速度相差数个数量级。
  • 系统变慢:频繁的交换操作(称为“Thrashing”)会导致系统响应迟缓。

二、检查现有 SWAP 空间

在开始操作前,首先检查系统当前的 SWAP 配置。

2.1 查看所有活动的 SWAP 空间

1
sudo swapon --show

如果输出为空,则表示系统未启用任何 SWAP 空间

2.2 查看内存与 SWAP 使用概况

1
sudo free -h

该命令会显示物理内存和 SWAP 的总量、已用量及空闲量。


三、创建 SWAP 文件(推荐方法)

与分区相比,SWAP 文件更灵活,可以轻松调整大小,且不涉及磁盘分区操作。以下是创建 2GB SWAP 文件的完整步骤。

3.1 步骤 1:创建空白文件

1
sudo dd if=/dev/zero of=/swapfile bs=1M count=2048
  • if=/dev/zero:输入源,一个输出全零字节的特殊设备。
  • of=/swapfile:输出文件路径。
  • bs=1M:块大小为 1MB。
  • count=2048:块数量。计算:1MB × 2048 = 2GB

    提示:要创建不同大小的文件,只需修改 count 值(例如 count=1024 为 1GB)。

3.2 步骤 2:设置正确的文件权限

SWAP 文件必须严格限制访问权限,防止被普通用户读取。

1
sudo chmod 600 /swapfile

3.3 步骤 3:将文件格式化为 SWAP 空间

1
sudo mkswap /swapfile

此命令会在文件上设置特殊的 SWAP 签名。

3.4 步骤 4:激活 SWAP 文件

1
sudo swapon /swapfile

现在,SWAP 文件已加入系统交换池并立即生效。

3.5 步骤 5:配置永久生效(开机自动启用)

编辑 /etc/fstab 文件,在末尾添加一行:

1
sudo nano /etc/fstab

添加以下内容:

1
/swapfile swap swap defaults 0 0

保存并退出(Ctrl+X,然后按 Y 确认)。

3.6 步骤 6:验证创建结果

再次运行检查命令,确认 SWAP 文件已成功激活:

1
2
3
sudo swapon --show
# 或
sudo free -h

四、优化 SWAP 使用行为:调整 Swappiness

4.1 什么是 Swappiness?

swappiness 是一个内核参数(范围 0-100),用于控制内核使用 SWAP 空间的积极程度

  • 值越低(如 10):内核尽量避免使用 SWAP,除非绝对必要。
  • 值越高(如 80):内核更积极地将内存页面交换出去。
  • Ubuntu 默认值60

4.2 查看当前 Swappiness 值

1
cat /proc/sys/vm/swappiness

4.3 临时调整 Swappiness 值

例如,设置为 40(对服务器更友好):

1
sudo sysctl vm.swappiness=40

4.4 永久调整 Swappiness 值

编辑 /etc/sysctl.conf 文件:

1
sudo nano /etc/sysctl.conf

在文件末尾添加或修改以下行:

1
vm.swappiness=40

保存后,运行以下命令使更改立即生效:

1
sudo sysctl -p

最佳实践建议

  • 桌面系统30-60(平衡响应性与内存使用)。
  • 服务器/数据库10-30(减少慢速交换,优先使用 RAM)。
  • 高性能计算/内存充足时1-10(几乎禁用交换,除非紧急)。

五、删除 SWAP 文件

如果您不再需要某个 SWAP 文件,请按以下步骤安全移除。

5.1 步骤 1:停用 SWAP 文件

1
sudo swapoff -v /swapfile

-v 参数显示详细过程。

5.2 步骤 2:从 /etc/fstab 中移除配置

编辑 /etc/fstab 文件,删除或注释掉之前添加的 /swapfile 那一行。

1
2
3
sudo nano /etc/fstab
# 在行首添加 # 号注释掉,例如:
# /swapfile swap swap defaults 0 0

5.3 步骤 3:删除物理文件

1
sudo rm /swapfile

六、调整 SWAP 空间大小

6.1 调整 SWAP 分区大小(复杂)

调整分区大小通常需要:

  1. 使用 swapoff 停用分区。
  2. 使用 GParted 等图形化分区工具或 parted 命令行工具调整分区边界。
  3. 使用 mkswap 重新格式化。
  4. 使用 swapon 重新激活。

    注意:此操作有风险,且需要分区后方有未分配的连续空间。

6.2 调整 SWAP 文件大小(简单推荐)

这是 SWAP 文件的最大优势。例如,将现有的 2GB 文件扩容到 4GB:

步骤 1:停用当前 SWAP 文件

1
sudo swapoff /swapfile

步骤 2:调整文件大小

1
2
3
4
5
# 方法A:使用 dd 追加 2GB(总大小变为 4GB)
sudo dd if=/dev/zero of=/swapfile bs=1G count=2 oflag=append conv=notrunc

# 方法B:直接创建指定大小的新文件(会覆盖旧文件)
# sudo dd if=/dev/zero of=/swapfile bs=1G count=4

步骤 3:重新设置权限并格式化

1
2
sudo chmod 600 /swapfile
sudo mkswap /swapfile

步骤 4:重新激活 SWAP 文件

1
sudo swapon /swapfile

步骤 5:验证新大小

1
sudo swapon --show

七、SWAP 空间大小规划建议

系统物理内存 (RAM) 推荐 SWAP 大小 休眠支持所需 SWAP
≤ 2 GB RAM 的 2 倍 RAM 的 2-3 倍
2 - 8 GB 等于 RAM 大小 RAM 的 1.5 倍
8 - 64 GB 至少 4 GB RAM 的 1 倍
> 64 GB 至少 4 GB(主要用于休眠) RAM 的 0.5 倍

说明

  • 对于现代拥有大容量 RAM(如 16GB+)的系统,SWAP 的主要作用已从“内存溢出缓冲”转变为支持系统休眠
  • 如果完全不需要休眠功能,且内存充足,可以设置一个较小的 SWAP(如 1-2GB)作为安全缓冲。

八、总结与最佳实践

  1. 检查先行:操作前务必使用 swapon --showfree -h 了解当前状态。
  2. 首选文件:对于大多数用户,创建 SWAP 文件 比调整分区更安全、灵活。
  3. 合理规划大小:根据你的 RAM 大小和用途(是否休眠)参考上表。
  4. 优化 Swappiness:为你的工作负载(桌面/服务器)设置合适的值,以平衡性能。
  5. 持久化配置:任何更改都要记得更新 /etc/fstab/etc/sysctl.conf
  6. 监控使用:定期使用 free -hhtop 监控 SWAP 使用率。如果 SWAP 被频繁使用(>20%),应考虑增加物理内存。