适用范围:普通 Debian 主机或完整 VM 的 ext4 文件系统,示例创建 2GiB swap 文件。LXC 的 swap 由宿主机与容器资源策略管理,不在容器中照抄本例。
Swap 为内存管理提供备用空间,不是等同于 RAM 的高速扩容。持续交换通常表示内存压力,会增加延迟和磁盘写入;是否需要、大小和介质要结合工作负载决定。
一、检查现有 swap 与文件系统
swapon 用于查看 swap,free 用于查看内存概况。分别执行以下命令:
swapon --show
free -h
findmnt -no FSTYPE,TARGET /
df -h /
swapon --show 查看活动 swap,free 查看内存和 swap 总量。没有输出只说明当前没有活动 swap,不代表磁盘上没有未启用的分区或文件。
以下示例限定在支持普通 swap 文件的 ext4 上。Btrfs 有无 CoW、压缩、连续性等约束,ZFS 和某些网络文件系统不应直接套用;按相应文件系统文档配置。swapon 手册中的文件限制
二、创建并启用 2GiB 文件
先确认 /swapfile 不存在,包括符号链接,并有足够空间。不要覆盖已有 swap 或其他文件。以下命令中的失败必须先处理,再继续下一步:
sudo sh -eu <<'SH'
if [ -e /swapfile ] || [ -L /swapfile ]; then
printf '%s\n' '/swapfile 已存在,请先核对,不覆盖。' >&2
exit 1
fi
dd if=/dev/zero of=/swapfile bs=1M count=2048 oflag=excl status=progress
chown root:root /swapfile
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile
SH
swapon --show
free -h
这个独立 shell 遇到错误会停止;oflag=excl 同时防止检查与创建之间出现的路径竞态覆盖已有文件。dd 在此创建没有空洞的文件;并非所有文件系统都保证 fallocate 生成的文件适合 swap。mkswap 会写入交换头,不能对未经确认的磁盘或现有文件执行。如果创建中断或 swapon 报错,先检查留下的文件、日志和文件系统限制,不继续写入 fstab 或反复格式化。
三、配置开机启用
先备份 /etc/fstab,确认没有相同条目,再添加一次:
/swapfile none swap sw 0 0
使用 findmnt --verify 检查 fstab,确认当前 swapon --show 正常,再在可恢复的重启窗口验收。添加重复项或错误路径可能影响启动。
四、理解并持久化 swappiness
vm.swappiness 描述内核对交换与文件页回收的相对代价判断,不是“RAM 用到多少百分比才开始交换”,也不是固定交换频率。当前 Linux 支持 0–200,默认通常为 60;0 不等于完全禁止 swap。内核 VM 参数文档
查看当前值,并按业务测试一个临时值:
sysctl vm.swappiness
sudo sysctl -w vm.swappiness=40
40 只是示例,不是所有机器的最优值。验证后需要持久化时,在独立文件 /etc/sysctl.d/60-local-swap.conf 写入:
vm.swappiness=40
再加载该文件,检查其他 sysctl 文件是否有覆盖值:
sudo sysctl -p /etc/sysctl.d/60-local-swap.conf
sysctl vm.swappiness
五、安全停用和删除
停用前查看当前 swap 已用量和可用内存,必要时先停止高内存负载。swapoff 需要将仍在 swap 中的数据搬回 RAM,内存不足时可能失败,不能先删除文件。
free -h
swapon --show
sudo swapoff /swapfile
swapon --show
只有确认该文件已不在活动 swap 列表中,才从 fstab 删除对应一条配置,并删除 /swapfile。保持其他 swap 配置不变。如果同时改过 swappiness,按记录恢复原值及持久化文件。不能把一个没有使用的 swap 文件当成其他磁盘空间问题的统一原因。
评论区