nginx采用少量worker进程+单线程事件循环+非阻塞i/o处理海量连接,避免线程开销与上下文切换,通过epoll/kqueue批量监听socket,事件驱动分阶段处理请求,进程间无共享状态,显著提升并发性能与资源利用率。

Nginx 的异步事件驱动机制不靠多线程并发,而是用少量 worker 进程 + 单线程事件循环 + 非阻塞 I/O 来处理海量连接,天然绕开了传统模型里最耗资源的线程创建、调度和上下文切换。
单 worker 进程处理成千上万连接
每个 worker 进程内部是单线程,通过 epoll(Linux)或 kqueue(BSD/macOS)监听成百上千个 socket 的状态变化。它不为每个连接分配线程,也就没有线程栈分配、寄存器保存/恢复、CPU 时间片调度这些开销。10 万个并发连接,通常只需 4–8 个 worker 进程,而不是 10 万个线程。
非阻塞 I/O 避免主动挂起与唤醒
传统阻塞调用(如 read())在数据未就绪时会让线程休眠,内核必须保存现场、切换到其他任务;等数据到达再唤醒——一次等待就触发两次上下文切换。Nginx 所有 socket 都设为 non-blocking,调用 recv/send 立即返回,没数据就返回 EAGAIN,继续处理别的就绪事件。epoll_wait() 一次可批量获取多个就绪 fd,整个过程用户态持续运行,只在真实事件发生时才与内核交互。
事件循环统一调度,无抢占式调度压力
请求生命周期被拆成多个阶段(如 accept → read header → read body → proxy connect → write response),每个阶段只做少量工作,立刻交还控制权给事件循环。所有回调都在同一个线程内顺序执行,不涉及线程间同步、锁竞争或调度器介入。上下文切换频率从“每连接多次”压缩为“每 worker 每批事件一次”,压测中常降低 90% 以上。
进程隔离 + 无共享连接状态
worker 进程之间不共享连接或内存上下文,各自管理自己的连接池、buffer 和事件队列。这意味着: • 不需要跨线程加锁保护连接状态 • 不会出现惊群效应(accept_mutex 或 SO_REUSEPORT 可进一步优化) • 某个 worker 阻塞(如上游响应慢)不影响其他 worker 继续服务
这种设计让 CPU 时间真正花在处理请求上,而不是反复进出内核、搬运上下文。只要配置合理(如 worker_processes auto、use epoll、worker_connections 足够),就能把硬件资源用得更实、更稳。











