1 / 24
文档名称:

Nginx 原理代码分析.doc

格式:doc   页数:24页
下载后只包含 1 个 DOC 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

Nginx 原理代码分析.doc

上传人:xxj16588 2016/6/30 文件大小:0 KB

下载得到文件列表

Nginx 原理代码分析.doc

相关文档

文档介绍

文档介绍:Nginx 原理代码分析 Nginx 原理代码分析时间:2010-12-06 10:07 来源: 互联网作者:网络点击:次 1、剖析 Nginx 等单线程服务器设计原理与性能优势 Nginx 现在正在以光的速度蔓延开来, 他以其稳定性和高性能等众多优点迅速扩大市场, 大家都知道, Nginx 是以单线程为基础的, 那么他怎么能在并发性上取得优势的呢?会不会因为网络阻塞而导致主线程阻塞呢?下面就 1 、剖析 Nginx 等单线程服务器设计原理与性能优势 Nginx 现在正在以光的速度蔓延开来,他以其稳定性和高性能等众多优点迅速扩大市场, 大家都知道, Nginx 是以单线程为基础的, 那么他怎么能在并发性上取得优势的呢?会不会因为网络阻塞而导致主线程阻塞呢?下面就相关问题作一些概念性的阐述。问题的根本在于人们对于计算机处理性能还没有足够的认识, 以及普通的服务器架构简化的处理, 做过大型的成熟服务器的人可能都知道,解决一个系统瓶颈比优化 1000 个算法还重要,这也就是木桶效应, 一个桶能盛水的多少决定于最短的那一块板, 我们之所以在一般的服务器端应用软件中采用一个连接一个线程甚至阻塞在一个线程上的做法, 并不是这个方法是最优秀的, 设计者没有更好的方法, 而是因为这种套路是最简单的, 在概念上以及操作上都比较容易让人理解, 并且容错性也强, 但是对于性能要求极高的服务器比如 dns 或者负载均衡等等, 要求处理速度极快, 并且能有较高的并发性, 这种简单的线程池加连接池的做法就不能解决问题了,比如一个 index 页面请求,他会包含几十个附属资源文件,如果 cilent 网络比较慢, 那么就会较长时间的阻塞这几十个连接, 用户稍微一多服务器就受不了,因为线程的开销是很大的,如果不能得到迅速释放,将会给服务器带来灾难性的后果, 对于公网服务, 这种之后会尤为明显, 很显然,让服务器为客户端的网速买单是愚蠢的做法。那么既然多线程都会存在这样的问题单线程怎么会逃脱的调呢?解决问题的关键在于异步 IO, windows 上有 IOCP (完成端口, 对于一部 IO 包装的比较多,内部实现时用 cpu 个数的线程进行事件处理,他会通知你你给定的异步读写已经完成了), linux 上有 epool( 一个纯事件通知接口,他会通知你可以读或者可以写了) ,如果将所有的请求简化为阻塞操作和非阻塞操作问题就简单了, 所有需要阻塞请求的部分全部由 epool 触发相应事件, 非阻塞( 处理耗时很短) 部分用主线程一直执行, 直到遇到阻塞部分就停止, 交由阻塞部分监听异步完成事件,这样就构成了事件驱动模型。这里比较容易迷惑人的地方是很多人认为函数的处理会阻塞主线程,其实还是上面说的木桶效应,他是不是那块最短的木板,这是需要由测试和经验来决定的,事实是他的处理时间占用很短, 做 100 万次 for 循环说不定比局域网经过一次网络访问的时间还要短, 理解了这点就不难理解了, 如果说你的服务器每秒钟能处理 1 万个请求, 那么在处理功能函数上( 比如解析协议, 操作、输出等等) 顶多也就占用 - 秒, 剩下的时间都是耗时在了网络阻塞上, 耗时在了事件发生上了, 既然如此, 把操作部分独立分出来用多线程执行又有什么意义呢?对于公网就更不用说了,网络等 IO 阻塞才是影响服务器的主要因素,是那块短了的板。对于网络的 IO, IOCP 、 epool 等事件通知机制就解决了这个问题,性能上由于是阻塞的,所以还不如直接 accept 等快,但是对于网络延时很严重的情况下性能反而显得更好, 因为他们可以处理大量的连接而不使性能下降很厉害,如果值直接阻塞能连接处理 100 0 个的话, epool 等就可以同时处理 3-5 万个, 所以实际的应用价值要大得多。剩下的部分就是处理事件发生后的事情上面, 我前面的文章已经作了说明,在此不再重复, Nginx 、 lighttpd 等都是基于这类模型开发的,有兴趣的可以研究一下他的代码。 2、 Nginx 等 web 服务器设计中关于相关注意事项与心得 1) sokcet 和文件 fd 的关闭问题: 看起来这是个简单的问题, 但是正如内存分配和释放一样,这里也是很容易发生问题的一个地方,在做到反向代理的时候遇到了一个新的问题,一个 fd 会伴随这另外的 socket fd, 或者会产生一个文件 fd, 这些描述服在一次服务结尾的时候进行释放是理所当然的,但是是程序就会有异常,这些 fd 很容一在异常处理中被忽略,举例来说,我在处理 keep - aliv e 的长链接的时候就发生了问题,事情是这样的: 一方面不知道用户什么时候关闭连接,第二方面对于一个连接的重用会进行有异于关闭的相关操作, 第三方面, 如果在

最近更新

2024年高三历史教学工作总结15篇[必备] 46页

2024年高一期末考试作文 22页

2024年高一军训周记 13页

2024年骆驼祥子观后感9篇 15页

2024年食堂供货的合同(通用12篇) 34页

2024年飞鸟集读书心得 25页

2024年领导致辞发言稿(通用25篇) 30页

2024年预包装食品采购合同8篇 26页

2024年项目建设合同(15篇) 77页

2024年音体美教研组优秀工作计划 6页

2024年音乐教师工作总结4篇(荐) 11页

2024年青春奋斗大学生演讲稿励志 4页

科普知识竞赛题库及参考答案1套 16页

2023年总经理聘用合同封面十四篇 57页

食品安全法管理知识考试题库及参考答案【最新.. 28页

高等学校教师岗前培训考试暨教师资格笔试题库.. 22页

2024年霸气的个性签名(精选180句) 13页

门面房屋租赁合同电子版 门面房屋租赁合同三年.. 22页

造价咨询公司开业总经理致辞 5页

2024年中职职业院校(学前教育及幼儿心理学)技.. 42页

2024年高校教师岗前培训《高等教育学》题目10.. 23页

信用证结算协议书 12页

文旅项目规划方案(精选10篇) 28页

规范组织关系转接及党员档案审查(ppt) 43页

混凝土护坡施工方案 4页

以旧换新备案申请书[5篇范例] 2页

《WindowsServer2012网络操作系统项目教程(第.. 27页

城镇土地估价规程新 57页

《教育法规教程》第6章预防未成年人犯罪 48页

《GJB 1362A-2016 军工产品定型程序和要求》... 20页