swap 文件是怎么工作的
没有独立交换分区时,用普通文件充当交换空间:fallocate(或 dd)建文件、chmod 600 收紧权限、mkswap 写入交换区签名、swapon 启用,最后写进 /etc/fstab 持久化。云主机内存吃紧、临时扩容时这是成本最低的手段。需要明确的是 swap 只是兜底:被大量使用时页面换入换出会让延迟成倍上升,它延后 OOM 而不是避免 OOM。
基本信息
| 适用平台 | Linux(ext4/XFS 上 fallocate 可直接用;Btrfs 需先关 COW) |
|---|---|
| 权限要求 | root |
| 关键命令 | fallocate/dd、chmod、mkswap、swapon |
| 持久化 | /etc/fstab 增加 swap 行 |
| 常用调优 | vm.swappiness(默认 60,服务器常降到 10 左右) |
| 查看 | swapon --show、free -h、cat /proc/swaps |
典型使用场景
- 云主机因内存不足触发 OOM 杀掉进程,临时加 swap 顶过高峰
- 小规格实例跑编译、打包等瞬时吃内存的任务
- 集群节点统一做兜底配置,避免个别节点先崩
- 迁移或新机上架期间临时补交换空间
- 排查内存问题时验证“把换出压力降下来”的效果(配合 swappiness)
创建与启用
创建与启用
sudo fallocate -l 2G /swapfile # 建 2G 文件(Btrfs 上先 chattr +C 目录再建)
sudo chmod 600 /swapfile # 权限必须收紧,否则 swapon 直接拒绝
sudo mkswap /swapfile # 写入交换区签名
sudo swapon /swapfile # 立即启用
swapon --show && free -h # 复核生效大小与内存余量
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab # 持久化
sudo swapon -a # 按 fstab 重新启用全部 swap 条目(验证写法正确)
findmnt --verify # 顺带校验 fstab 语法
sudo sysctl -w vm.swappiness=10 # 临时降低换出倾向;写 /etc/sysctl.d/ 才持久关键检查项
| 检查项 | 要求 | 不满足的后果 |
|---|---|---|
| 文件权限 | 必须为 600 | 组或其他用户可读时 swapon 拒绝启用 |
| 文件系统类型 | Btrfs 需先关 COW(chattr +C) | 在开启 COW 的文件上启用会失败 |
| 所在磁盘容量 | 给 swapfile 留出稳定余量 | 换出一多就把磁盘写满,引发连锁故障 |
| vm.swappiness | 服务器通常调低到 10 左右 | 默认 60 容易频繁换出,延迟抖动明显 |
| 磁盘介质 | SSD 上大量换出会加快磨损 | 写寿命被无关的换页消耗 |
不支持 fallocate 的文件系统或老内核用 dd if=/dev/zero of=/swapfile bs=1M count=2048 生成文件,之后步骤相同;Btrfs 上必须先在目标目录执行 chattr +C 再创建文件。
把 swap 当成内存扩容会掩盖真实的容量问题:页面换入换出使延迟成倍增加,正确做法是加内存或限制应用内存上限,swap 仅用于兜底。