什么是交换空间
交换空间(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
这组命令会依次完成:
- 创建一个 2GB 的
/swapfile; - 将文件所有者设置为
root; - 将权限设置为
600; - 将文件格式化为 Swap;
- 立即启用 Swap;
- 写入
/etc/fstab,使 Swap 重启后自动启用; - 将
vm.swappiness设置为10; - 显示最终的 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 可以使用
10或20; - 数据库等特殊业务应根据实际负载测试,不建议盲目设置为
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 已经成功创建,并且重启后仍会自动生效。