fallocate比dd更快,因它不写数据而直接预留空间,但仅在xfs或ext4等支持extent的文件系统上可靠;btrfs等不支持时须用dd。

Swap不是内存不足的补救措施,而是内核内存管理策略的一部分;盲目设为物理内存2倍反而可能拖慢IO密集型负载。
swapfile创建时为什么用fallocate而不是dd
用fallocate比dd if=/dev/zero快得多,且不实际写零——它直接在文件系统上预留空间,避免磁盘填充耗时。但要注意:fallocate在XFS或ext4(带extent支持)上才可靠;在Btrfs、overlayfs或LVM Thin上会失败或产生不可靠Swap文件,此时必须退回dd。
- 推荐命令:
fallocate -l 4G /swapfile - fallback命令:
dd if=/dev/zero of=/swapfile bs=1M count=4096 - 创建后务必执行
chmod 600 /swapfile,否则swapon会拒绝启用
swapon失败常见报错及对应修复
swapon: /swapfile: read swap header failed: Invalid argument 是最典型错误,基本都源于没运行mkswap,或mkswap前文件已被其他进程写入数据(比如误用touch或编辑器打开过)。
- 确认是否执行过:
mkswap /swapfile(必须在swapon之前) - 检查文件是否被修改:
ls -l /swapfile看大小是否与预期一致,再file /swapfile确认类型是“data”,不是“ASCII text” - 若已损坏,删掉重来:
swapoff /swapfile && rm -f /swapfile
vm.swappiness设成0真的安全吗
设为0不代表禁用Swap,而是让内核只在OOM killer启动前最后一刻才换出匿名页。但它不阻止page cache(文件缓存)被回收——所以即使swappiness=0,你仍可能看到free -h中buff/cache剧烈波动。
- 数据库类负载(PostgreSQL/MySQL)建议用
vm.swappiness=1,既避免误换关键堆内存,又保留底线保护 - 容器节点(如Kubernetes worker)可设为0,但需确保cgroup memory limit设置合理,否则OOM会直接杀Pod
- 永久生效要写入
/etc/sysctl.conf,然后运行sysctl -p,别只改/proc/sys/vm/swappiness临时值
/etc/fstab里swap行容易漏掉的关键字段
/swapfile none swap sw 0 0这行看着简单,但sw挂载选项不能写成defaults——后者会触发noatime等不适用于Swap的选项,导致swapon -a失败。
- 必须用
sw,这是专为swap设计的挂载标志 - 路径必须绝对且存在,
swapon -a不会自动创建文件 - 如果用分区而非文件,设备名要用UUID(
blkid查),避免/dev/sdb1因设备顺序变化失效
Swap大小本身没固定公式,重点在于匹配IO能力:机械盘上设太大只会让OOM前多卡几秒;SSD上可放宽到4~8GB,但更要盯住swapon -s和/proc/swaps里实际使用量——长期接近100%占用,说明该加内存了,不是调Swap的时候。











