(转)剖析nginx等单线程服务器设计原理与性能优势

标签: nginx 单线程 服务器 | 发表时间:2011-12-14 23:55 | 作者:司徒正美
出处:http://www.cnblogs.com/rubylouvre/

nginx现在正在以光的速度蔓延开来,他以其稳定性和高性能等众多优点迅速扩大市场,大家都知道,nginx是以单线程为基础的,那么他怎么能在并发性上取得优势的呢?会不会因为网络阻塞而导致主线程阻塞呢?下面就相关问题作一些概念性的阐述。

问题的根本在于人们对于计算机处理性能还没有足够的认识,以及普通的服务器架构简化的处理,做过大型的成熟服务器的人可能都知道,解决一个系统瓶颈比优化 1000个算法还重要,这也就是木桶效应,一个桶能盛水的多少决定于最短的那一块板,我们之所以在一般的服务器端应用软件中采用一个连接一个线程甚至阻塞 在一个线程上的做法,并不是这个方法是最优秀的,设计者没有更好的方法,而是因为这种套路是最简单的,在概念上以及操作上都比较容易让人理解,并且容错性 也强,但是对于性能要求极高的服务器比如dns或者负载均衡等等,要求处理速度极快,并且能有较高的并发性,这种简单的线程池加连接池的做法就不能解决问 题了,比如一个index页面请求,他会包含几十个附属资源文件,如果cilent网络比较慢,那么就会较长时间的阻塞这几十个连接,用户稍微一多服务器 就受不了,因为线程的开销是很大的,如果不能得到迅速释放,将会给服务器带来灾难性的后果,对于公网服务,这种之后会尤为明显,很显然,让服务器为客户端 的网速买单是愚蠢的做法。

那么既然多线程都会存在这样的问题单线程怎么会逃脱的调呢?解决问题的关键在于异步IO,windows上有IOCP(完成端口,对于一部IO包装的比较 多,内部实现时用cpu个数的线程进行事件处理,他会通知你你给定的异步读写已经完成了),linux上有epool(一个纯事件通知接口,他会通知你可 以读或者可以写了),如果将所有的请求简化为阻塞操作和非阻塞操作问题就简单了,所有需要阻塞请求的部分全部由epool触发相应事件,非阻塞(处理耗时 很短)部分用主线程一直执行,直到遇到阻塞部分就停止,交由阻塞部分监听异步完成事件,这样就构成了事件驱动模型。

这里比较容易迷惑人的地方是很多人认为函数的处理会阻塞主线程,其实还是上面说的木桶效应,他是不是那块最短的木板,这是需要由测试和经验来决定的,事实 是他的处理时间占用很短,做100万次for循环说不定比局域网经过一次网络访问的时间还要短,理解了这点就不难理解了,如果说你的服务器每秒钟能处理1 万个请求,那么在处理功能函数上(比如解析协议,操作、输出等等)顶多也就占用0.1-0.3秒,剩下的时间都是耗时在了网络阻塞上,耗时在了事件发生上 了,既然如此,把操作部分独立分出来用多线程执行又有什么意义呢?对于公网就更不用说了,网络等IO阻塞才是影响服务器的主要因素,是那块短了的板。

对于网络的IO,IOCP 、epool等事件通知机制就解决了这个问题,性能上由于是阻塞的,所以还不如直接accept等快,但是对于网络延时很严重的情况下性能反而显得更好, 因为他们可以处理大量的连接而不使性能下降很厉害,如果值直接阻塞能连接处理1000个的话,epool等就可以同时处理3-5万个,所以实际的应用价值 要大得多。

剩下的部分就是处理事件发生后的事情上面,我前面的文章已经作了说明,在此不再重复,nginx 、lighttpd等都是基于这类模型开发的,有兴趣的可以研究一下他的代码。

作者: 司徒正美 发表于 2011-12-14 23:55 原文链接

评论: 0  查看评论  发表评论


最新新闻:
· 2011年,身在互联网的你收获几何?(2011-12-14 23:10)
· 苹果在移动芯片领域大幅领先Intel(2011-12-14 23:07)
· Google给大学生的建议:没有这16个产品你会失败(2011-12-14 23:06)
· 2011年网络和IT行业的25个重大新闻(2011-12-14 23:04)
· 高盛发布研究报告看空雅虎(2011-12-14 22:53)

编辑推荐: 结合领域驱动设计的SOA分布式软件架构

网站导航: 博客园首页   我的园子   新闻   闪存   博问   知识库

相关 [nginx 单线程 服务器] 推荐:

(转)剖析nginx等单线程服务器设计原理与性能优势

