Linux中Swap使用过高通常因内核回收策略或应用行为导致,并非真实内存不足;应通过free、swapon、vmstat等工具诊断原因,合理调低swappiness(如1–10)、关闭THP、调整vfs_cache_pressure,并配置适量Swap分区(4–8GB)以保障稳定性与性能。

Linux系统中Swap使用过高,通常不是因为内存真的不够,而是内核的内存回收策略或应用行为导致页面被换出。盲目关闭Swap可能引发OOM Killer杀进程,合理调优才能兼顾稳定性与性能。
检查Swap高占用的真实原因
先确认是否真有内存压力,而非临时缓存换出:
- 运行 free -h 查看Mem和Swap整体使用,重点关注 available 值(非free),它反映真正可用内存
- 用 swapon --show 确认Swap设备类型(文件 or 分区)及优先级
- 执行 cat /proc/swaps 观察各Swap区域使用率,判断是否集中在某一块
- 结合 vmstat 1 或 pidstat -r 1 查看si/so(swap in/out)速率,持续高so说明频繁换页,需警惕
调整swappiness控制换出倾向
swappiness(0–100)决定内核倾向于使用内存还是Swap,默认值60偏保守,对多数服务器场景过高:
- 内存充足(如≥32GB)且应用对延迟敏感(数据库、实时服务),建议设为 1–10
- 临时生效:sysctl vm.swappiness=10
- 永久生效:在 /etc/sysctl.conf 中添加 vm.swappiness=10,再运行 sysctl -p
- 注意:设为0不等于禁用Swap(仅在内存完全耗尽时才用),若需彻底避免换出,应配合足够物理内存+合理应用配置
优化内存回收与透明大页行为
某些内核机制会加剧Swap使用,尤其在负载波动时:
- 关闭透明大页(THP)的延迟分配:echo never > /sys/kernel/mm/transparent_hugepage/enabled(部分Java/DB应用因THP碎片化触发更多swap)
- 降低vm.vfs_cache_pressure(默认100)可减少dentry/inode缓存回收,间接缓解内存紧张假象,建议调至 50–80
- 检查是否有内存泄漏进程:top 按 M 排序,关注RES和%MEM;或用 smem -s rss -r 查看实际物理内存占用
Swap空间本身的设计建议
Swap不是“补丁”,其配置应匹配硬件与用途:
- 传统建议“Swap = 2×RAM”已过时;现代服务器(≥16GB RAM)通常配 4–8GB Swap分区 即可,重点用于休眠(hibernate)和OOM缓冲
- 避免使用Swap文件(尤其是ext4/XFS上),性能低于Swap分区;如必须用,确保放在高速存储(NVMe)且预分配(fallocate)
- 多块磁盘时,可配置多个低优先级Swap分区分散IO压力:swapon -p 10 /dev/sdb1、swapon -p 5 /dev/sdc1










