Nginx的事件处理机制

news/2024/7/9 16:07:15 标签: 运维, epoll
Nginx的事件处理机制:
对于一个基本的web服务器来说,事件通常有三种类型,网络事件、信号、定时器。 
首先看一个请求的基本过程:建立连接---接收数据---发送数据 。
再次看系统底层的操作 :上述过程(建立连接---接收数据---发送数据)在系统底层就是读写事件。
1)如果采用阻塞调用的方式,当读写事件没有准备好时,必然不能够进行读写事件,那么久只好等待,等事件准备好了,才能进行读写事件。那么请求就会被耽搁 。阻塞调用会进入内核等待,cpu就会让出去给别人用了,对单线程的worker来说,显然不合适,当网络事件越多时,大家都在等待呢,cpu空闲下来没人用,cpu利用率自然上不去了,更别谈高并发了 。
2)既然没有准备好阻塞调用不行,那么采用非阻塞方式。非阻塞就是,事件,马上返回EAGAIN,告诉你,事件还没准备好呢,你慌什么,过会再来吧。好吧,你过一会,再来检查一下事件,直到事件准备好了为止,在这期间,你就可以先去做其它事情,然后再来看看事件好了没。虽然不阻塞了,但你得不时地过来检查一下事件的状态,你可以做更多的事情了,但带来的开销也是不小的 
小结:非阻塞通过不断检查事件的状态来判断是否进行读写操作,这样带来的开销很大。 
3)因此才有了异步非阻塞的事件处理机制。具体到系统调用就是像select/poll/epoll/kqueue这样的系统调用。他们提供了一种机制,让你可以同时监控多个事件,调用他们是阻塞的,但可以设置超时时间,在超时时间之内,如果有事件准备好了,就返回。这种机制解决了我们上面两个问题。 
epoll为例:当事件没有准备好时,就放入epoll(队列)里面。如果有事件准备好了,那么就去处理;如果事件返回的是EAGAIN,那么继续将其放入epoll里面。从而,只要有事件准备好了,我们就去处理她,只有当所有时间都没有准备好时,才在epoll里面等着。这样,我们就可以并发处理大量的并发了,当然,这里的并发请求,是指未处理完的请求,线程只有一个,所以同时能处理的请求当然只有一个了,只是在请求间进行不断地切换而已,切换也是因为异步事件未准备好,而主动让出的。这里的切换是没有任何代价,你可以理解为循环处理多个准备好的事件,事实上就是这样的。 
4)与多线程的比较:
与多线程相比,这种事件处理方式是有很大的优势的,不需要创建线程,每个请求占用的内存也很少,没有上下文切换,事件处理非常的轻量级。并发数再多也不会导致无谓的资源浪费(上下文切换)。


小结:通过异步非阻塞的事件处理机制,Nginx实现由进程循环处理多个准备好的事件,从而实现高并发和轻量级。 

转载于:https://www.cnblogs.com/wuyida/p/6300932.html


http://www.niftyadmin.cn/n/806352.html

相关文章

数据库优化:索引与SQL语句

索引的使用 索引是数据库优化最常用也是最重要的手段之一, 通过索引通常可以帮助用户解决大多数的MySQL的性能优化问题。 1 验证索引提升查询效率 在我们准备的表结构tb_item 中, 一共存储了 300 万记录; A. 根据ID查询 select * from tb_item wher…

Camel、Pastal、匈牙利标记法

Camel、Pastal、匈牙利标记法 原来我一直用的是Camel标记法……收藏学习了。*/Camel标记法采用首字母小写,接下来的单词都以大写字母开头的方法,如myName。Pastal标记法采用首字母大写,接下来的单词都以大写字母开头的方法,如MyNa…

麒麟子Creator 3D研究笔记—骨骼动画过渡

注意看脚是以从同一点开始的轴上表示的三个或更多个定量变量的二维图表的形式显示多元数据的图形方法。先得说声抱歉,麒麟子之前写过一篇文章《麒麟子Cocos Creator 3D研究笔记五:模型&骨骼动画查看器》, 里面提到说,Cocos Cr…

上传功能

今天是八一节&#xff0c;打起精神&#xff0c;看看园子&#xff0c;发现吴大神的帖子&#xff0c;觉好&#xff0c;转来收藏一下。出处&#xff1a;http://www.cnblogs.com/wu-jian/。也谢谢大神的分享 ^_^. //前台注册控件 <% Register Assembly"MattBerseth.WebCont…

在 Cocos Creator 里画个炫酷的雷达图(附源码)

前言????️雷达图&#xff08;Radar Chart&#xff09; 也称为网络图、星图或蜘蛛网图。是以从同一点开始的轴上表示的三个或更多个定量变量的二维图表的形式显示多元数据的图形方法。适用于显示三个或更多的维度的变量。网上偷的图(侵删)????️雷达图常用于????数…

数据库优化:其余多种优化方式

应用优化 1 使用连接池 对于访问数据库来说&#xff0c;建立连接的代价是比较昂贵的&#xff0c;因为我们频繁的创建关闭连接&#xff0c;是比较耗费资源的&#xff0c;我们有必要建立 数据库连接池&#xff0c;以提高访问的性能。 2 减少对MySQL的访问 2.1 避免对数据进行…

【每日面试】YY直播 Java开发 一面

作者&#xff1a;许y愿 链接&#xff1a;https://www.nowcoder.com/discuss/735887?source_iddiscuss_experience_nctrack&channel-1 来源&#xff1a;牛客网 1、自我介绍 2、常用集合类&#xff0c;然后挑一个熟悉的介绍&#xff08;直接Hashmap&#xff09; 3、JVM垃圾…

盘点JavaScript中数组遍历的全部方式(上篇)

今日鸡汤天生我才必有用&#xff0c;千金散尽还复来。前言JavaScript想必大家都不陌生了&#xff0c;其中的字符串和数组大家经常都会用到&#xff0c;今天就让我们来说说这里面的数组对象的遍历吧&#xff0c;因为遍历经常使用的缘故&#xff0c;所以小编带着大家来解锁遍历的…