- - 博客园-Ruby's Louvre
nginx现在正在以光的速度蔓延开来,他以其稳定性和高性能等众多优点迅速扩大市场,大家都知道,nginx是以单线程为基础的,那么他怎么能在并发性上取得优势的呢. 会不会因为网络阻塞而导致主线程阻塞呢. 下面就相关问题作一些概念性的阐述. 那么既然多线程都会存在这样的问题单线程怎么会逃脱的调呢. 对于公网就更不用说了,网络等IO阻塞才是影响服务器的主要因素,是那块短了的板.

浅谈web服务器—Nginx

- - CSDN博客推荐文章
常见的web服务器有apache,Nginx,lighttpd等. 但Nginx作为一款高性能的Http和反向代理服务器,由于其高效率、简配置等优势在业内被广泛使用. 目前Taobao、新浪、赶集网、金山、豆瓣网、网易新闻等众多知名互联网企业的服务器都是采用Nginx. 根据url的不同,将HTTP请求转发到后端的应用服务器集群.

RTMP 流媒体服务器 GitHub - arut/nginx-rtmp-module: NGINX-based Media Streaming Server

- -
几个优秀的RTMP 流媒体服务器:. NGINX-based Media Streaming Server:基于Nginx插件. SRS(Simple RTMP Server) over state-threads:基于C++. livego:基于go语言. node-rtsp-rtmp-server:基于 Node.js.

实现了一个比nginx速度更快的HTTP服务器

- jyf1987 - 博客园-clowwindy的杂草牧场
在上次的FreeBSD和linux的nginx静态文件性能对比测试 后,我萌发了自己动手做一个简单的Web Server来搞清楚nginx高性能背后的原理的想法. 最后成功实现了一个基于epoll的简单的HTTP服务器,实现了200,404,400,304响应,并且性能比nginx高了一点点. 本文主要介绍这个HTTP服务器的原理和设计过程.

Nginx 1.1.2 发布,轻量级Web服务器

- lastland - cnBeta.COM
Nginx(发音同 engine x)是一款在BSD-like协议下发行的轻量级的Web服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器. 由俄罗斯的程序设计师 Igor Sysoev所开发,最初供俄国大型的入口网站及搜寻引擎Rambler(俄文:Рамблер)使用. Nginx特点是占有内存少,并发能力强,事实上 Nginx的并发能力确实在同类型的网页服务器中表现较好.

[nginx] 淘宝网Web服务器Tengine正式开源

- - 开心平淡对待每一天。热爱生活
     下载地址:  http://tengine.taobao.org/download_cn.html. 今年的世纪光棍节上,购物狂欢开始的第一分钟,近350万网民疯狂涌入淘宝、淘宝商城购物,仅10分钟不到就创造了10亿元的订单交易,其背后的服务器平台,成功Hold得住了迅猛凶悍的流量冲击,然而此时,支付宝连接的各大网银网站纷纷倒下.

[转]三大WEB服务器对比分析 (apache ,lighttpd,nginx)

- - junecauzhang的专栏
阿呆软件工作室 › 编程资料 › 转载文章 › 三大WEB服务器对比分析 (apache ,lighttpd,nginx). 三大WEB服务器对比分析 (apache ,lighttpd,nginx). 一.软件介绍(apache   lighttpd  nginx). Lighttpd是一个具有非常低的内存开销,cpu占用率低,效能好,以及丰富的模块等特点.

20个Nginx Web服务器最佳安全实践

- - Gsion's Blog
Nginx是一个轻量级,高性能的Web服务器/反向代理和电子邮件代理(IMAP/POP3),它可以运行在UNIX,GNU/Linux,BSD变种,MAC OS X,Solaris和Microsoft . 根据Netcraft的调查数据显示,互联网上6%的域名都使用了Nginx Web服务器. Nginx是解决C10K问题的服务器之一,与传统服务器不一样,Nginx不依赖于线程处理请求,相反,它使用了一个更具扩展性的事件驱动(异步)架构.

nginx tomcat负载均衡,同一服务器下多域名转发

- - ITeye博客
用nginx进行同一个服务器下多域名的负载均衡配置. Nginx进行http负载均衡的模块是upstream. Upstream可以进行多个配置,这样的话可以灵活的配置站点,但是注意的是upstream后面的名字最好是配置成为域名,因为upstream是进行http访问的,一般的解析没有问题,但是如果是ajax的解析就会通过访问upstream后面的名字来进行访问了,这里要注意.

用nginx搭建基于rtmp或者http的flv、mp4流媒体服务器

- - 开源软件 - ITeye博客
这种方式要下载FLV视频文件到本地播放,一旦FLV视频文件下载完成,就不会消耗服务器的资源和带宽,但是拖动功能没有RTMP/RTMP流媒体方式强大,很多视频网站都是用HTTP方式实现的,如:YouTube,土豆,酷6等. 2、  RTMP/RTMP流媒体方式. 这种方式不用下载FLV视频文件到本地,可以实时的播放flv文件,可以任意拖拽播放进度条,但是比较消耗服务器的资源.