Skip to content

[L1] nice 与 renice 进程优先级——nice 值范围、对 PHP-FPM/Nginx 的影响

一句话结论

nice 值 -20(最高优先级)到 19(最低),普通用户只能调高(降低优先级),影响 CPU 时间片分配。

体系讲解

nice 值与优先级关系

Linux 调度器使用 priority(PR) 决定 CPU 时间片分配,nice 是对 PR 的用户层偏移:

PR = 20 + nice
nice 值PRCPU 时间片
-200最多(最高优先级)
0(默认)20正常
1939最少(最低优先级)

命令用法

bash
# 以 nice 值 10 启动进程(低优先级)
nice -n 10 /usr/bin/php artisan queue:work

# 修改已运行进程的 nice 值(需知道 PID)
renice -n 5 -p 1234

# 修改某用户所有进程的 nice 值
renice -n 5 -u www-data

# 查看进程 nice 值(NI 列)
top    # 或 ps -eo pid,ni,comm

权限约束

  • root:可将 nice 值从任意值调到 -20(提升优先级)。
  • 普通用户:只能将自己进程的 nice 值调高(≥ 当前值),不能降低,不能修改其他用户进程。

对 PHP-FPM / Nginx 的影响

场景建议操作
后台队列 worker 抢占 CPU,影响 Web 响应对 queue:work 进程 renice -n 10
批量报表脚本与请求进程竞争批量脚本以 nice -n 15 启动
Nginx 与 PHP-FPM 竞争 CPU通常保持默认 nice 0,通过 worker 数量调优更有效

注意:nice 只影响 CPU 调度,不影响 I/O 优先级;I/O 优先级需用 ionice 单独设置。

考察意图

考察候选人对 Linux 进程调度基础的理解,以及在 PHP 后台任务(队列、报表)与 Web 服务同机部署时的性能隔离思路。

追问链

  1. 普通用户能将 nice 值从 10 改回 0 吗? 不能。普通用户只能调高 nice 值(降低优先级),降低 nice 值(提升优先级)需要 root 权限;这是防止普通用户通过 nice 抢占系统资源的安全限制。

  2. nice 与 ionice 有什么区别,什么时候需要同时使用?nice 控制 CPU 时间片分配,ionice 控制磁盘 I/O 带宽优先级(idle/best-effort/realtime);批量备份脚本同时消耗大量 CPU 和磁盘时,需两者配合:ionice -c 3 nice -n 19 /usr/bin/php backup.php

  3. top 中 PR 列显示 rt 是什么意思?rt(real-time)表示该进程使用实时调度策略(SCHED_FIFO 或 SCHED_RR),优先级高于所有普通进程;通常只有内核线程或特权守护进程会使用,应用进程不应随意设置。

  4. PHP-FPM 的 worker 进程能通过 nice 值提升响应速度吗? 意义有限。PHP-FPM 请求延迟通常瓶颈在 I/O(数据库、Redis)而非 CPU;CPU 密集型场景(图片处理、加密运算)才对 nice 敏感,且需要 root 才能降低 nice 值(-n 负值)。

易错点

  • 混淆 nice 值方向:nice 值越小优先级越高,"nice -n -5" 是提升优先级;命名来自"对其他进程更 nice(礼让)",所以高 nice 值 = 更礼让 = 更低优先级。
  • 误以为 nice 影响 I/O 等待进程:进程在 I/O 等待(D 状态)期间不占用 CPU,nice 对其无效;I/O 密集型任务用 ionice 才有实际效果。
  • renice 需要 sudo 才能降低已运行进程的 nice 值renice -n -5 -p 1234 对普通用户会报 Permission denied,必须以 root 执行。

代码示例

bash
# 以低优先级运行 PHP 批量任务
nice -n 15 /usr/bin/php /var/www/artisan report:generate

# 同时降低 I/O 和 CPU 优先级(idle I/O + 最低 CPU)
ionice -c 3 nice -n 19 /usr/bin/php /var/www/artisan backup:run

# 查找 queue:work 进程 PID 并调整优先级
pgrep -f "queue:work" | xargs -I{} renice -n 10 -p {}

# 查看所有进程的 nice 值
ps -eo pid,ni,comm --sort=ni | head -20

基于 Apache License 2.0 开源