温馨提示×

如何优化CentOS Swap性能

小樊
43
2026-08-18 09:42:49
栏目: 智能运维

在 CentOS(以及大多数 Linux 发行版)中,Swap 性能优化通常围绕 减少不必要的 swap、提升 swap 效率、合理配置 swap 参数 来进行。下面从 原理 → 配置 → 监控 → 实战建议 系统说明。


一、先理解 Swap 的作用与性能瓶颈

1. Swap 是如何影响性能的?

  • Swap 本质是 磁盘 IO
  • 内存不足时,系统把不常用的内存页换出到磁盘
  • 磁盘 IO 远慢于内存(尤其是机械盘)

结论

Swap 存在是为了稳定性,而不是为了性能。
优化目标是:能用内存就不用 swap,能快就别慢


二、优化思路总览

优化方向 说明
减少 swap 使用 调整 swappiness
提高 swap 效率 使用 swap 分区而非 swap 文件
提升 IO 性能 SSD / NVMe
避免频繁换入换出 控制内存压力
监控 swap 行为 使用工具分析

三、核心参数优化

1️⃣ 调整 swappiness(最关键)

swappiness 决定系统 倾向使用内存还是 swap

cat /proc/sys/vm/swappiness

默认值通常是 30(CentOS 7/8)

推荐值

场景 swappiness
数据库(MySQL / PG) 1~10
应用服务器 10~30
桌面 / 开发机 30~60
内存非常紧张 60+

临时修改

sysctl vm.swappiness=10

永久生效

vi /etc/sysctl.conf
vm.swappiness=10
sysctl -p

建议

生产服务器一般设置为 110


2️⃣ 调整脏页与内存回收参数(进阶)

vi /etc/sysctl.conf
vm.dirty_ratio = 10
vm.dirty_background_ratio = 5
vm.vfs_cache_pressure = 50

说明:

  • dirty_ratio:内存中脏页比例上限
  • vfs_cache_pressure:控制 inode/dentry 回收倾向(降低可减少 swap)

四、Swap 类型优化(分区 vs 文件)

✅ 推荐:Swap 分区(性能更好)

lsblk
swapon -s

如果是 swap file,建议改为 swap 分区(尤其是数据库)


Swap 文件(性能略差)

dd if=/dev/zero of=/swapfile bs=1M count=4096
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile

五、Swap 设备性能优化

1️⃣ 使用 SSD / NVMe

  • 机械盘 swap 性能极差
  • 云服务器优先选择 SSD

2️⃣ 多 Swap 设备(并行 IO)

swapon /dev/sdb1
swapon /dev/sdc1

系统会 轮询使用多个 swap


六、避免 Swap 被频繁使用

1️⃣ 限制某些进程使用 swap(cgroup)

echo 0 > /sys/fs/cgroup/memory/xxx/memory.swappiness

(适用于容器 / 高级场景)


2️⃣ 数据库场景(非常重要)

MySQL

innodb_buffer_pool_size = 70% 内存

PostgreSQL

shared_buffers = 25% 内存

数据库服务器:

  • swappiness = 1
  • swap 仅作为“保险”

七、监控 Swap 使用情况

1️⃣ 实时查看

free -h
vmstat 1
sar -W 1

2️⃣ 查看是否频繁 swap

vmstat 1

关注:

  • si(swap in)
  • so(swap out)

如果持续 > 0,说明内存不足


八、Swap 性能优化实战建议(总结)

最佳实践清单

  • ✅ swappiness 设为 110
  • ✅ 使用 swap 分区,而不是 swap 文件
  • ✅ swap 放在 SSD / NVMe
  • ✅ 保证内存充足,swap 只做兜底
  • ✅ 数据库服务器避免频繁 swap
  • ✅ 定期监控 si/so

九、什么时候应该关闭 Swap?

不建议直接关闭 swap

除非:

  • 内存非常充足(≥ 32G)
  • 应用明确不支持 swap
  • 使用 Kubernetes(由调度器控制)
swapoff -a

⚠️ 风险:OOM Killer 可能直接杀进程


如果你愿意,可以告诉我:

  • CentOS 版本(7 / 8 / Stream)
  • 内存大小
  • 是否运行数据库 / Docker / K8s

我可以给你一套 针对你环境的精确优化方案

0