数据库同步进程应设为best-effort类(-c 2)和中低I/O优先级(-n 5或-n 6),避免使用idle类导致WAL积压,夜间低峰可临时用-c 3;启动时用ionice包裹命令,配合nice降CPU优先级,实现IO与CPU双重节制。

给数据库同步进程设合适的 IO 优先级,核心是让它“不抢盘、不卡业务”,而不是简单压到最低。关键看同步方式(如 pg_dump、mysqldump、逻辑复制、物理流复制)、运行时段、以及底层存储类型(HDD 还是 SSD)。
明确同步进程的调度类与等级
数据库同步通常属于后台任务,但不能一概设为 idle(-c 3)——它仍需稳定写入,否则可能拖慢主库 WAL 刷盘或备库 replay。推荐使用 best-effort 类别(-c 2)配合中低优先级(-n 5 或 -n 6):
- -c 2 是普通用户可安全使用的最高兼容类别,不会触发权限拒绝
- -n 5 表示比默认(-n 4)更低,但高于最低(-n 7),避免被完全饿死
- 若同步只在夜间低峰运行,且磁盘压力大,可临时用 -c 3(idle),但需确认无 WAL 积压风险
对已启动的同步进程动态降权
很多同步任务(如 pg_basebackup、pt-table-sync)启动后才发现影响线上查询响应。此时不用重启,直接补设 IO 优先级:
- 查出进程 PID:例如 pgrep -f "pg_basebackup.*--xlog" 或 ps aux | grep mysqldump | grep -v grep
- 批量设置(root 下):sudo ionice -c 2 -n 6 -p $(pgrep -f "pg_basebackup")
- 验证是否生效:ionice -p $PID 应返回 best-effort: prio 6
启动时就固化低干扰策略
更稳妥的做法是在调用同步命令前就套上 ionice,尤其适用于定时任务(cron)或 systemd service:
- cron 示例:0 2 * * * ionice -c 2 -n 6 pg_basebackup -D /backup/pg_$(date +\%F) -X stream
- systemd service 中,在 ExecStart 前加 ionice:ExecStart=/usr/bin/ionice -c 2 -n 6 /usr/bin/pg_basebackup ...
- 注意:不要在脚本里用 ionice -c 2 -n 6 && pg_basebackup,这样只影响 ionice 自身,需写成单条命令包裹
结合 nice 实现 CPU+IO 双重节制
IO 降权只是半步。数据库同步常伴随高 CPU 解压/校验(如 gzip、checksum),建议同步调整 nice 值:
- 启动时联合设置:ionice -c 2 -n 6 nice -n 10 pg_basebackup -D /backup/...
- 解释:-n 10 是 CPU nice 值(范围 -20~19),数值越大越谦让;与 ionice 的 -n 6 不冲突,二者作用域不同
- 效果:既减少磁盘队列争抢,又降低 CPU 时间片占用,对前端请求延迟改善明显











