linux内存充足仍用swap是因内核默认swappiness=60偏保守,应调低至1~10以优先回收文件缓存而非换出进程内存;swap大小按内存容量设为4g/8g/16g即可,过大反增开销;需检查docker或systemd slice是否未限制swap使用,且仅当vmstat显示持续so>0时才需干预。

Linux 在内存充足时仍用 Swap,不是因为“缺内存”,而是内核默认策略偏保守。关键在于调整回收倾向,而不是简单禁用或删 Swap。
调低 swappiness 值(最直接有效)
swappiness 控制内核在内存压力下“优先回收文件缓存”还是“优先换出进程内存到 Swap”。值越低,越倾向保留进程内存、多清缓存,Swap 使用就越少。
默认值通常是 60,对生产服务器偏高
内存 ≥16GB 的服务器,建议设为 1~10
-
设置方法:
# 临时生效(重启失效) sudo sysctl vm.swappiness=5 # 永久生效 echo "vm.swappiness=5" | sudo tee -a /etc/sysctl.conf sudo sysctl -p
确认 Swap 分区大小是否合理
Swap 不是越大越好。过大的 Swap 可能诱使内核更早启用换页机制:
- 物理内存 ≤4GB → Swap 设 4GB
- 4–8GB → Swap 设 8GB
- >8GB → Swap 设 16GB 即可(Red Hat 官方建议上限为 8GB,实际按需略放宽)
过大 Swap(如 32GB)在内存充足时反而增加调度开销,且无实质收益。
检查是否有服务或容器绕过内存限制
即使总内存富余,局部压力也可能触发 Swap:
- Docker 容器若只设
--memory但未设--memory-swap,会默认允许使用无限 Swap - systemd 的 slice(如
machine.slice)若未限制内存,虚拟机或容器可能悄悄占用 Swap - 解决办法:为关键服务配置 memory limit + swap limit,或在
/etc/systemd/system.conf中设置DefaultMemoryLimit和DefaultMemorySwapMax
避免误判:区分“用了 Swap”和“需要 Swap”free -h 显示 Swap used ≠ 系统性能受损。只要 si/so(swap in/out)为 0(用 vmstat 1 查),说明只是历史数据滞留,没发生实际换页。此时无需干预。真正要警惕的是持续非零的 so 值——那才代表活跃换出,需立即排查进程或调参。











