调度优先级解决什么问题
同一台机器上业务进程与批处理任务争抢资源时,单纯扩容不经济,更常见的做法是给批任务降级。nice 值范围 -20 到 19,数值越小优先级越高,20 以内只有 root 能往上提;renice 用于调整已经在跑的进程;磁盘压力场景则要用 ionice 控制 I/O 调度类别,两者配合才能让批任务真正『让路』。
基本信息
| CPU 优先级 | nice -n 值 命令(启动时设定)、renice 值 -p PID(运行中调整) |
|---|---|
| 取值范围 | -20(最高)到 19(最低),默认 0 |
| 按用户调整 | renice -n 5 -u 用户名 |
| 磁盘 I/O | ionice -c 类别 -n 级别 -p PID;类别 1 实时、2 尽力而为、3 空闲 |
| 查看当前值 | ps -eo pid,ni,comm、top 的 NI 列 |
| 权限要求 | 普通用户只能降低自己进程优先级;提升与调整他人进程需 root |
典型使用场景
- 夜间跑数据导入或全量备份,避免与在线业务争抢 CPU
- 日志压缩、报表生成这类非实时任务降级执行
- 备份任务用 ionice 空闲类别,只在磁盘空闲时才写
- 排查负载异常时确认某个进程是否被误调成高优先级
- 多用户开发机上约束单个用户的计算任务
示例
示例
nice -n 10 /opt/scripts/batch-import.sh # 启动即以较低优先级运行
renice 10 -p 12345 # 调整运行中的进程(PID 12345)
renice -n 5 -u www-data # 按用户调整该用户所有进程
ionice -c2 -n7 -p 12345 # 尽力而为类别、第 7 级(越低越让路)
ionice -c3 /opt/scripts/backup.sh # 空闲类别:仅当没有其他进程用磁盘时才执行
ps -eo pid,ni,pri,comm --sort=-ni | head # 按 nice 值排序查看,确认调整结果核验与替代方案
核验与替代方案
chrt -p 12345 # 查看调度策略(SCHED_OTHER 才有 nice 概念)
ionice -p 12345 # 查看某进程的 I/O 调度类别与级别
nice -n 19 tar -czf /backup/data.tar.gz /data # 明确最低优先级打包
systemctl edit backup.service # 服务化任务用 unit 约束:Nice=、IOSchedulingClass=
cat /sys/fs/cgroup/system.slice/backup.service/cpu.max 2>/dev/null # 有 CPUQuota 时看限额取值与效果
| 参数 | 取值 | 效果 |
|---|---|---|
| nice | -20 ~ 19 | 越小越优先,默认 0;正值为让路 |
| renice -u | 用户名 | 批量调整该用户全部进程 |
| ionice -c | 1 / 2 / 3 | 实时 / 尽力而为 / 空闲,实时类别慎用 |
| ionice -n | 0 ~ 7 | 尽力而为类别内的级别,数值越大越让路 |
| chrt -p | 查看调度策略 | 实时策略进程不受 nice 影响 |
renice 对卡在磁盘 I/O 上的进程作用有限:进程不在 CPU 上排队时调 nice 几乎无感,磁盘压力场景要配合 ionice 或 cgroup 层面的资源限制。
更推荐给批任务设置 CPUQuota、IOWeight 这类按服务隔离的约束,而不是对全机优先级做全局调整:服务化任务的约束写在 unit 文件里,换机器也不会丢。