swap 是干什么用的
swap 是内核在物理内存吃紧时用来临时存放匿名页的磁盘空间,同时承担休眠镜像存储的职责。它的作用不是扩容内存,而是把峰值压力摊到磁盘上,避免瞬时申请失败直接触发 OOM。装机时可以划分交换分区,运行中也能用 swapfile 补,两种方式最终都是挂到内核同一套交换机制上。
基本信息
| 查看现状 | free -h、swapon --show、cat /proc/swaps |
|---|---|
| 调整命令 | mkswap、swapon、swapoff |
| 持久化 | 写入 /etc/fstab,靠 sw 挂载选项识别 |
| 容量建议 | 内存 8G 以内给 1-2 倍;大内存服务器按单位规范给 8-16G |
| 推荐位置 | 独立分区或独立磁盘优于同盘 swapfile(后者有碎片与文件系统开销) |
| 权限要求 | root 或具备 CAP_SYS_ADMIN 的账户 |
典型使用场景
- 装机规划阶段决定交换分区大小与落盘位置
- 运行中发现内存偏紧,用 swapfile 快速补一块交换空间
- 内核崩溃转储(kdump)需要预留足够交换或转储空间时
- 调低 swappiness 减少数据库、缓存类服务被换出
- 交付前核对单位规范里对交换空间的硬性要求
创建并启用 8G swapfile
创建并启用 8G swapfile
fallocate -l 8G /swapfile # 快速分配,若不支持则改用 dd 创建
chmod 600 /swapfile # 权限收紧,避免其他用户读取换出页
mkswap /swapfile # 写入交换签名
swapon /swapfile # 立即启用
echo '/swapfile none swap sw 0 0' >> /etc/fstab # 开机自动启用
swapon --show # 验证已挂载且大小正确
cat /proc/sys/vm/swappiness # 查看换出倾向,默认多为 60dd 兜底与参数调整
dd 兜底与参数调整
dd if=/dev/zero of=/swapfile bs=1M count=8192 status=progress # 文件系统不支持 fallocate 时用
echo 'vm.swappiness=10' >> /etc/sysctl.d/99-swap.conf # 降低换出倾向
sysctl -p /etc/sysctl.d/99-swap.conf # 立即生效
swapoff /swapfile && swapon /swapfile # 改完大小后重建交换输出逐列读法
| 输出字段 | 含义 | 正常与异常 |
|---|---|---|
| free -h 的 Swap 行 | 总量 / 已用 / 空闲 | 已用长期接近总量说明内存不足,需评估扩容 |
| swapon --show 的 SIZE | 单个交换设备大小 | 与规划值不一致说明文件没建全或没生效 |
| /proc/swaps 的 Type | partition 或 file | file 出现在共享存储上要留意性能与一致性 |
| vm.swappiness | 换出倾向(0-100) | 数据库机器常调低;为 0 不等于禁用 swap |
swapfile 放在 XFS 或 ext4 上均可;放在 btrfs 上需要先做 nodatacow 处理,否则可能出现交换文件校验失败。
swapoff 会把已换出的页一次性读回内存,余量不足时会长时间卡顿甚至触发 OOM,执行前先看 free 的剩余量。