swap分区创建后不生效的主因是未启用或启用失败;需用swapon --show和/proc/swaps确认状态,sudo swapon /dev/sdb1前先mkswap并确保设备未挂载,临时启用后须写入/etc/fstab,swapfile推荐fallocate创建并禁用btrfs的cow,swappiness=1更稳妥,ssd上swap已优化但大小宜设为内存的0.5–1倍。

swap 分区创建后不生效?检查 swapon --show 和 /proc/swaps
swap 配置完却没被系统用上,最常见原因是没真正启用,或者启用失败但没报错。运行 swapon --show,如果输出为空,说明当前没有任何活跃 swap;再看 /proc/swaps,它和前者一致,是内核实际加载的权威来源。
实操建议:
- 用
sudo swapon /dev/sdb1启用前,先确认设备存在且未挂载:lsblk和mount | grep sdb1 - 如果提示
swapon: /dev/sdb1: failed to activate swap: Device or resource busy,大概率是该分区已有文件系统(比如 ext4),需先清空:用sudo mkswap /dev/sdb1重写 swap 签名 - 临时启用后记得加到
/etc/fstab,否则重启失效;格式必须严格:/dev/sdb1 none swap sw 0 0,第4字段不能写成defaults
用文件当 swap?fallocate 比 dd 快,但得禁用 COW(尤其在 btrfs 上)
物理分区不够或不想动磁盘结构时,swapfile 是更灵活的选择。但默认用 dd 创建大文件极慢,而 fallocate 是瞬间完成——前提是文件系统支持(ext4/xfs 可以,btrfs 默认不行)。
实操建议:
- 创建前先关掉所有 swap:
sudo swapoff -a - 用
sudo fallocate -l 2G /swapfile创建,比dd if=/dev/zero of=/swapfile bs=1M count=2048快两个数量级 - btrfs 下必须先禁用写时复制:
sudo chattr +C /swapfile,否则mkswap会失败并报Operation not supported - 权限必须设为 600:
sudo chmod 600 /swapfile,否则swapon会拒绝启用
swappiness 设成 1 不等于禁用 swap,只是大幅降低倾向性
很多人以为把 vm.swappiness 改成 0 就彻底不用 swap,其实不然。值为 0 时内核只在内存完全耗尽(OOM)前做紧急回收,但仍可能触发;设成 1 才是更稳妥的“几乎不用”,但依然保留保底能力。
实操建议:
- 临时修改:
sudo sysctl vm.swappiness=1 - 永久生效要写进
/etc/sysctl.conf或/etc/sysctl.d/99-swap.conf,内容就一行:vm.swappiness=1 - 注意:容器环境(如 Docker)中该参数由宿主机控制,容器内改无效;Kubernetes 节点也需在 kubelet 启动参数里加
--fail-swap-on=false才允许启用 swap
SSD 上用 swap 会不会加速磨损?现代内核已缓解,但别配太大
老观念认为 swap 频繁读写会缩短 SSD 寿命,这在十年前属实。现在内核从 4.15 开始默认启用 swap_idle 机制,会主动将冷页从 swap 移回内存,并减少对 SSD 的无效写入。
实操建议:
- 不必为 SSD 特意禁用 swap,尤其笔记本或小内存 VPS;但 swap 大小建议控制在物理内存的 0.5–1 倍,比如 8G 内存配 4G swap 即可
- 避免用 NVMe 盘上一个高 IO 负载分区(如数据库数据目录)同时兼作 swap,争抢队列会拖慢整体响应
- 如果真担心磨损,可用
sudo smartctl -a /dev/nvme0n1 | grep Wear查看实际磨损值,比理论估算更可靠
swap 的核心不是“要不要”,而是“怎么配得刚好”。配太大浪费空间、拖慢回收;配太小扛不住突发负载;用文件还是分区,取决于你愿不愿意承担 btrfs/chattr 这类隐性依赖。这些细节不显眼,但线上服务半夜 OOM,往往就差在这一步。










