CentOS 中 Swapper 与数据库性能的优化思路
一 核心原则与风险
- Swap(交换空间)用于在物理内存(RAM)不足时把不活跃页换到磁盘,但其速度远低于 RAM,数据库访问被换出的页会产生明显的访问延迟与磁盘 I/O 放大,从而拖慢吞吐与响应时间。优化目标是:让数据库“热数据”尽量留在内存,减少换入换出,同时保留少量 Swap 作为极端情况下的“安全网”。降低 swappiness、优化数据库内存参数与 I/O 策略,是提升数据库稳定性的关键路径。
二 快速判断与定位
- 观察是否发生换页与 I/O 压力:
- 查看内存与 Swap:free -h、swapon -s
- 观察进程与内核线程:top/htop(关注 si/so、wa)、vmstat 1(关注 si/so、wa、free)
- 定位占用 Swap 最多的进程:for i in $(cd /proc; ls | grep “^[0-9]” | awk ‘$0 > 100’); do awk ‘/Swap:/{a+=$2} END {print $0, a/1024"M"}’ /proc/$i/smaps 2>/dev/null; done | sort -k2nr | head
- 磁盘侧 I/O:iostat -x 1(关注 await、svctm、util 与 swap 读写)
- 出现以下特征通常意味着 Swap 正在影响数据库:si/so 持续不为 0、iostat 中 util 长时间接近 100%、应用延迟抖动或超时增多。
三 系统层优化要点
- 调整 vm.swappiness(降低换出倾向)
- 建议值:数据库通常为 10–20;若确认内存充足且为内存敏感型负载,可更低(如 0–10)。注意:降低 swappiness 只能减少概率,不能保证完全避免 Swap。
- 临时:sysctl vm.swappiness=10;永久:echo ‘vm.swappiness=10’ >> /etc/sysctl.conf && sysctl -p
- 调整 vm.vfs_cache_pressure(文件系统缓存回收倾向)
- 适度降低可更倾向保留 VFS 缓存(如 50),提升文件系统元数据/目录项命中;过高会频繁回收缓存,增加磁盘访问。
- 优化脏页刷写(平滑写峰、降低抖动)
- 适度降低 vm.dirty_background_ratio(如 5%)与 vm.dirty_ratio(如 10–20%),将一次大刷写打散为多次小刷写,减少长尾停顿;vm.dirty_expire_centisecs(默认 3000ms)与 vm.dirty_writeback_centisecs(默认 500ms)一般保持默认,除非明确存在拥塞与延迟问题。
- 使用 ZRAM(内存内压缩交换,优先于磁盘 Swap)
- 适合内存较紧张但又需“安全网”的场景:modprobe zram;echo lz4 > /sys/block/zram0/comp_algorithm;echo 4G > /sys/block/zram0/disksize;mkswap /dev/zram0;swapon /dev/zram0
- 何时保留/扩大磁盘 Swap
- 传统经验值:内存 ≤4GB 可设 2×;4–8GB 设 1×;8–64GB 设 8GB;>64GB 设 16GB。若运行内存密集型数据库且允许少量换页,可在此基础上适度增加,作为 OOM 前的缓冲。
- 不建议在 SSD 上启用大容量 Swap(写放大与磨损问题),优先 ZRAM 或高性能 NVMe 并做好容量规划与监控。
四 数据库层优化要点(以 MySQL/InnoDB 为例)
- 让 InnoDB 缓冲池尽量常驻内存
- 设置 innodb_buffer_pool_size 为物理内存的70–80%(需结合实例总内存与其他常驻进程如连接栈、OS 页缓存等综合评估),减少磁盘读与换页概率。
- 避免双缓冲与减少文件系统缓存压力
- 启用 innodb_flush_method=O_DIRECT,让缓冲池直写磁盘,绕过页缓存;注意 redo log 仍可能使用页缓存,但其为顺序写、占用相对可控。
- 锁定关键内存,防止被换出
- 配置 memlock(需 root 启动 mysqld),调用 mlockall() 将进程地址空间锁入物理内存;对稳定性要求极高的实例可考虑 Huge Pages(大页内存,通常不可换出)。
- 控制会话级内存膨胀
- 合理设置 sort_buffer_size、join_buffer_size、read_buffer_size、read_rnd_buffer_size、tmp_table_size 等,避免“连接数 × 每连接缓冲”造成的内存爆炸,从源头降低换页风险。
五 维护与应急操作
- 临时缓解高 Swap 的应急
- 温和方式:降低 swappiness、重启占用内存较大的非核心服务、执行 sync 后适度 echo 3 > /proc/sys/vm/drop_caches(仅清页缓存,谨慎使用)。
- 强力方式:swapoff -a 后再 swapon -a(仅在业务可短暂停机或维护窗口执行,避免 OOM 或长时不可用)。
- 规范启用/扩容/缩容 Swap
- 创建文件:fallocate -l 8G /swapfile(或 dd)、chmod 600 /swapfile、mkswap /swapfile、swapon /swapfile、写入 /etc/fstab 实现开机自启;缩容需先 swapoff、调整文件/分区后重新启用。
- 变更前后务必进行
- 基准压测(如 sysbench/业务回归)、监控对比(延迟、QPS/TPS、iostat、vmstat、dmesg OOM/stall 等),确保调优收益与稳定性。