详解Nginx高性能的原因

本文详细探讨了Nginx高性能的原因,包括IO多路复用Epoll机制,如何减少上下文切换损耗,适用于大并发场景;Master-Worker进程模型,解释了其工作流程和优点;以及Nginx为何采用单线程的Worker进程,以避免线程间通信和上下文切换带来的性能损失。

Nginx高性能的原因

一、IO多路复用Epoll

在了解Epoll多路复用前我们要了解Java bio模型与Linux select模型

  1. Java bio——阻塞进程式的模型

    bio模型建立在java C/S基础上,客户端和服务端通过socket进行连接,一对一建立,java client只有等socket.write()所有字节流输出到TCP/IP缓存区之后,才返回,如果网络传输很慢,TCP/IP缓冲区被塞满,java client只有等信息传输过去,缓冲区有空间后,才能写入。

  2. Linux select模型——变更触发轮询查询,有1024数量限制

    select模型监听客户端连接的socket,将所有监视的socket加入阻塞队列中,阻塞自己进程,如果有连接收到数据,就遍历整个队列,将该连接移除阻塞队列,加入工作队列中。

    img

    epoll类似于select模型,先将自己阻塞,监听客户端连接,但为了避免select遍历队列,设置回调函数,如果连接发生变化就唤醒自己并直接执行回调函数

    IO多路复用Epoll总结表示:一个 线程,跟踪多个 socket 状态,哪个就绪,就读写哪个;


一.1、IO多路复用Epoll适用的场景

多路复用在单个连接的请求处理速度没有优势,适合 IO 密集型 场景,

  1. 只使用一个线程,处理大量的并发请求,降低上下文环境切换损耗,也不需要考虑并发问题,相对可以处理更多的请求(适用于大并发量);
  2. 消耗更少的系统资源(因为不需要线程调度开销)
  3. 适用于长连接的情况(多线程模式长连接容易造成线程过多,造成频繁调度

二、master worker进程模型

img

  1. **多进程:**一个 Master 进程、多个 Worker 进程。
  2. **Master 进程:**管理 Worker 进程。对外接口:接收外部的操作(信号);对内转发:根据外部的操作的不同,通过信号管理 Worker;**监控:**监控 Worker 进程的运行状态,Worker 进程异常终止后,自动重启 Worker 进程。
  3. **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三小问

  1. 当请求端口连接时,worker进程负责执行accept方法,那么有多个worker进程,哪一个会执行?

    这里nginx采用的是锁竞争的原理,互斥体,哪个进程先获得锁,就优先执行。

  2. 执行sbin/nginx -s reload语句是无缝重启,不会断开连接,原理是什么?

    sbin/nginx -s reload执行前后master进程不变,worker进程改变执行语句后,master进程发送信号给对应worker进程,要求把所有socket句柄交给master管理,master重启配置文件,生成新的worker进程,将socket句柄交由新的worker进程来管理(内存操作很快),这样就不用再进行客户端和nginx重连接

  3. 为什么worker进程是单线程,不采用多线程呢?

    单线程不涉及线程间的上下文切换和通信,不会造成阻塞,更高效,而因为与client端有epoll多路复用,实现了并发管理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值