网络服务的两种处理模型 Nginx为什么比Apache好

任何一个任务都可以分解为三个要素,即“谁”“什么时间””干什么“。如果我们把这三个要素画在一个笛卡尔坐标系中,就显得很有意思了:

我以单CPU多任务操作系统为例,来看一个简单的Web服务是如何映射到上图的:

一般情况下都是按照上图处理的。每来到一个连接,便会新建一个进程或者线程单独服务那个连接,连接结束后,进程或者线程随即销毁。

??然而,鉴于进程/线程的创建会有比较可观的系统开销,所以说一般会预创建比较多的进程或者线程,然后为新建的连接分配一个即可,连接结束后进程或者线程便回到空闲资源池中了。

??显然,这种优化会大大降低进程,线程的创建,销毁的开销,我们知道这种开销主要集中于数据结构的分配与回收,内核基础设施的刷新等。再看上图,可以看得出,每一个进程就像一块板子一样插在Who,When,What构成的立方体中,这就好像热插拔刀片服务器一般,当然这里只是比喻,我想呈现的事情是,即便是刀片的插拔也是有昂贵开销的。

??除了刀片插拔的开销,还有另外一种开销,那就是切换的开销,这里就不具体展开了,一般人都知道进程,线程切换所要付出的操作系统级别的代价。

??特别是当同时在线的连接数据巨大的时候,比如10万量级,就意味着有10万量级的进程或者线程要在单一的系统中频繁切换…怎么办?



按照能量守恒定律,只要CPU维持100%的运转,它单位时间内完成的工作量就是一定的,想最大化吞吐最好的办法就是只要让干一件事,而不是搞多个任务频繁切换。我们知道多任务分时调度只是一种假象,代价是切换开销引起的吞吐量降低,收益是高品质低时延的交互性。使用Linux的都知道,一般情况下,服务器的内核HZ都是100或者250,而桌面系统的内核HZ都是1000,这意味着对于服务器而言,吞吐相比交互的响应性更重要,理解了这个例子,就能理解我接下来要说的了。



还记得我曾经大力推崇的nf-HiPAC,以及我自己设计的DxRPro++,iptables规则优化等故事里关于优化的根本原则吗?就是换一种切法。好吧,这次我们把Web服务器处理单条连接的整个处理流程切分成两个部分,而不再按照连接来切分,看看能不能避免创建多个进程或者线程。

??先上图再解释:

非常Perfect!

??整个系统就只有两个进程,一个进程处理所有的新建连接,另一个进程处理真正的HTTP逻辑,换了一种切分方法,意味着只需要两个进程就够了,就这样,切换开销完美避免。在这里,其实还可以说得更多。

??首先,连接管理进程依靠Linux内核中高效的epoll机制可以非常好的应对海量新建连接,毕竟该进程只是把新建连接pendding给后面的逻辑处理进程,所以处理是非常高效的,通过pendding可以把对CPU的时间要求转换为内存的空间要求,这正是换一种切法带来的直接收益。

??其次,如果你怀疑连接处理进程能否真正应对海量新建连接,那么你可以了解一下泊松分布的知识,新建连接分布是一个泊松分布,它并不是持续海量,你的系统只需要调优到其到达率的数学期望值稍高一点就足够了!当然,如果遇到了DDoS,那便可以另说,我有专门讨论DDoS的文章,本文不说这个。

??另外,我说一点,其实上面两个图正是体现了Apache和Nginx之间的区别。

??Nginx为什么比Apache在应对高并发是表现更好?其实就用因为其独立的异步的事件处理,当一个连接处理进入IO等待的时候进程并不阻塞,同一个进程就可以去处理别的连接,这就大大减小了系统进程的数量,从而净节省了系统开销。如果让Apache去应对泊松分布的连接到达,那就只能寄希望于内核了…当然,Apache也有优点,就是它的编程模型以及可扩展模块。

??经理喜欢Apache,极客喜欢Nginx。

??如果有时间,我会把上面关于“谁”“什么时间””干什么“的模型的玩法全部展示一遍,比如它的高度代表什么,它的宽度和厚度分别代表什么等等,另外如果是多个CPU,这个图又该怎么画…是不是在多CPU系统中,又要再加一个H呢?这样就成了“谁”“什么时间”在哪里”干什么“(Who,When,Where,What)了。

??周五上午走了7公里健步行,微信运动统计步数正常一万步左右吧,然而我通过摇手机的方式为我们团队平均成绩增加了近900步…第二天醒来手有点酸…这就是teamwork吧,唉。可能是因为上周《龙珠超》停播了一周,然后我就改看《古惑仔》了吧,前者都是单打独斗,后者就是teamwork了,也就学会了?嗯,也是,反正周五跟同事们一起喝完酒是比自己喝完酒爽很多的…

————–勘误与补遗————–

王姐姐如是说:Nginx并不比Apache好,Apache适合做服务器,而Nginx只适合做代理。不过确实如此。

再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow

原文地址:https://www.cnblogs.com/ksiwnhiwhs/p/10390550.html

时间: 2024-10-15 09:34:14

网络服务的两种处理模型 Nginx为什么比Apache好的相关文章

