Linux swap 分区管理与优化

13次阅读

现代 linux 仍需 swap,但非越多越好;它防 oom、支撑休眠,大内存无休眠场景可小量配置或用 zram 替代,swappiness=1 更稳妥而非设 0。

Linux swap 分区管理与优化

swap 分区还能用吗?现代 Linux 还需要它

需要,但不是“越多越好”或“必须有”。swap 在内存吃紧时防止 OOM Killer 杀进程,也支撑休眠(hibernate),但 SSD 频繁写入 swap 会加速磨损,而大内存机器(≥32GB)若不休眠,swappiness=1 下几乎不触发 swap。

  • 有休眠需求 → 必须有 swap,大小 ≥ RAM(推荐等于 RAM)
  • 纯服务器、无休眠、内存充足 → 可设小 swap(如 2–4GB)或仅用 zram 替代
  • swappiness=0 不等于禁用 swap:仅在内存真正耗尽时才用,不是“完全不用”
  • 使用 zswapzram 可减少磁盘 I/O,适合 SSD 或嵌入式设备

怎么查 swap 当前状态和实际使用量

free -h 显示总量,但容易误判“没用”;真正要看的是内核是否在换页、是否有交换延迟。关键指标不在表面数字里。

  • 看真实换入换出:cat /proc/vmstat | grep -E "pgpgin|pgpgout|pswpin|pswpout" —— pswpin/pswpout 非零说明正在 swap
  • 查当前活跃 swap 设备:swapon --show=NAME,TYPE,SIZE,USED,PRIORITY
  • 观察换页延迟:vmstat 1si/so 列持续 > 0 表示频繁 swap,需干预
  • /proc/swaps 显示挂载顺序,PRIORITY 高的先用;同优先级按容量顺序

添加 swap 文件比分区更灵活,但要注意对齐和预分配

swap 文件免重启、易扩容,但若用 dd 创建且未禁用 COW(如 Btrfs/XFS 默认开启),会导致性能暴跌甚至 swap 失效。

  • 创建前关 COW:chattr +C /swapfile(Btrfs)或 xfs_io -c "extsize 1m" /swapfile(XFS)
  • 必须用 fallocate(非 dd)预分配空间:fallocate -l 4G /swapfile,否则稀疏文件引发 write stall
  • 权限必须严格:chmod 600 /swapfile && mkswap /swapfile && swapon -p 10 /swapfile
  • swapon 失败常见报错:swapon: /swapfile: swapon failed: Invalid argument → 多因文件系统不支持或未关 COW

swappiness 设为 1 是保守选择,但别盲目调成 0

swappiness 控制内核倾向把匿名页换出的激进程度(0–100),设为 0 并不阻止 swap,只推迟到内存彻底耗尽——此时可能已来不及回收,OOM Killer 直接介入。

  • 桌面环境建议 swappiness=60(默认),兼顾响应与缓存利用
  • 数据库 /Redis 等内存敏感服务 → swappiness=1,让内核尽量保留匿名页,靠 vmscan 回收 pagecache
  • 临时修改:sysctl vm.swappiness=1;永久写入 /etc/sysctl.d/99-swap.conf
  • 注意:swappiness 不影响 tmpfs、shmem 或 zram 的行为,它们走独立路径

swap 文件路径、优先级、是否启用休眠,这些细节一旦配错,故障往往在高负载时才暴露,而且日志里没有直接提示。别只盯着 free 输出那行数字。

text=ZqhQzanResources