什么是交换空间

交换空间(Swap)是 Linux 系统使用磁盘提供的一块虚拟内存空间。

当物理内存(RAM)压力较大时,Linux 可以将暂时不活跃的内存页转移到 Swap,从而释放物理内存,并降低因内存不足触发 OOM(Out of Memory)的概率。

需要注意:

  • Swap 的读写速度远低于物理内存;
  • Swap 可以缓解突发内存压力,但不能替代物理内存;
  • 如果 Swap 长期大量占用,应检查应用内存使用情况或升级服务器内存。

创建前检查

查看当前内存和 Swap:

free -h
swapon --show

检查根分区剩余空间:

df -h /

如果 swapon --show 已经显示 /swapfile,说明 Swap 已经存在,不要重复运行创建命令。


一键创建 2GB Swap

以下命令适用于 Debian、Ubuntu 等 Linux 系统。

仅适用于 /swapfile 尚不存在的服务器。

sudo fallocate -l 2G /swapfile && \
sudo chown root:root /swapfile && \
sudo chmod 600 /swapfile && \
sudo mkswap /swapfile && \
sudo swapon /swapfile && \
(sudo grep -qF '/swapfile none swap sw 0 0' /etc/fstab || \
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab) && \
echo 'vm.swappiness=10' | sudo tee /etc/sysctl.d/99-swappiness.conf && \
sudo sysctl --system && \
swapon --show && \
free -h

这组命令会依次完成:

  1. 创建一个 2GB 的 /swapfile
  2. 将文件所有者设置为 root
  3. 将权限设置为 600
  4. 将文件格式化为 Swap;
  5. 立即启用 Swap;
  6. 写入 /etc/fstab,使 Swap 重启后自动启用;
  7. vm.swappiness 设置为 10
  8. 显示最终的 Swap 和内存状态。

命令使用 && 连接,只有前一条命令执行成功,才会继续执行下一条命令。


修改 Swap 大小

修改命令中的容量参数即可:

sudo fallocate -l 2G /swapfile

常用容量:

Swap 大小 命令参数
512MB -l 512M
1GB -l 1G
2GB -l 2G
4GB -l 4G
8GB -l 8G

例如,创建 1GB Swap:

sudo fallocate -l 1G /swapfile && \
sudo chown root:root /swapfile && \
sudo chmod 600 /swapfile && \
sudo mkswap /swapfile && \
sudo swapon /swapfile && \
(sudo grep -qF '/swapfile none swap sw 0 0' /etc/fstab || \
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab) && \
echo 'vm.swappiness=10' | sudo tee /etc/sysctl.d/99-swappiness.conf && \
sudo sysctl --system && \
swapon --show && \
free -h

创建 4GB Swap:

sudo fallocate -l 4G /swapfile && \
sudo chown root:root /swapfile && \
sudo chmod 600 /swapfile && \
sudo mkswap /swapfile && \
sudo swapon /swapfile && \
(sudo grep -qF '/swapfile none swap sw 0 0' /etc/fstab || \
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab) && \
echo 'vm.swappiness=10' | sudo tee /etc/sysctl.d/99-swappiness.conf && \
sudo sysctl --system && \
swapon --show && \
free -h

使用 dd 创建 Swap

部分文件系统可能不支持使用 fallocate 创建 Swap。如果执行 swapon 时出现类似以下错误:

swapon failed: Invalid argument
swapon: swapfile has holes

可以改用兼容性更好的 dd 命令。

以下命令用于创建 2GB Swap:

sudo dd if=/dev/zero of=/swapfile bs=1M count=2048 status=progress && \
sudo chown root:root /swapfile && \
sudo chmod 600 /swapfile && \
sudo mkswap /swapfile && \
sudo swapon /swapfile && \
(sudo grep -qF '/swapfile none swap sw 0 0' /etc/fstab || \
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab) && \
echo 'vm.swappiness=10' | sudo tee /etc/sysctl.d/99-swappiness.conf && \
sudo sysctl --system && \
swapon --show && \
free -h

参数说明:

  • if=/dev/zero:从零数据设备读取;
  • of=/swapfile:输出文件路径;
  • bs=1M:每个数据块为 1MB;
  • count=2048:写入 2048 个数据块,总计 2GB;
  • status=progress:显示创建进度。

常用的 count 参数:

Swap 大小 count 参数
512MB count=512
1GB count=1024
2GB count=2048
4GB count=4096
8GB count=8192

手动创建 Swap

如果不使用一键命令,也可以按照以下步骤手动创建。

1. 创建交换文件

使用 fallocate 创建 2GB 文件:

sudo fallocate -l 2G /swapfile

也可以使用 dd

sudo dd if=/dev/zero of=/swapfile bs=1M count=2048 status=progress

2. 设置所有者和权限

sudo chown root:root /swapfile
sudo chmod 600 /swapfile

检查权限:

ls -lh /swapfile

正常结果类似:

-rw------- 1 root root 2.0G Jul 17 17:50 /swapfile

Swap 文件中可能包含被换出的敏感内存数据,因此不能允许普通用户读取。