JMS两种消息模型

前段时间学习EJB,接触到了JMS(Java消息服务),JMS支持两种消息模型:Point-to-Point(P2P)和Publish/Subscribe(Pub/Sub),即点对点和发布订阅模型. 个人觉得这两个模型挺容易理解的,因为生活中的例子还挺多的. 1,  P2P模型 有以下概念:消息队列(Queue).发送者(Sender).接收者(Receiver).每个消息都被发送到一个特定的队列,接收者从队列获取消息.队列保留着消息,直到它们被消费或超时. (1) 每个消息只有一个消费者(Co

Android四大组件之服务的两种启动方式详解

Service简单概述 Service(服务):是一个没有用户界面.可以在后台长期运行且可以执行操作的应用组件.服务可由其他应用组件启动(如:Activity.另一个service).此外,组件可以绑定到服务,以与之进行交互,甚至是执行进程间通信 (IPC).例如:服务可以处理网络事务.播放音乐,执行文件 I/O 或与内容提供程序交互,而这一切均可在后台进行. 进程的优先级 了解进程的优先级可以帮助你理解服务~ 1. Foreground process(前台进程) 一句话总结:当前跟用户有交互

打开网络适配的两种方法

打开网络适配有两种方法 第一种是在Info.plist文件里添加XML代码 具体步骤:右击Info.plist文件 选择Open As里面的Source Code 然后在文件底部插入下面代码 [html] view plain copy <key>NSAppTransportSecurity</key> <dict> <key>NSAllowsArbitraryLoads</key> <true/> </dict> 第二种

css的两种盒子模型

css的两种盒子模型:W3C标准盒子模型.IE盒子模型 两者的相同之处:都包含margin.border.padding.content 两者的不同之处:W3C标准盒子模型的content部分不包含其他部分:IE盒子模型的content部分包含border.padding部分. 举例说明:一个盒子模型margin为10px,border为2px,padding为5px,content为100px,高为50px. 1.W3C标准盒子模型 盒子需要占据的位置:宽10*2+2*2+5*2+100=13

DIV+CSS两种盒子模型(W3C盒子与IE盒子)

在辨析两种盒子模型之前,先简单说明一下什么叫盒子模型. 原理: 先说说我们在网页设计中常听的属性名:内容(content).填充(padding).边框(border).边界(margin), CSS盒子模式都具备这些属性. 这些属性我们可以把它转移到我们日常生活中的盒子(箱子)上来理解,日常生活中所见的盒子也就是能装东西的一种箱子,也具有这些属性,所以叫它盒子模式. 特点: 每个盒子都有:边界.边框.填充.内容四个属性: 每个属性都包括四个部分:上.右.下.左:这四部分可同时设置,也可分别设置

最常见的两种防御模型|安全千字文系列2

为了保证系统的机密性.可靠性.稳定性,我们要围绕系统的核心建立一些防御措施,最常见的防御措施模型有两种,分别被描述为棒棒糖和洋葱. 棒棒糖模型 最常见的防御模型被称为便捷安全,也就是围绕有价值的对象建立一个屏障,这个屏障可以是逻辑上的也可以是物理的.很多机构都会选择采用这样的防御模式,比如断绝企业内网与英特网的连接,或者在内外网的交界处放置防火墙,或者有些企业在网络边界上设置认证服务器等. 这样的防御方式,就像一个棒棒糖一样,外层是保护屏障,中心是被保护的信息. 这种模型的好处很明显,就是物料成

两种方法设置nginx并发限制下面的白名单策略

前言: 今天,公司主站突然出现IDE创建应用没反应的问题,经过预发布环境.非代理环境下面的服务测试,均没有问题,定位问题出现在前端.而我们前端有两层代理,一是青松抗D系统,一是我们自己的nginx代理系统.通过web页面测试发现控制台曝出下面的错误: 503 Service Temporarily Unavailable 那么可以断定的确是nginx这一层出现了问题.想想以前的nginx的配置修改及青松系统的接入,找到如下原因: 1. nginx设置单个IP的访问次数: limit_req_zo

CSS3 常用属性(三)-- 用户界面、文字、两种盒模型

用户界面--column 关于用户界面,我们先了解一下在块元素中写文字时,浏览器中的呈现情况,这个其实很明显,所有的文本内容会在块元素内从左到右一个个字排列,排满后,从上到下一排排渲染--然而,有些时候,页面需求的呈现方式是,类似于报纸似得,将一段文本内容,分成多列布局显示. 用户界面使用的示例如下: .font{ width:300px; height:300px; border:1px solid #000; margin:0px auto; column-count:3; /* 定义数量

CSS两种盒子模型

盒子模型有两种,分别为标准 W3C 盒子模型和 IE 盒子模型.他们对盒子模型的解释各不相同. 我们先来看熟悉的标准 W3C 盒子模型: 从上图可以看出,标准 W3C 盒子模型的范围包括 margin.border.paddding.content,并且 content 宽度计算不包括其他部分. 再来看 IE 盒子模型: 从上图可以看到 IE 盒子模型的范围也包括 margin.border.paddding.content,不同的是,content 宽度计算包含了 border 和 paddd