Nginx高性能的原因
一、IO多路复用Epoll
在了解Epoll多路复用前我们要了解Java bio模型与Linux select模型
-
Java bio——阻塞进程式的模型
bio模型建立在java C/S基础上,客户端和服务端通过socket进行连接,一对一建立,java client只有等socket.write()所有字节流输出到TCP/IP缓存区之后,才返回,如果网络传输很慢,TCP/IP缓冲区被塞满,java client只有等信息传输过去,缓冲区有空间后,才能写入。
-
Linux select模型——变更触发轮询查询,有1024数量限制
select模型监听客户端连接的socket,将所有监视的socket加入阻塞队列中,阻塞自己进程,如果有连接收到数据,就遍历整个队列,将该连接移除阻塞队列,加入工作队列中。

epoll类似于select模型,先将自己阻塞,监听客户端连接,但为了避免select遍历队列,设置回调函数,如果连接发生变化就唤醒自己并直接执行回调函数
IO多路复用Epoll总结表示:一个 线程,跟踪多个 socket 状态,哪个就绪,就读写哪个;
一.1、IO多路复用Epoll适用的场景
多路复用在单个连接的请求处理速度没有优势,适合 IO 密集型 场景,
- 只使用一个线程,处理大量的并发请求,降低上下文环境切换损耗,也不需要考虑并发问题,相对可以处理更多的请求(适用于大并发量);
- 消耗更少的系统资源(因为不需要线程调度开销)
- 适用于长连接的情况(多线程模式长连接容易造成线程过多,造成频繁调度)
二、master worker进程模型

- **多进程:**一个 Master 进程、多个 Worker 进程。
- **Master 进程:**管理 Worker 进程。对外接口:接收外部的操作(信号);对内转发:根据外部的操作的不同,通过信号管理 Worker;**监控:**监控 Worker 进程的运行状态,Worker 进程异常终止后,自动重启 Worker 进程。
- **Worker 进程:所有 Worker 进程都是平等的。实际处理:网络请求,由 Worker 进程处理。Worker 进程数量:**在 nginx.conf 中配置,一般设置为核心数,充分利用 CPU 资源,同时,避免进程数量过多,避免进程竞争 CPU 资源,增加上下文切换的损耗。
二.1、nginx的工作过程
master-worker模型,有一个master进程,管理多个worker模型。master进程和worker进程是父子进程的方式,通过fork的方式创建,master进程可以管理worker内部的内存空间。
nginx的master进程负责启动、停止服务、重载配置文件、平缓升级等,worker进程负责于Client端socket的send和receive。
nginx创建master进程后,会创建一个socket文件句柄,用于listen()在对应端口上,等待客户端发起Connect连接请求(这里用到了epoll多路复用技术),当Client发起请求时,epoll会执行对应的回调函数。
socket建立连接三次握手:首先服务端socket先bind()在80端口,然后监听listen()端口,客户端发起Connect请求连接到80端口,在端口上的进程执行accecpt方法,进行三次握手,连接建立起socket句柄,socket可以实现socket.read()和write()的方法,这个过程就对应了request的read和response的write。
简而言之即是:
- Nginx 启动时,Master 进程,加载配置文件。
- Master 进程,初始化监听的 Socket。
- Master 进程,Fork 出多个 Worker 进程。
- Worker 进程,竞争新的连接,获胜方通过三次握手,建立 Socket 连接,并处理请求
三、协程机制
- 依附于线程的内存模型,切换开销小
一个线程可以有多个协程,不需要cpu切换的开销,只要内存切换。
- 遇阻塞及归还执行权,代码同步
- 无需加锁
四、Nginx三小问
-
当请求端口连接时,worker进程负责执行accept方法,那么有多个worker进程,哪一个会执行?
这里nginx采用的是锁竞争的原理,互斥体,哪个进程先获得锁,就优先执行。
-
执行
sbin/nginx -s reload语句是无缝重启,不会断开连接,原理是什么?sbin/nginx -s reload执行前后master进程不变,worker进程改变执行语句后,master进程发送信号给对应worker进程,要求把所有socket句柄交给master管理,master重启配置文件,生成新的worker进程,将socket句柄交由新的worker进程来管理(内存操作很快),这样就不用再进行客户端和nginx重连接 -
为什么worker进程是单线程,不采用多线程呢?
单线程不涉及线程间的上下文切换和通信,不会造成阻塞,更高效,而因为与client端有epoll多路复用,实现了并发管理。
本文详细探讨了Nginx高性能的原因,包括IO多路复用Epoll机制,如何减少上下文切换损耗,适用于大并发场景;Master-Worker进程模型,解释了其工作流程和优点;以及Nginx为何采用单线程的Worker进程,以避免线程间通信和上下文切换带来的性能损失。
1912

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



