定时任务的资源控制
备份、索引、批量同步这类重 IO 任务会和在线业务抢资源:nice 降低 CPU 调度优先级,ionice 调整 IO 优先级,两者叠加能让批任务「有闲置就抢、业务忙时让路」。需要更彻底的隔离时,交给 systemd 单元的 CPUQuota 与 IOWeight,或在 cgroup 层限制。
基本信息
| 用途 | 让批任务对在线业务保持低干扰 |
|---|---|
| 语法 | nice -n 19 ionice -c3 命令 |
| ionice 类别 | -c1 实时、-c2 尽力(默认)、-c3 空闲 |
| 观察方式 | ionice -p PID、ps -o ni,cls,cmd、systemd 单元的 IOWeight |
典型使用场景
- 夜间备份与在线业务共用磁盘,压低备份的 IO 优先级
- 全量索引重建时不抢占数据库的磁盘带宽
- 大文件分发与同步限优先级,避免拖慢接口响应
- 核对批任务是否真的在让路:看调度类别与优先级
- 评估 cgroup IO 限制与 ionice 之间的取舍
- 让长跑任务在有闲置时尽快完成
示例
示例
nice -n 19 ionice -c3 /opt/app/backup.sh # 最低 CPU 与空闲 IO
0 2 * * * /usr/bin/nice -n 19 /usr/bin/ionice -c3 /opt/app/backup.sh # 写入任务
ionice -p $(pgrep -f backup.sh | head -1) # 查看当前 IO 调度类别
ps -o pid,ni,cls,cmd -p $(pgrep -f backup.sh | head -1) # 看 nice 与调度类
ionice -c2 -n7 -p 1234 # 运行中调整 IO 优先级
nice -n 19 bash -c 'tar czf /backup/data.tgz /data' # 打包任务的典型写法
systemctl show backup.service -p IOWeight # systemd 侧的更深层限制优先级参数
| 参数 | 含义 | 效果 |
|---|---|---|
| nice -n 19 | CPU 调度优先级最低 | CPU 有竞争时最后被调度 |
| ionice -c3 | 空闲 IO 类 | 仅在磁盘空闲时获得 IO 机会 |
| ionice -c2 -n7 | 尽力类,最低档 | 仍参与竞争但权重最低 |
| chrt | 调度策略查看与设置 | 实时策略需谨慎使用 |
| IOWeight | systemd 与 cgroup 权重 | 比 ionice 更细的长期方案 |
ionice 的空闲类只在部分 IO 调度器下效果明显:现代多队列与 none 调度器下作用有限,需要硬性隔离时应改用 cgroup 的 IO 限制。
空闲类任务在持续满负载的磁盘上可能长期得不到执行,备份窗口要留出余量,否则任务被一路拖延,最终挤占业务时段。
nice 只影响 CPU 调度份额,对 IO 密集型任务几乎没有帮助;先判断任务类型再选参数,不要把它当成万能手段。
验证是否真的让路要看运行态:任务跑起来后用 ps 看 nice 与调度类,再用 iostat 观察磁盘等待是否被摊薄,只看配置容易得出错误结论。