3. 格式化 Swap 文件

sudo mkswap /swapfile

4. 启用 Swap

sudo swapon /swapfile

5. 验证状态

swapon --show
free -h

正常结果类似:

NAME      TYPE SIZE USED PRIO
/swapfile file   2G   0B   -2

设置重启后自动启用

将以下配置添加到 /etc/fstab

/swapfile none swap sw 0 0

可以使用以下命令自动添加,并避免重复写入:

sudo grep -qF '/swapfile none swap sw 0 0' /etc/fstab || \
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab

检查配置:

grep -nF '/swapfile' /etc/fstab

输出类似:

12:/swapfile none swap sw 0 0

测试自动启用配置

在物理内存充足的情况下,可以执行:

sudo swapoff /swapfile && \
sudo swapon -a && \
swapon --show

如果 /swapfile 再次出现,并且没有错误提示,说明 /etc/fstab 配置正确。

执行 swapoff 会将 Swap 中的数据移回物理内存。执行前必须确保可用内存充足,否则可能导致 OOM 或服务中断。


设置 Swappiness

vm.swappiness 控制 Linux 使用 Swap 的积极程度。

查看当前值:

sysctl vm.swappiness

或者:

cat /proc/sys/vm/swappiness

普通 VPS 通常可以设置为 10

echo 'vm.swappiness=10' | sudo tee /etc/sysctl.d/99-swappiness.conf && \
sudo sysctl --system && \
sysctl vm.swappiness

参数说明:

  • 较低的值:系统更倾向于优先使用物理内存;
  • 较高的值:系统更积极地将不活跃内存页换入 Swap;
  • 普通 VPS 可以使用 1020
  • 数据库等特殊业务应根据实际负载测试,不建议盲目设置为 0

扩容现有 Swap

如果 /swapfile 已经存在,不能直接再次执行 fallocate 创建命令。

例如,将现有 Swap 扩容为 2GB:

free -h && \
sudo swapoff /swapfile && \
sudo rm -f /swapfile && \
sudo fallocate -l 2G /swapfile && \
sudo chown root:root /swapfile && \
sudo chmod 600 /swapfile && \
sudo mkswap /swapfile && \
sudo swapon /swapfile && \
(sudo grep -qF '/swapfile none swap sw 0 0' /etc/fstab || \
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab) && \
echo 'vm.swappiness=10' | sudo tee /etc/sysctl.d/99-swappiness.conf && \
sudo sysctl --system && \
swapon --show && \
free -h

注意:第一条 free -h 仅用于显示内存状态,不会自动判断内存是否足够。执行 swapoff 前,应确保可用物理内存能够容纳当前 Swap 中的数据。

如果物理内存不足,可以先停止占用内存较大的服务,再进行扩容。


关闭并删除 Swap

1. 关闭 Swap

sudo swapoff /swapfile

2. 备份 fstab

sudo cp /etc/fstab /etc/fstab.bak

3. 删除自动启用配置

sudo sed -i '\|^/swapfile[[:space:]]|d' /etc/fstab

4. 删除 Swap 文件

sudo rm -f /swapfile

5. 验证结果

swapon --show
free -h

也可以使用以下组合命令完成关闭和删除:

sudo swapoff /swapfile && \
sudo cp /etc/fstab /etc/fstab.bak && \
sudo sed -i '\|^/swapfile[[:space:]]|d' /etc/fstab && \
sudo rm -f /swapfile && \
swapon --show && \
free -h

Swap 大小建议

Swap 不一定必须设置为物理内存的 1~2 倍,应根据服务器内存、磁盘空间和业务类型决定。

物理内存 建议 Swap
512MB 1~2GB
1GB 1~2GB
2GB 1~4GB
4GB 2~4GB
8GB 2~8GB
16GB 以上 根据业务负载决定

对于内存较小的 VPS,Swap 可以明显降低突发内存不足导致进程被终止的概率。

如果 Swap 长期大量占用,说明系统可能存在以下问题:

  • 物理内存不足;
  • 应用程序内存泄漏;
  • 数据库缓存配置过大;
  • 同时运行的服务过多;
  • 容器没有正确设置内存限制。

常用命令汇总

# 查看内存和 Swap
free -h

# 查看已启用的 Swap
swapon --show

# 查看 Swap 使用情况
cat /proc/swaps

# 查看 fstab 中的 Swap 配置
grep -n swap /etc/fstab

# 查看 swappiness
sysctl vm.swappiness

# 启用指定 Swap
sudo swapon /swapfile

# 关闭指定 Swap
sudo swapoff /swapfile

# 启用 fstab 中配置的所有 Swap
sudo swapon -a

# 关闭所有 Swap
sudo swapoff -a

最终验证

完成配置后执行:

swapon --show && \
free -h && \
grep -nF '/swapfile' /etc/fstab && \
sysctl vm.swappiness

如果能够看到:

  • /swapfile 已启用;
  • Swap 容量符合设置;
  • /etc/fstab 中存在自动启用配置;
  • vm.swappiness = 10

则说明 Swap 已经成功创建,并且重启后仍会自动生效。