Nginx的异步非阻塞

1. 同步与异步

同步与异步的重点在消息通知的方式上,也就是调用结果通知的方式。
同步:当一个同步调用发出去后,调用者要一直等待调用结果的通知后,才能进行后续的执行。
异步:当一个异步调用发出去后,调用者不能立即得到调用结果的返回。
异步调用,要想获得结果,一般有两种方式:

  1. 主动轮询异步调用的结果;
  2. 被调用方通过callback来通知调用方调用结果。

阻塞和非阻塞

阻塞与非阻塞的重点在于进/线程等待消息时候的行为,也就是在等待消息的时候,当前进/线程是挂起状态,还是非挂起状态。

  • 阻塞阻塞调用在发出去后,在消息返回之前,当前进/线程会被挂起,直到有消息返回,当前进/线程才会被激活
  • 非阻塞非阻塞调用在发出去后,不会阻塞当前进/线程,而会立即返回。

同步与异步,重点在于消息通知的方式;阻塞与非阻塞,重点在于等消息时候的行为。
所以,就有了下面4种组合方式:

  1. 同步阻塞:小明收到信息后,啥都不干,等快递;
  2. 同步非阻塞:小明收到信息后,边刷微博,边等着取快递;
  3. 异步阻塞:小明收到信息后,啥都不干,一直等着快递员通知他取快递;
  4. 异步非阻塞:小明收到信息后,边刷着微博,边等快递员通知他取快递。

I/O多路复用

所谓的I/O复用,就是多个I/O可以复用一个进程。I/O多路复用允许进程同时检查多个fd,以找出其中可执行I/O操作的fd。
系统调用select()和poll()来执行I/O多路复用。在Linux2.6中引入的epoll()是select()的升级版,提供了更高的性能。通过I/O复用,我们可以在一个进程处理大量的并发I/O。

初级版I/O复用

比如一个进程接受了10000个连接,这个进程每次从头到尾的问一遍这10000个连接:“有I/O事件没?有的话就交给我处理,没有的话我一会再来问一遍。”然后进程就一直从头到尾问这10000个连接,如果这10000个连接都没有I/O事件,就会造成CPU的空转,并且效率也很低,不好不好。

那么,如果发明一个代理,每次能够知道哪个连接有了I/O流事件,不就可以避免无意义的空转了吗?为了避免CPU空转,可以引进了一个代理(一开始有一位叫做select的代理,后来又有一位叫做poll的代理,不过两者的本质是一样的)。

升级版I/O复用

select()
select可以同时观察许多流的I/O事件,在空闲的时候,会把当前线程阻塞掉,当有一个或多个流有I/O事件时,就从阻塞态中醒来,于是我们的程序就会轮询一遍所有的流(于是我们可以把“忙”字去掉了)。

select()采用轮询的方式来检查fd是否就绪,当fd数量较多时,性能欠佳。因为从select那里仅仅知道了,有I/O事件发生了,但却并不知道是那几个流(可能有一个,多个,甚至全部),我们只能无差别轮询所有流,找出能读出数据,或者写入数据的流,对他们进行操作。

高级版I/O复用

epoll()
epoll能更高效的检查大量fd,UNIX中提供了类似功能的kqueue调用。
epoll可以理解为event poll,不同于忙轮询和无差别轮询,当连接有I/O流事件产生的时候,epoll就会去告诉进程哪个连接有I/O流事件产生,然后进程就去处理这个事件。此时我们对这些流的操作都是有意义的。(复杂度降低到了O(k),k为产生I/O事件的流的个数,也有认为O(1)的)

Nginx的异步非阻塞

Nginx配置use epoll后,以异步非阻塞方式工作,能够轻松处理百万级的并发连接。

在一个Web服务中,延迟最多的就是等待网络传输。nginx在启动后,会有一个master进程和多个worker进程。master进程主要用来管理worker进程,包含:接收来自外界的信号,向各worker进程发送信号,监控worker进程的运行状态,当worker进程退出后(异常情况下),会自动重新启动新的worker进程。而基本的网络事件,则是放在worker进程中来处理了。在一个请求需要等待的时候,worker可以空闲出来处理其他的请求,少数几个worker进程就能够处理大量的并发。

