在 CentOS(以及大多数 Linux 发行版)中,Swap 性能优化通常围绕 减少不必要的 swap、提升 swap 效率、合理配置 swap 参数 来进行。下面从 原理 → 配置 → 监控 → 实战建议 系统说明。
✅ 结论:
Swap 存在是为了稳定性,而不是为了性能。
优化目标是:能用内存就不用 swap,能快就别慢
| 优化方向 | 说明 |
|---|---|
| 减少 swap 使用 | 调整 swappiness |
| 提高 swap 效率 | 使用 swap 分区而非 swap 文件 |
| 提升 IO 性能 | SSD / NVMe |
| 避免频繁换入换出 | 控制内存压力 |
| 监控 swap 行为 | 使用工具分析 |
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
✅ 建议:
生产服务器一般设置为
1或10
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)lsblk
swapon -s
如果是 swap file,建议改为 swap 分区(尤其是数据库)
dd if=/dev/zero of=/swapfile bs=1M count=4096
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile
swapon /dev/sdb1
swapon /dev/sdc1
系统会 轮询使用多个 swap
echo 0 > /sys/fs/cgroup/memory/xxx/memory.swappiness
(适用于容器 / 高级场景)
innodb_buffer_pool_size = 70% 内存
shared_buffers = 25% 内存
✅ 数据库服务器:
free -h
vmstat 1
sar -W 1
vmstat 1
关注:
si(swap in)so(swap out)如果持续 > 0,说明内存不足
✅ 最佳实践清单
1 或 10si/so❌ 不建议直接关闭 swap
除非:
swapoff -a
⚠️ 风险:OOM Killer 可能直接杀进程
如果你愿意,可以告诉我:
我可以给你一套 针对你环境的精确优化方案 ✅