现在绝大多数 linux 系统(尤其是云服务器、容器化环境或 ssd 主盘场景)不推荐新增 swap 分区,优先用 swapfile;只有在物理机有闲置硬盘、且明确需要低延迟交换时,才考虑用新分区方式。

直接说结论:现在绝大多数 Linux 系统(尤其是云服务器、容器化环境或 SSD 主盘场景)**不推荐新增 swap 分区,优先用 swapfile**;只有在物理机有闲置硬盘、且明确需要低延迟交换时,才考虑用新分区方式。原因很简单——分区方式要重分区、改 fstab、重启生效,而 swapfile 可动态增删、权限可控、无需重启,还支持 fallocate 快速创建。
为什么不用 dd 创建 swapfile?
dd 是“安全但慢”的老办法:它真实写满零字节,耗时长、IO 压力大,且容易因磁盘空间不足中途失败(比如提示 设备上没有空间)。而现代系统更倾向用 fallocate ——它只是预分配文件空间元数据,秒级完成,不实际写盘。
- 正确做法:
fallocate -l 2G /swapfile(比dd if=/dev/zero of=/swapfile bs=1G count=2快 10 倍以上) - 必须加权限限制:
chmod 0600 /swapfile && chown root:root /swapfile,否则swapon会报不安全的权限 0644 - 如果
fallocate报错(如 XFS 文件系统不支持),再退回到dd,但务必用小块写入:dd if=/dev/zero of=/swapfile bs=1M count=2048
swapfile 启用后为啥 free 看不到?
常见现象是执行了 swapon /swapfile,但 free -m 显示 Swap 行仍是 0。根本原因只有两个:
-
mkswap /swapfile没成功执行(比如文件路径输错、权限没改、或文件被 truncate 过) - 系统启用了
zram或zswap,它们会抢占 swap 控制权,导致swapon实际未生效(可查cat /sys/module/zswap/parameters/enabled) - SELinux 处于 enforcing 模式时,可能拦截
swapon(临时验证:用setenforce 0测试,若生效则需恢复策略而非永久关闭)
如何让 swapfile 开机自动挂载?
不能只靠 swapon /swapfile 临时启用,必须写进 /etc/fstab,但格式极易出错:
- 正确条目:
/swapfile none swap sw 0 0(注意第二字段是none,不是swap;第三字段是swap,不是defaults) - 错误示范:
/swapfile /swapfile swap defaults 0 0—— 这会导致开机卡在 mount 阶段 - 写入前先测试:
swapon --validate /swapfile,避免 fstab 错误引发启动失败 - 云服务器(如阿里云 ECS)建议跳过 fstab,改用云助手插件(
acs-plugin-manager --exec --plugin ACS-ECS-SwapConfig --params --enable),它会自动处理权限、大小、vm.swappiness等细节
真正容易被忽略的点是:swap 不是越大越好。当 vm.swappiness > 60 且 swapfile 超过物理内存 2 倍时,内核会过度换出活跃页面,反而拖慢响应——尤其在 SSD 上,频繁 swap 会加速磨损,而 HDD 则直接卡死。动手前,先用 free -h && cat /proc/meminfo | grep -i swap 看清当前压力,再决定要不要加、加多少。