举例来说:同样的4个进程,如果采用一个进程负责一个request的方式;那么,同时进来4个request之后,每个进程就负责其中一个,直至会话关闭。期间,如果有第5个request进来了。就无法及时反应了,因为4个进程都没干完活呢,因此,一般有个调度进程,每当新进来了一个request,就新开个进程来处理。

nginx不这样,每进来一个request,会有一个worker进程去处理。但不是全程的处理,处理到什么程度呢?处理到可能发生阻塞的地方。比如向后端服务器转发request,并等待请求返回。那么,这个处理的worker不会这么傻等着,他会在发送完请求后,注册一个事件:“如果upstream返回了,告诉我一声,我再接着干”。于是他就休息去了。此时,如果再有request 进来,他就可以很快再按这种方式处理。而一旦上游服务器返回了,就会触发这个事件,worker才会来接手,这个request才会接着往下走。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: "异步非阻塞" 意思是在执行某些操作时,程序不会被阻塞,而是会立即返回,从而可以继续执行其他任务。在 Nginx 中,当它使用异步非阻塞模式时,它可以在等待请求的响应或将请求转发到后端服务器时同时处理其他请求。这可以提高 Nginx 的效率和吞吐量,因为它不会被阻塞,而是可以继续处理其他请求。 ### 回答2: Nginx是一种高性能的Web服务器和反向代理服务器,它的异步非阻塞特性是其核心优势之一。 异步非阻塞是指在Nginx处理客户端请求的过程中,服务器不会阻塞或等待某些操作的完成。相反,它会继续处理其他请求,以提高服务器的并发性能和响应速度。 在传统的阻塞I/O模型中,服务器在等待某些操作(例如读取磁盘数据或与数据库通信)完成之前会处于阻塞状态,无法处理其他请求。这种模型会导致服务器的并发性能受到限制,请求在等待时会出现延迟。 而Nginx采用了异步非阻塞的事件驱动模型。当一个请求到达时,Nginx会将其放入一个事件队列中,然后立即继续处理下一个请求。当之前的请求所需的操作完成时,Nginx会立即处理该请求的结果。这种方式允许服务器同时处理多个请求,提高并发性能。 Nginx异步非阻塞特性使其能够高效地处理大量的并发请求,而无需额外的线程或进程。相比于传统的阻塞I/O模型,Nginx可以更快地响应客户端请求,并且在高负载情况下具有更好的稳定性和可靠性。 总的来说,Nginx异步非阻塞特性使其成为一种高性能的Web服务器和反向代理服务器,能够在处理大量并发请求时效率更高。 ### 回答3: nginx异步非阻塞是指nginx服务器在处理客户端请求时,采用了一种非阻塞的处理方式,可以同时处理多个请求,并且不会因为某个请求的处理时间过长而阻塞其他请求的处理。 具体来说,nginx采用了I/O多路复用技术,通过使用select、poll、epoll等系统调用实现了对多个事件的监听。当有新的事件到达时,nginx会立即处理该事件,而不是等待上一个请求的处理完成。 与传统的阻塞式服务器相比,nginx异步非阻塞方式具有以下优点: 1. 资源利用率高:由于不需要为每个连接创建一个线程,所以可以同时处理大量的并发连接,大大提高了服务器的资源利用率。 2. 响应速度快:由于不会因为某个请求的处理时间过长而阻塞其他请求的处理,所以每个请求的响应速度都可以得到较好的保证。 3. 高并发能力:异步非阻塞使得nginx可以处理大量的并发请求,适用于高并发场景,如Web服务器、反向代理服务器等。 4. 节省资源:相比传统的线程池方式,异步非阻塞的方式不会消耗过多的系统资源,可以在相同的硬件配置下处理更多的请求。 总之,nginx异步非阻塞方式使服务器能够同时处理多个请求,提高了服务器的性能和并发能力,适用于高性能的Web服务器和反向代理服务器等场景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值