swap 是什么
swap 是内存不足时的兜底空间:内存压力大时内核把不活跃页换出到交换分区或交换文件,避免直接触发 OOM Killer 杀进程。用 mkswap 制作、swapon 启用、swapoff 停用,并在 fstab 中持久化。排查内存问题必须看 swap:它被大量占用说明物理内存长期紧张,即使 free 输出的 available 看起来还够。vm.swappiness 控制换出倾向,数据库类服务通常建议调低,但要权衡延迟与内存占用。
基本信息
| 适用平台 | Linux(util-linux 的 mkswap、swapon、swapoff) |
|---|---|
| 命令语法 | mkswap 设备或文件 / swapon 路径 / swapoff 路径 / swapon --show |
| 常用选项 | --show 列出已启用 swap -a 启用 fstab 中的全部 swap -s 概要 -p 设置优先级 |
| 相关内核参数 | vm.swappiness 换出倾向(0-100)、vm.overcommit_memory 内存超额策略 |
| 权限说明 | 制作与启停 swap 需要 root |
典型使用场景
- 扩容缓冲:内存吃紧的服务加一块 swap 缓冲,争取排查时间
- 云主机补配:默认没有 swap 的实例手工创建交换文件
- 停用评估:服务优化后关闭 swap 前先评估内存余量
- OOM 排查:结合 free 与 vmstat 判断是否与 swap 不足有关
- 多盘优先级:为不同性能的 swap 设备设置优先级
创建 4G 交换文件
创建 4G 交换文件
fallocate -l 4G /swapfile # 或 dd if=/dev/zero of=/swapfile bs=1M count=4096
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile
echo '/swapfile none swap sw 0 0' >> /etc/fstab # 持久化
swapon --show; free -h; cat /proc/swaps # 查看当前状态
sysctl vm.swappiness # 查看换出倾向查看与判断
| 信息来源 | 内容 | 判断依据 |
|---|---|---|
| swapon --show | 已启用的 swap 设备与容量 | 确认 swap 是否真的挂上,以及总容量 |
| free -h | 内存与 swap 的使用量 | swap used 长期偏高说明物理内存紧张 |
| /proc/swaps | 内核视角的 swap 列表 | 与 fstab 配置交叉验证 |
| vm.swappiness | 换出倾向参数 | 数据库类服务通常调低,但不宜简单置 0 |
swap 文件必须 chmod 600。权限过宽时 swapon 会拒绝启用并给出权限相关报错,这是搭 swap 时最常见的失败原因。
swapoff -a 会把已使用的 swap 内容全部拉回内存。内存余量不足时这一步会直接触发 OOM,停用 swap 前必须先确认可用内存足够。
交换文件与交换分区:交换文件随时可增删、扩容方便,适合云主机;交换分区需要提前在分区表里规划,改动成本高。在当前内核上两者的性能差距已经很小。
swap 文件优先用 fallocate 创建,速度快。在 Btrfs 或部分网络文件系统上 fallocate 生成的文件可能带空洞导致 swapon 拒绝启用,此时改用 dd 逐块写入更稳妥。