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 结合实现分层资源治理
  • 调整后务必记录负载、吞吐与响应时间变化