【Nginx】Nginx高性能的原因

1、epoll多路复用模型

在epoll模型出现之前,java使用的模型有java bio模型和linux select模型。

java bio模型如下图所示:
java bio模型
当client与server传输数据时,需要client与server建立socket长连接,然后用socket.write向tcp/ip缓冲区中写入数据,client端只有当write将所有的数据写入tcp/ip缓冲区后才会返回。在这种模型下如果因为网络原因,数据传输缓慢,write就得等待缓冲区中的数据传输过去后才能继续向缓冲区中写入数据,因此client端的返回也会变得缓慢(通俗点讲的阻塞)。

linux select模型如下图所示:
linux select模型
在linux select模型下,客户端会先阻塞自己然后监听100个客户端连接(假设有100个客户端连接着),当有连接状态发生改变时,server会唤醒自己然后遍历100个连接,找出其中发生改变的一个或多个连接然后执行read操作。
这种模型相对java bio模型的优点是:当server程序被唤醒时,必定是有连接的状态发生了改变,意味着缓冲区中有数据可以读或者有空间可以写,因此唤醒后不用等待。但是缺点也很明显,就是在有很多个客户端连接着的情况下每次都要遍历上千个连接,这种操作是非常耗时的。

epoll模型如下图:
epoll模型
同样假设有100个客户端连接,在epoll模型下,server会监听100个连接并且设置回调函数,当连接发生变化时,会直接将自己唤醒,并且执行回调函数。这样一来就不用每次都去遍历100个连接,节省了时间消耗。

2、master worker进程模型

master-worker模型如下图所示:
master-worker模型
当我们启动nginx时,会先启动一个master进程,该进程根据配置文件生成一定数量的子进程worker,由于是子进程,master跟各个worker进程共享内存空间。此后master只接收管理员的信号和监听网络端口,当网络端口中有连接请求时,根据epoll模型,master会唤醒自己并调用回调函数,将建立连接的操作交给worker执行,各个worker会去争抢一个accept的锁,由抢到该锁的worker执行建立连接的操作。同时worker也是基于epoll模型,当有连接发生变化时会唤醒自己并执行read或write操作。
由于worker是master的子进程,因此master可以享有worker的内存空间,当worker进程死亡时master会获取worker进程的所有数据然后重新生成一个worker进程并回复数据。
nginx的无缝重启操作也是基于这个原理,重启时master并不重启,重启的只是worker进程。

3、协程机制

协程是线程的内存模型,协程的切换开销非常的小,因为切换协程时不用切换cpu,只用切换内存。
nginx的worker是单线程工作的,worke上有多个连接,当连接发生阻塞时,worker只需要切换协程,而协程的切换开销比线程小得多,因此即使worker是单线程的它也能高效的处理多个连接。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值