Swap是内核的内存调度杠杆,通过冷热页分离将不活跃页换出以优化RAM利用;其行为分休眠、内存压力保底、主动缓存优化三类场景;swappiness值调控换出时机,推荐服务器设为10;swapfile与分区性能无异,但权限和fstab配置须严格。

Swap 不是“备用内存”,而是内核的内存调度杠杆
Swap 的核心作用不是补足物理内存缺口,而是让内核能主动腾出 RAM 给更需要的进程或缓存。它本质是内存页(page)的冷热分离机制:把长时间未访问的“冷页”挪到磁盘,把空出来的物理内存留给活跃程序、Page Cache 或内核数据结构。这解释了为什么 free -h 显示还有几 GB available,swap 却已用满——内核判断那些被换出的页确实不值得常驻内存。
三种典型场景,Swap 行为完全不同
同一台服务器,Swap 的使用逻辑取决于负载类型:
-
休眠(Hibernation):必须启用 swap,且大小 ≥ 物理内存;系统关机前把整个 RAM 镜像写入
swap,唤醒时原样恢复——没 swap 就无法休眠。 -
内存压力下的保底机制:当
available内存趋近于 0,且si(swap-in)持续 > 100 KB/s,说明进程正在频繁从 swap 拉回冷页,此时性能已明显下降,属于危险信号。 -
主动回收冷页以提升缓存效率:比如 Redis + NGINX + 大量静态文件服务场景,内核可能把 Redis 的部分冷 key 换出,腾出内存给 Page Cache 加速文件读取——这时
so(swap-out)高但si极低,属健康行为。
Swappiness 值决定 Swap 是“帮手”还是“拖累”
vm.swappiness 控制内核换出内存页的激进程度,但它不是“是否启用 swap”的开关,而是“多早开始换出”的调节阀:
- 值为
0:仅在内存真正耗尽(OOM 边缘)时才换出;但可能导致突发负载下 OOM Killer 直接杀进程。 - 值为
10(推荐 Web/DB 服务器):平衡冷页回收与稳定性,避免过早换出影响延迟敏感型服务。 - 值为
60(默认值):对桌面环境友好,但服务器上易造成无谓 IO 和延迟毛刺。 - 值为
100:几乎等同于“只要有点空闲就换”,极易引发抖动,除非跑超大内存分析任务且磁盘极快(如 NVMe 上的 swapfile)。
临时调整:sudo sysctl vm.swappiness=10;永久生效需写入 /etc/sysctl.conf。
Swap 文件 vs 分区:现在基本没区别,但路径权限不能错
现代 Linux(5.4+ 内核)对 swapfile 的支持已和 swap 分区一致,NVMe 下性能差距可忽略。关键差异只在初始化环节:
- 创建命令优先用
fallocate -l 8G /swapfile,比dd快且不触发日志写入; -
chmod 600 /swapfile必须执行,否则swapon会拒绝启用(报错swapon: /swapfile: insecure permissions 644, 0600 suggested); -
/etc/fstab中必须写成/swapfile none swap sw 0 0,漏掉none或写错sw会导致开机失败或 swap 不加载。
真正容易被忽略的是:swap 启用后,free -h 显示的 swap 行是总量,但实际是否“被有效利用”,得看 si/so 和 pgpgin/pgpgout(用 vmstat 1 查),而不是盯着百分比数字。100% 使用率本身不危险,持续高 si 才是问题。










