4.4.3 nice与renice优先级调整
nice与renice优先级调整#
在多任务系统中,调度器为进程分配 CPU 时间片。nice 值(-20~19)是普通进程的“权重调节器”:值越小优先级越高,值越大优先级越低。普通用户只能降低优先级(增大 nice),root 才能提升优先级(减小 nice)。
1. 原理草图:nice/PR/调度器关系#
2. 关键概念与查看命令#
- NI (Nice):用户可见的优先级调节值
- PR (Priority):内核调度优先级,受 NI 与策略影响
查看方式:
# 列出进程的PID/命令/NI/PR
ps -eo pid,comm,ni,pri,stat --sort=ni
# top中按f添加NI/PR列,观察实时变化
top
3. 使用 nice 启动进程(示例+解释)#
# 示例1:以较低优先级启动CPU密集任务
nice -n 10 bash -c 'yes > /dev/null' &
# 示例2:提高优先级(需要root)
sudo nice -n -5 bash -c 'yes > /dev/null' &
命令解释:
- nice -n 10:将 NI 设置为 10,降低优先级
- nice -n -5:将 NI 设置为 -5,提高优先级(需 root)
- yes > /dev/null:制造 CPU 负载,便于观察效果
预期效果:
- top 中 NI/PR 会变化,较低 NI 的进程获得更多 CPU 时间片。
4. 使用 renice 调整已运行进程(示例+解释)#
# 找到 yes 进程 PID
pid=$(pgrep -n yes)
# 调整单个PID的NI为15(降低优先级)
renice -n 15 -p "$pid"
# 提高优先级(需要root)
sudo renice -n -10 -p "$pid"
# 按用户批量调整
sudo renice -n 10 -u www
# 按进程组批量调整
sudo renice -n 15 -g 1234
命令解释:
- -p 指定 PID,-u 指定用户,-g 指定进程组
- 调整后用 ps -o pid,ni,pri,comm -p $pid 验证
5. 实操场景与策略(含完整流程)#
# 1) 定位高CPU进程
top -o %CPU
# 2) 记录调整前负载
uptime
ps -o pid,ni,pri,comm -p <pid>
# 3) 下调优先级,缓解CPU冲高
sudo renice -n 10 -p <pid>
# 4) 观察效果
top -p <pid>
建议策略:
- 批处理/离线任务:nice 值设置为 10~19
- 在线业务/关键服务:谨慎提升优先级,避免抢占系统关键进程
6. 与 systemd/cgroups 的关系(示例)#
# systemd服务优先级(/etc/systemd/system/myapp.service)
[Service]
ExecStart=/usr/local/bin/myapp
Nice=5
CPUWeight=200
命令解释:
- Nice=:设置服务 NI
- CPUWeight=:cgroups 的 CPU 权重(与 nice 可叠加生效)
应用并验证:
sudo systemctl daemon-reload
sudo systemctl restart myapp
ps -C myapp -o pid,ni,pri,comm
7. 常见问题与排错#
- nice 不生效:
可能被 systemd/cgroups 覆盖,检查:
bash systemctl show myapp | grep -E 'Nice|CPUWeight' cat /sys/fs/cgroup/cpu.weight - 无法调低 nice(提高优先级):
权限不足,使用 root 或 sudo。 - 优先级改变但 CPU 仍高:
任务本身 CPU 密集,需限速或 cgroups 配额:
bash # 示例:限制CPU使用(cgroup v2) echo 20000 100000 > /sys/fs/cgroup/myapp/cpu.max
8. 练习与验证#
1) 启动两个 CPU 压力进程:
nice -n 0 bash -c 'yes > /dev/null' &
nice -n 10 bash -c 'yes > /dev/null' &
2) 用 top 观察两者 CPU 占用差异。
3) 用 renice 将第一个进程改为 NI=15,对比变化。
4) 停止练习进程:
pkill yes
9. 小结与最佳实践#
- nice/renice 适用于 CPU 密集任务的优先级调节
- 关键服务谨慎提高优先级,避免影响系统稳定性
- 与 cgroups/systemd 结合实现分层资源治理
- 调整后务必记录负载、吞吐与响应时间变化