导入
Nginx的处理IO的方式是异步非阻塞。Nginx之所以高性能除了异步非阻塞之外,还有一个核心的原因:IO复用。
什么是IO复用?
从最简单的例子说起,一个请求连接来了之后,一般情况下是怎么处理请求的呢? 如图1所示
浏览器的每次请求都会分配或者新启一个进程与之对应,去处理请求。进程上下文之间的切换和新启进程都会很浪费资源,怎么优化呢?(举手)把多进城变成多线程。 那么就有了如下图2的优化结果。
这么做有啥不好呢?在思考一下,线程是进程调度的最小单位,一个进程有多个线程在同时处理请求,那么如果这个进程因为异常情况意外终止了,那么它所拥有的所有的线程都将全部终止运行,换句话说,服务挂了。哈哈,好刺激。
那么IO复用派上用场了~~前面我们提到了异步非阻塞,那么我们这样来设计,我们设计一个进程池、事件响应守护进程、请求服务进程。那么,我们的服务器的进程架构如下图所示:
如上图,我们将服务器分成了三个模块:
当浏览器请求到达服务器之后,首先连接到(3)请求服务进程,并注册一个事件,当请求发送数据的时候,这个时候会产生一个读事件,这个时候会有(2)事件响应进程会响应,将事件交给(1)进程池处理,同时再注册一个写事件。当进程池将请求处理完成之后,会响应写事件将处理的结果返回给浏览器。
那么IO复用所复用的是什么呢?
IO复用就是用一个进程来响应真实的请求事件。本质上复用的是进程。
Select与Epoll
当有读写事件发生了,事件守护进程响应交给进程池处理,同时再注册一个写事件,但是进程池怎么知道是哪个socket有事件发生了呢?所以每次有事件发生的时候,事件响应进程就会遍历一下所有的socket连接句柄,判断一下是否有事件发生,这种响应事件的方式就被称为Select模型。
怎么去优化呢?如果每次有事件发生,如果能知道是确切的哪个socket连接的事件,效率就很高了,这样方式就是Epoll模型。 举个例子
从大的方面了解一个高性能的服务器演化的过程,总结一下:池的概念会很大的提高性能,本次说到的是进程池,改成线程池(其实是多进程多线程模式)也是一样。
扩展:引入池的优化手段,很常见。例如,数据库连接池等等。感兴趣的可以查一下。
下一篇会继续从细节上介绍,事件响应的两种方式:
戴尔的支持服务于2008年首次推出ProSupport服务,市场的反应使其成为一项备受好...
如今,越来越多的企业在业务场景是使用 Elasticsearch(下文统一称为 ES) 存储自...
1.曾经爱过你的人,前世一定和你有缘,不要语言虐待。如果他今生真的负你了,那...
各公司都希望在适应新的工作、员工管理和客户服务方式的同时,尽可能地抓住所有...
被业界誉为CAE领域的奥斯卡盛会第十五届中国CAE工程分析技术年会,于8月17-18 在...
也许许多工作员会觉得新建站时只必须网站空间或是VPS就就行了,但在事实上并非那...
缓存误用 缓存,是互联网分层架构中,非常重要的一个部分,通常用它来降低数据库...
在没有SpringBoot内嵌有Tomcat之前,我们都是将项目打为War包放在Tomcat的webapp...
智能化大潮风起云涌,行业的智能化转型升级正在成为中国经济新旧动能转换的核心...
对于很多客户来说,都会误以为高防服务器安全性足够高,不需要进行过多的安全手...