Nginx 是一 高性能 的 Web 服务器,能够同时处理 大量的并发请求。它结合多进程机制 和 异步机制,异步机制使用的是 异步非阻塞方式,接下来就给大家介绍一下 Nginx 的 多线程机制 和 异步非阻塞机制。
目录
一、 多进程模型:管理进程与工作进程分离的设计
1.1 工作原理
Nginx 在启动后,会有一个 master 进程和多个 worker 进程。master 进程主要用来管理worker 进程,包括接收来自外界的信号,向各 worker 进程发送信号,监控 worker 进程的运行状态以及启动 worker 进程。 worker 进程是用来处理来自客户端的请求事件。多个 worker 进程之间是对等的,它们同等竞争来自客户端的请求,各进程互相独立,一个请求只能在一个 worker 进程中处理。worker 进程的个数是可以设置的,一般会设置与机器 CPU 核数一致,这里面的原因与事件处理模型有关。

1.2 master与worker进程的作用与功能
1.2.1 管控中枢 - Master进程
作用:管理worker进程
功能:
- 接收来自外界的信号,通过接收的信号,做出进一步的操作。
- 向各worker进程发送信号,发送的信号就是一个指令,销毁,新建。
- 监控woker进程的运行状态。
- 当woker进程退出后(异常情况下),会自动重新启动新的woker进程。
| 进程类型 | 权限等级 | 内存占用 | 主要职责 | 存活周期 |
|---|---|---|---|---|
| Master 主人 | root 根 | <5MB <5兆字节 | 配置解析/信号处理/热升级 | 服务全生命周期 |
| Worker 工人 | nobody 没有人 | 50-200MB 50-200 兆字节 | 请求处理/TLS握手/流量转发 | 动态重建 |
1.2.3 worker进程的作用与功能
功能:处理网络事件,即处理请求

功能:
- 多个worker进程之间是对等且相互独立的,它们同等竞争来自客户端的请求。
- 一个请求,只可能在一个worker进程中处理,一个worker进程,不可能处理其它进程的请求。
- worker进程的个数是可以设置的,一般我们会设置与机器cpu核数一致。更多的worker数,只会导致进程来竞争cpu资源了,从而带来不必要的上下文切换。而且,nginx为了更好的利用多核特性,具有cpu绑定选项,我们可以将某一个进程绑定在某一个核上,这样就不会因为进程的切换带来cache的失效。
1.3 多进程模型带来的优点
- 利用多核系统的并发处理能力
- Nginx 中所有的 worker 工作进程都是完全平等的。这提高了网络性能、降低了请求的时延。
- 均衡每个worker进程
- 多个 worker 工作进程通过进程间通信来实现负载均衡,即一个请求到来时更容易被分配到负载较轻的 worker 工作进程中处理。这也在一定程度上提高了网络性能、降低了请求的时延。
- 管理进程会负责监控工作进程的状态,并负责管理其行为
- 管理进程不会占用多少系统资源,它只是用来启动、停止、监控或使用其他行为来控制工作进程。首先,这提高了系统的可靠性,当 worker 进程出现问题时,管理进程可以启动新的工作进程来避免系统性能的下降。其次,管理进程支持 Nginx 服务运行中的程序升级、配置项修改等操作,这种设计使得动态可扩展性、动态定制性较容易实现。
二、几种常用的模型
2.1 select 模型-经典IO多路复用

模型应用:apache
工作原理:
该模型通过同步事件检测机制实现网络连接管理,其运作过程可分为三个阶段:
-
描述符注册:将需要监听的网络套接字(以文件描述符形式抽象)存入预设的位图结构(fd_set)
-
内核态轮询:通过系统调用将fd_set全量拷贝至内核空间,由内核发起线性遍历检测:
-
检查每个描述符的就绪状态(可读/可写/异常)
-
对未就绪描述符挂起等待,直到超时或事件触发
-
-
用户态处理:将修改后的fd_set回传至用户空间,应用程序需遍历整个集合解析就绪事件
优缺点:
-
- 文件描述符最大只有1024个
- 数据准备好,通知socket,但不告诉具体是那个请求的数据准备好了,需要select函数自己遍历
2.2 poll模型

模型应用:apache
工作原理:
优缺点:
- 文件描述符最大解决的限定,可以设置成千上万。
- 数据准备好,通知socket,但不告诉具体是那个请求的数据准备好了,需要poll函数自己遍历
2.3 epoll模型

模型应用:Nginx,Redis
工作原理:
- epoll几乎是高性能服务器的必备事件模型,包含网络事件及异步IO。epoll也是在linux平台上特有的事件模型。相比select轮询的方式处理事件,epoll只会处理发生了”改变”的文件描述符,这样能很好地避免不必要的事件处理,提升了处理的性能及效率。
- 同时,与select相比,epoll支持的文件描述符的数量是可以打开的文件数目,而不是select的进程可打开的文件描述符的数量,可打开的文件数量远远大于一个进程可以打开的文件描述符的数量(虽然进程可打开的文件描述符数量可以修改)。
文件描述符FD的作用:
- 记录客户端要请求的数据是什么,数据在那里
- 数据是否已经准备好,是否已经copy完成
优缺点:
- 文件描述符最大解决的限定,可以设置成千上万。
- 数据准备好,通知socket,告诉其具体是那个请求的数据准备好了,epoll函数直接读取就好了

被折叠的 条评论
为什么被折叠?



