Nginx worker 进程需通过 systemd 配置 LimitRTPRIO 和 LimitRTTIME 并在 nginx.conf 中使用 worker_scheduler 指令(≥1.19.7)才能启用实时调度,否则即使设置 worker_priority 也无效;绝大多数 Web 场景不建议启用,以防系统关键进程被饿死。

Systemd 默认禁止 Nginx 进程使用 RLIMIT_RTPRIO(实时调度优先级),即使你在 Nginx 配置中设置了 worker_priority 或通过 renice 调整,也无法真正生效——因为 systemd 会重置该限制。要让 Nginx worker 进程获得实时调度能力(如使用 SCHED_FIFO 或 SCHED_RR),必须显式配置 systemd service 单元的资源控制参数。
确认 Nginx 是否需要实时优先级
绝大多数 Web 服务场景下,Nginx 完全不需要也不建议启用实时调度策略。实时优先级(RTPRIO)仅适用于对延迟极度敏感、有硬实时要求的嵌入式或音视频流转发等特殊场景。滥用会导致系统其他关键进程(如 SSH、systemd-journald、内核线程)被饿死,引发卡顿甚至不可响应。
若确需启用,请先确认:
- Nginx 编译时启用了
--with-rt-signals(非必需,但利于信号处理) - 内核支持实时调度(
CONFIG_RT_GROUP_SCHED=y,主流发行版默认开启) - 你已理解
RLIMIT_RTPRIO和SCHED_RR的实际影响范围(仅限 worker 进程,master 进程仍为 SCHED_OTHER)
在 systemd service 中启用 RTPRIO 限制
直接修改 /usr/lib/systemd/system/nginx.service 不推荐(升级会被覆盖)。应使用 systemd 的 drop-in 机制:
创建覆盖配置:
sudo systemctl edit nginx填入以下内容:
[Service]LimitRTPRIO=99
LimitRTTIME=1000000
CPUAccounting=true
说明:
-
LimitRTPRIO=99:允许进程请求最高实时优先级(0–99,数值越大优先级越高) -
LimitRTTIME=1000000:限制每个实时调度周期内最多运行 1 秒(单位微秒),防止单个 worker 长期独占 CPU;设为infinity可禁用此限制(不推荐) -
CPUAccounting=true:启用 CPU 使用统计,便于后续监控是否真正在用实时调度
配合 Nginx 配置启用实时调度
仅改 systemd 不够。还需在 /etc/nginx/nginx.conf 的 main 块中启用调度策略:
worker_rlimit_nofile 65535;
worker_priority -20; # 仅影响 nice 值,不影响实时调度
# 启用实时调度(需 Nginx ≥ 1.19.7)
worker_cpu_affinity auto;
# 关键:启用 SCHED_RR 并指定优先级(0–99)
worker_scheduler rr 50;
注意:worker_scheduler 指令是较新版本(1.19.7+)才支持的。旧版本无法通过配置启用实时调度,只能靠外部工具(如 chrt)启动 worker,但与 systemd 管理冲突,不推荐。
验证是否生效
重启并检查:
sudo systemctl daemon-reloadsudo systemctl restart nginx
sudo systemctl status nginx
查看任意一个 worker 进程的调度策略:
ps -eo pid,tid,cls,rtprio,comm | grep nginx | grep -v master输出中应看到类似:
12345 SCHED_RR 50 nginx若显示 SCHED_OTHER 或 rtprio 为 -,说明未生效,常见原因包括:
- systemd 版本过低(LimitRTPRIO
- 内核禁用了实时调度(检查
/proc/sys/kernel/sched_rt_runtime_us是否为负值) - Nginx 版本太旧,不支持
worker_scheduler - SELinux 或 AppArmor 强制拦截了
sched_setscheduler()系统调用










