CentOS 下通过 Swapper 优化数据库性能
一 核心原则
- 数据库对延迟敏感,应尽量减少磁盘 Swap 的使用,避免页面频繁换入换出(thrashing)导致查询抖动与吞吐下降。
- 优先保证充足的物理内存与合理的数据库缓存(如 InnoDB Buffer Pool),其次再调优 Swap 相关参数与策略。
- 在内存紧张但需稳定性的场景,使用 zswap/zram 等“内存内压缩”的 Swap 机制,可显著降低磁盘 I/O 与卡顿概率。
二 快速检查与定位
- 查看内存与 Swap 使用:free -h、swapon --show;观察是否有持续的 si/so(swap in/out)以及可用内存是否长期紧张。
- 观察系统是否发生换页:vmstat 1 5(关注 si/so 列)、iostat -x 1(关注 await、svctm、util)、top/htop(按内存排序,识别占用内存最多的进程)。
- 判定思路:若 si/so 长期不为 0 且数据库响应变慢,说明存在 Swap 压力;若可用内存充足却仍频繁换页,需检查应用内存使用或内核参数设置不当。
三 关键参数与推荐值
- 调整内核交换倾向(swappiness)
- 作用:控制内核将数据从物理内存换出到 Swap 的积极程度,取值 0–100,值越大越倾向使用 Swap。
- 建议:数据库服务器通常设为 10–20;若内存充足且为降低延迟可更低(但不建议直接为 0,保留少量 Swap 作为 OOM 缓冲更安全)。
- 操作:
- 查看:cat /proc/sys/vm/swappiness
- 临时:sysctl vm.swappiness=10
- 永久:echo ‘vm.swappiness=10’ >> /etc/sysctl.conf && sysctl -p
- 调整 VFS 目录项/索引节点缓存压力(vfs_cache_pressure)
- 作用:控制内核回收目录项与 inode 缓存的积极性;较高会更快释放缓存,较低则更倾向保留。
- 建议:数据库元数据与文件遍历较多时,可设为 50 左右以平衡回收与保留。
- 查看:cat /proc/sys/vm/vfs_cache_pressure
- 临时:sysctl vm.vfs_cache_pressure=50
- 永久:echo ‘vm.vfs_cache_pressure=50’ >> /etc/sysctl.conf && sysctl -p
- 使用内存内压缩的 Swap 机制(zswap/zram)
- zswap:在内核中建立压缩的 Swap 缓存,优先把页压缩后放入内存,减少对磁盘 Swap 的访问,适合内存较紧又需稳定性的数据库主机。
- zram:在内存中创建压缩块设备充当 Swap,适合低内存云主机或嵌入式环境,注意会占用部分可用 RAM。
- 建议:优先启用 zswap;在极小内存或特定场景再考虑 zram。
四 Swap 大小与启用方式
- 容量建议(经验规则,按业务与延迟目标微调)
- ≤4GB RAM:Swap = 2×RAM
- 4–8GB RAM:Swap = RAM
- 8–64GB RAM:Swap = 8GB
- 64–256GB RAM:Swap = 16GB
- 说明:当内存很大(如 ≥64GB)且数据库内存命中率高时,可进一步降低 Swap 容量,甚至仅保留少量作为安全垫。
- 启用与持久化(以 Swap 文件为例)
- 创建:fallocate -l 8G /swapfile(示例为 8GB)
- 权限:chmod 600 /swapfile
- 格式化:mkswap /swapfile
- 启用:swapon /swapfile
- 验证:swapon --show、free -h
- 开机自启:在 /etc/fstab 追加一行:/swapfile none swap sw 0 0
- 云服务器与低内存场景
- 优先启用 zswap;若使用 zram,务必评估对可用内存的占用与 OOM 风险。
五 数据库与 NUMA 的配套优化
- InnoDB 层:合理设置 innodb_buffer_pool_size(通常占可用内存的 60%–75%,视实例共驻进程而定),减少磁盘读与检查点压力。
- 避免文件系统缓存重复缓存 InnoDB 数据文件:在 MySQL 配置中设置 innodb_flush_method=O_DIRECT,让 InnoDB 直接落盘,减少双缓存带来的内存压力与换页诱因。
- NUMA 架构:多 NUMA 节点主机建议启用 innodb_numa_interleave=1,或在 BIOS/内核层面设置内存交错,均衡各节点内存分配,降低因本地/远端内存访问不均导致的性能波动与换页风险。