温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Nginx服务器的高性能原理IO复用介绍

发布时间:2021-08-31 09:36:45 来源:亿速云 阅读:158 作者:chen 栏目:服务器

这篇文章主要讲解了“Nginx服务器的高性能原理IO复用介绍”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Nginx服务器的高性能原理IO复用介绍”吧!

导入

Nginx的处理IO的方式是异步非阻塞。Nginx之所以高性能除了异步非阻塞之外,还有一个核心的原因:IO复用。

什么是IO复用?

从最简单的例子说起,一个请求连接来了之后,一般情况下是怎么处理请求的呢? 如图1所示

Nginx服务器的高性能原理IO复用介绍

浏览器的每次请求都会分配或者新启一个进程与之对应,去处理请求。进程上下文之间的切换和新启进程都会很浪费资源,怎么优化呢?(举手)把多进城变成多线程。  那么就有了如下图2的优化结果。

Nginx服务器的高性能原理IO复用介绍

这么做有啥不好呢?在思考一下,线程是进程调度的最小单位,一个进程有多个线程在同时处理请求,那么如果这个进程因为异常情况意外终止了,那么它所拥有的所有的线程都将全部终止运行,换句话说,服务挂了。哈哈,好刺激。

那么IO复用派上用场了~~前面我们提到了异步非阻塞,那么我们这样来设计,我们设计一个进程池、事件响应守护进程、请求服务进程。那么,我们的服务器的进程架构如下图所示:

Nginx服务器的高性能原理IO复用介绍

如上图,我们将服务器分成了三个模块:

  1. 进程池

  2. 事件响应

  3. 事件注册

当浏览器请求到达服务器之后,首先连接到(3)请求服务进程,并注册一个事件,当请求发送数据的时候,这个时候会产生一个读事件,这个时候会有(2)事件响应进程会响应,将事件交给(1)进程池处理,同时再注册一个写事件。当进程池将请求处理完成之后,会响应写事件将处理的结果返回给浏览器。

那么IO复用所复用的是什么呢?

IO复用就是用一个进程来响应真实的请求事件。本质上复用的是进程。

Select与Epoll

当有读写事件发生了,事件守护进程响应交给进程池处理,同时再注册一个写事件,但是进程池怎么知道是哪个socket有事件发生了呢?所以每次有事件发生的时候,事件响应进程就会遍历一下所有的socket连接句柄,判断一下是否有事件发生,这种响应事件的方式就被称为Select模型。

怎么去优化呢?如果每次有事件发生,如果能知道是确切的哪个socket连接的事件,效率就很高了,这样方式就是Epoll模型。 举个例子

  • 假如餐馆有人要结账,服务员就跟老板说一声:“有人要结账”,老板不知道是哪一桌要结账,就需要挨个问一遍,这样的方式就是select,时间复杂度O(n)。

  • 假如餐馆有人要结账,服务员就跟老板说一声:“5号桌要结账”,这样的方式就是epoll,时间复杂度O(1)。

从大的方面了解一个高性能的服务器演化的过程,总结一下:池的概念会很大的提高性能,本次说到的是进程池,改成线程池(其实是多进程多线程模式)也是一样。

感谢各位的阅读,以上就是“Nginx服务器的高性能原理IO复用介绍”的内容了,经过本文的学习后,相信大家对Nginx服务器的高性能原理IO复用介绍这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是亿速云,小编将为大家推送更多相关知识点的文章,欢迎关注!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI