Linux交换分区是内核内存管理的主动缓冲层而非被动补救,扩容方式含交换文件(推荐云环境)、独立分区(适合稳定负载)和LVM扩展;调优需设vm.swappiness、优先级prio并避开Btrfs陷阱;大小应依IO能力与负载特征设定。

Linux 交换分区不是“内存不够才启用”的补救手段,而是内核内存管理策略中主动的缓冲层。合理扩容和调优 Swap,能显著延缓直接内存回收与 OOM 触发,让系统在压力下更平稳运行。
扩容 Swap 的三种实用方式
根据硬件环境和运维场景选择最适配的方式:
-
交换文件(推荐新手/云服务器):无需重分区,灵活易调。优先用
fallocate -l 4G /swapfile创建(仅限 ext4/XFS),失败时回退dd if=/dev/zero of=/swapfile bs=1M count=4096;创建后务必执行chmod 600 /swapfile和mkswap /swapfile,再swapon /swapfile。 -
独立交换分区(适合长期稳定负载):性能比文件高 5–10%,尤其对数据库类服务更友好。用
fdisk或parted划分新分区后,运行mkswap /dev/sdXn→swapon /dev/sdXn。 -
LVM 逻辑卷扩展(适用于已有 LVM 环境):先用
lvextend -l +100%FREE /dev/vgname/lvname扩容,再mkswap和swapon。注意:扩前需确保 VG 有空闲 PE。
所有方式都需写入 /etc/fstab 持久化:文件路径写绝对路径,分区建议用 UUID(blkid 查);挂载选项必须为 sw,不可用 defaults,否则 swapon -a 会失败。
Swap 性能关键参数调优
核心目标是让内核“早换、少阻、准换”,而非完全禁用或盲目加大:
-
vm.swappiness:控制内核倾向将匿名页换出的积极程度(0–100)。默认值 60 偏激进;数据库服务器建议设为1,容器节点可设为0(但需配合 cgroup memory limit);设为0并不禁止 Swap,只推迟到 OOM 前一刻才换出匿名页。 -
交换区优先级(
prio):通过swapon -p N /dev/sdXn或 fstab 中sw,pri=N设置。数值越小优先级越高。混合 SSD/HDD 时,把 SSD Swap 的pri设为 10,HDD 设为 5,可让热数据优先落在高速设备上。 -
避免 Btrfs 上的陷阱:Btrfs 不支持
fallocate安全创建 swapfile,必须用dd;且需加chattr +C /swapfile关闭 CoW,否则频繁换入换出会严重拖慢性能。
监控与诊断真实 Swap 行为
别只看 free -h 的 Swap 使用量,重点观察是否已影响响应:
- 用
swapon --show或cat /proc/swaps查激活状态、类型、优先级、使用率; - 关注
si(swap-in KB/s)和so(swap-out KB/s)指标:vmstat 1中持续 >100 表明频繁换入换出,可能已成瓶颈; - 检查
/proc/vmstat中pgpgin/pgpgout和pswpin/pswpout的累计值,对比增长速率; - 若出现
swapon: read swap header failed,99% 是漏了mkswap,或文件被编辑器意外写入过(file /swapfile应显示 “data”,非 “ASCII text”)。
Swap 大小设定原则
没有统一公式,关键看 IO 能力与负载特征:
- 机械硬盘:Swap 过大无意义,4 GB 足够,再多只会让 OOM 前多卡几秒;
- SSD:可设 4–8 GB,但需盯紧
iostat -x 1中 %util 和 await,避免 Swap IO 挤占业务磁盘带宽; - 内存 ≥64 GB 且负载稳定(如 Web 缓存、静态服务):Swap 可设为 2–4 GB 作底线保护,不必追求物理内存 2 倍;
- TensorFlow/PyTorch 训练等突发内存型负载:临时用交换文件快速扩容,任务结束后及时
swapoff并删除,避免长期磨损 SSD。



















