为什么Nginx能抗住千万并发?原理揭秘!

Nginx是大型架构的核心,下面我详解Nginx并发核心@mikechen

多进程架构

Nginx 采用典型的 Master-Worker 多进程架构。

一个 master 进程负责全局管理与配置重新加载、日志轮转等。

若干个 worker 进程负责实际的网络事件处理与请求分发。

为什么Nginx能抗住千万并发?原理揭秘!

每个请求在一个 worker 进程内完成处理,彼此独立,互不共享状态,从而降低锁竞争和跨进程通信成本。

通过这种结构,可以在不增加大量线程的情况下实现高并发。

此设计的稳定性来自于隔离,单个 worker 异常通常不会直接影响到其他 worker。

worker 的数量,通常建议与 CPU 核心数相匹配。

既能充分利用多核,又避免过多进程带来的上下文切换与内存开销的剧增。

 

事件驱动架构

Nginx 以事件驱动模型作为核心,所有连接的 I/O 操作通过事件通知来驱动处理,而不是为每个连接创建一个独立的线程或阻塞等待。

事件循环,通过高效的 I/O 多路复用机制,来实现“轮询就绪事件并分发处理”的逻辑,从而在一个进程中支撑大量并发连接。

为什么Nginx能抗住千万并发?原理揭秘!

通过这种方式,大幅降低线程/进程切换开销,极大提高每个单位时间内的处理事件数。

对于 I/O 密集型应用,CPU 主要用于就绪事件的处理,空闲等待时间被利用到实际工作中,吞吐量显著提升。

 

IO 多路复用

IO 多路复用,指的是在单一线程/进程中同时监听和管理多个文件描述符的可读/可写事件。

为什么Nginx能抗住千万并发?原理揭秘!

通过操作系统提供的多路复用接口(如 epoll、kqueue、select 等),Nginx 能够在一个事件循环内高效地检测大量连接的就绪状态。

IO 多路复用的核心目标:是让一个或少量的执行单元(通常是单个线程、或单个进程中的事件循环)。

在同一时间内监视和处理大量的输入/输出描述符(socket、文件等)的就绪事件。

这样就能在不为每个连接创建独立线程的前提下,处理海量并发连接,显著降低资源消耗与上下文切换开销。

 

非阻塞I/O

非阻塞 I/O 指当资源不可用(如数据未就绪)时,I/O 调用立即返回错位(通常为 EAGAIN),而不是阻塞等待。

这允许同一进程/线程在一个事件循环里继续处理其他就绪事件。

为什么Nginx能抗住千万并发?原理揭秘!

比如:Nginx 的 worker 在遇到需要等待远端(上游应用/数据库/缓存等)响应的场景时。

将该操作设为非阻塞并注册相应事件,待就绪再继续处理。

这样,工作进程仍然可以继续处理其他就绪的事件,极大提升并发轮转效率与资源利用率。

陈睿mikechen

10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。

关注作者「mikechen」公众号,获取更多技术干货!

后台回复架构,即可获取《阿里架构师进阶专题全部合集》,后台回复面试即可获取《史上最全阿里Java面试题总结

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