1. 课程导论:为什么进程调度影响 Nginx 吞吐量?核心概念与实验环境总览

1.1 一个被忽视的性能瓶颈

当 Nginx 运行在多核服务器上时,绝大多数性能优化工作集中在配置调优、内核网络参数、SSL 卸载和缓存策略上。然而,一个更深层的、决定 CPU 资源如何分配给 Nginx 工作进程的机制——Linux 进程调度器——往往被忽视。调度器的决策直接影响工作进程何时获得 CPU、能运行多久、以及进程在 CPU 之间的迁移行为,这些因素最终汇聚为 Nginx 的吞吐量指标(如 RPS、延迟百分位)。

核心洞察: 调度器不是“黑盒”。通过调整调度策略、时间片长度、负载均衡阈值等参数,可以显著改变 Nginx 工作进程的 CPU 驻留行为,从而在同等硬件条件下获得 10%~30% 的吞吐量提升。

1.2 进程调度如何影响 Nginx 吞吐量:三条关键路径

调度器通过以下三条路径直接影响 Nginx 的请求处理能力:

影响路径 调度器行为 对 Nginx 吞吐量的影响
CPU 时间片分配 调度器决定每个 Nginx worker 进程每次获得 CPU 的运行时长(时间片)。 时间片过短 → 频繁上下文切换 → 缓存污染 → 延迟升高;时间片过长 → 交互性变差 → 长尾延迟。
进程迁移与缓存亲和性 调度器将进程在不同 CPU 核心之间迁移以平衡负载。 频繁迁移 → L1/L2 缓存失效 → 内存访问延迟增加 → 单核吞吐量下降。
负载均衡粒度 调度器在 CPU 之间迁移进程的阈值和频率。 过于激进的均衡 → 迁移开销 > 负载均衡收益;过于保守 → 部分核心空闲而其他核心过载。
实验前提: 本课程假设 Nginx 已配置为 worker_processes auto(通常等于 CPU 核心数),且使用 epoll 事件驱动模型。调度器调优是在此基础上的进一步挖掘。

1.3 核心概念速览

在进入实验之前,需要掌握以下调度器核心概念:

  • CFS(Completely Fair Scheduler): Linux 默认调度器,基于虚拟运行时间(vruntime)实现“完全公平”。
  • 调度策略(Scheduling Policy): SCHED_OTHER(普通)、SCHED_FIFO(实时先入先出)、SCHED_RR(实时轮转)。
  • nice 值: 影响进程的权重,范围 -20~19,值越小优先级越高。
  • sched_latency_ns: 调度延迟目标,决定 CFS 在一个周期内让所有可运行进程至少运行一次的时间窗口。
  • sched_min_granularity_ns: 进程获得 CPU 的最小时间片长度。
  • sched_nr_migrate: 每次负载均衡时最多迁移的进程数。
调度器核心概念关系图 Linux CFS 调度器 调度策略 nice 值 / 权重 vruntime sched_latency_ns sched_min_granularity_ns sched_nr_migrate 调优本质:在公平性、响应延迟和吞吐量之间寻找最佳平衡点

1.4 实验环境总览

本课程所有实验均在以下标准化环境中进行,确保结果可复现:

组件 规格 / 版本 备注
操作系统 Ubuntu 22.04 LTS Kernel 5.15+,默认 CFS 调度器
CPU Intel Xeon Gold 6248R (2 路, 48 核) 关闭超线程,固定频率 3.0 GHz
内存 256 GB DDR4 2933 MHz NUMA 架构,2 个节点
Nginx 版本 1.24.0 编译参数:--with-file-aio --with-threads
压测工具 wrk2 (保持连接模式) 固定连接数 200,持续 60 秒
监控工具 perf, pidstat, /proc/sched_debug 采集调度延迟、上下文切换、迁移次数
重要: 所有实验前请确保关闭 CPU 频率缩放(cpupower frequency-set -g performance)和 Intel Turbo Boost,以消除频率动态变化对结果的干扰。

1.5 实验流程与测量指标

每章实验遵循统一的“调优-压测-分析”三步流程:

  1. 基线采集: 使用默认调度器参数运行 Nginx,记录吞吐量(RPS)、P99 延迟、上下文切换次数。
  2. 参数调整: 通过 sysctl 或 chrt 修改目标调度器参数,重启 Nginx 或动态生效。
  3. 对比分析: 使用 perf 和 sched_debug 采集调度事件,量化参数变化对吞吐量的影响。

核心测量指标定义如下:

指标 采集方式 说明
RPS (Requests Per Second) wrk2 输出 Nginx 每秒处理的 HTTP 请求数,反映吞吐量上限
P99 延迟 wrk2 延迟分布 99% 请求的完成时间,反映尾部延迟
上下文切换次数 pidstat -w 每秒自愿/非自愿上下文切换次数,反映调度开销
CPU 迁移次数 perf stat -e migrations 进程在 CPU 之间的迁移频率,反映缓存亲和性损失

1.6 课程路线图

本课程共 30 章,分为四个阶段:

  • 基础篇(第 1~8 章): 调度器原理、参数含义、监控工具使用。
  • 调优篇(第 9~20 章): 逐一调整 sched_latency_ns、sched_min_granularity_ns、nice 值、调度策略、CPU 亲和性等参数,观察对 Nginx 吞吐量的影响。
  • 进阶篇(第 21~26 章): NUMA 感知调度、cgroup 带宽控制、实时调度与 Nginx 的结合。
  • 实战篇(第 27~30 章): 综合调优案例、生产环境部署建议、性能回归测试。
课程四阶段路线图 基础篇 第 1~8 章 原理 + 监控 调优篇 第 9~20 章 单参数实验 进阶篇 第 21~26 章 NUMA + cgroup 实战篇 第 27~30 章 综合调优 每章均包含:基线采集 → 参数调整 → 对比分析 → 结论总结 所有实验数据均可在 GitHub 仓库中复现

1.7 快速验证:检查当前调度器状态

在开始调优之前,先确认你的环境是否处于可调优状态。执行以下命令:

# 查看当前调度策略和优先级
chrt -p $(pgrep -f "nginx: worker" | head -1)

# 查看当前 CFS 参数
sysctl kernel.sched_latency_ns
sysctl kernel.sched_min_granularity_ns
sysctl kernel.sched_nr_migrate

# 查看 Nginx worker 进程的上下文切换频率
pidstat -w -p $(pgrep -f "nginx: worker" | tr '\n' ',') 1 5