`
thinkry
  • 浏览: 39532 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

高性能动态Web服务器的一些探讨

阅读更多
现在设计高性能Web网站时,一般都把动态和静态分开处理。静态资源(html/image/js/css/swf)一般使用nginx/lighttpd这类Web服务器,把静态资源缓存到内存或用sendfile,CPU和磁盘IO一般不是瓶颈,性能很高,直接用就行,本文不讨论。

至于动态部分,我们一般使用Apache,用C++编写CGI/FastCGI。FastCGI因为比CGI少了fork和初始化,并发性能和CPU消耗都比CGI要好很多。本质上,FastCGI是一种同步多进程的Server(也有用多线程模式,但对编码要求更高些)。

这种同步模式的并发性能,受限于FastCGI进程数和请求处理时长:假设每个请求100ms处理完,那么1个FastCGI进程每秒能处理10个请求,一台Web服务器假设起100个FastCGI进程,那就是每秒并发1000。比起一般异步Server每秒1万的性能,差了10倍。更重要的是,如果后端服务的接口耗时因异常情况变长时,FastCGI就像是被挂住一样,性能急剧下降,抖动明显。

我看到有些架构设计,把FastCGI只作为接入层,把消息转发给后面的异步业务逻辑Server。这种设计里,业务逻辑异步Server不用解析HTTP,能复用现有的框架和组件;但前面的FastCGI接入层需要知道业务Server的分布,有变动时要同步刷新配置,并且并发性能也受FastCGI进程数限制。

为什么不在异步Server的网络组件里直接支持HTTP协议呢?貌似难度很大,SSL、上传、认证、缓存、压缩、安全性等等,想起来就头大。参照前面把动静分离的思路,让异步Server只处理动态逻辑,简化功能,这样就省事多了。考虑到Web服务器经常出现代码bug导致入侵的漏洞,规划以下功能:
1、支持GET/POST方法
2、支持绑定多域名
3、HTTP Header长度限定
4、HTTP Body长度限定
5、URL长度限定
6、Cookie长度限定
7、支持应用逻辑设定HTTP Header
8、支持长连接模式
......

这样的话,网络组件直接提供HTTP服务,复用了我们在异步Server上的技术积累,也把原来CS模式的框架延伸到了Web领域。
分享到:
评论
24 楼 zxc005 2010-03-16  
thinkry 写道
zxc005 写道
有一点需要考虑,而且是第一时间考虑,那就是带宽。这一条件被满足的前提下其他论证才有讨论的必要。


不是太明白指哪个带宽,我们服务器一般是千兆网卡,IDC出口>1G。


这两种带宽都会产生影响,简单地比方,你的网卡是千兆bps,每个网页体积为20KB,那么系统理论并发值应该小于(1000*1024/s)/(20*8)=6400/s,即使你用大型机处理缓存的html也不会超越这一极限,因为此时,带宽已经成为你的系统性能瓶颈。
23 楼 fxsc 2010-03-16  
http1.0是在一个connection中事同步的吧,1.1部分异步
22 楼 thinkry 2010-03-16  
fxsc 写道
异步模型的话不是类似JMS吗, http协议本质好像是同步阻塞式的


HTTP协议与WebSvr的同异步实现没关系,呵呵
21 楼 fxsc 2010-03-16  
异步模型的话不是类似JMS吗, http协议本质好像是同步阻塞式的
20 楼 thinkry 2010-03-15  
zxc005 写道
有一点需要考虑,而且是第一时间考虑,那就是带宽。这一条件被满足的前提下其他论证才有讨论的必要。


不是太明白指哪个带宽,我们服务器一般是千兆网卡,IDC出口>1G。
19 楼 thinkry 2010-03-15  
mercyblitz 写道
thinkry 写道
mercyblitz 写道
thinkry 写道
不是。fastcgi本质上是多进程同步模型,我的想法是为异步模型增加HTTP支持。按照这样混合使用能平衡性能和开发效率:
·异步模型:性能高,开发复杂度高。适用于访问量大的,业务简单的访问。例如判断是否登录
·同步模型(fastcgi):性能较低,开发复杂度低。适用于逻辑复杂的场景。


你说是AsycWeb吗?


你要用C实现,还是Java呢?


C++实现。在mmog游戏后台的一些Server中,一般能做到1万/秒的并发。当然有些逻辑比较重的主逻辑Server就另当别论了。
感觉现在做游戏后台的人挺多的,开发异步Server也变得平常了,一旦打通异步Server和HTTP之前的障碍,Web服务就能有更高性能了。



我个人不太赞成使用低级别的语言,因此C++不是特别好,利用高并发的编程语言来是实现,加快实现的速度。



视情况而定吧,我完成这个Server会跟大家分享下
18 楼 thinkry 2010-03-15  
smilebug 写道
“IO一般不是瓶颈”这个结论不能苟同,这部分应该是最大的瓶颈
要写一个好的服务器要考虑的东西不少,比如:
如何处理分布式
如何易于扩展
如何利用好多核的CPU资源
如何减少在用户态和内核态之间的切换次数
在不同系统上,甚至不同内核版本之间功能实现的机制差异,以及支持的策略差异,如何调整服务器的动作方式
……
写一个服务器容易,写好一个服务器难啊。当然还是希望LZ能早日写出个好的服务器


对静态websvr来说,磁盘IO一般不是瓶颈,网络IO才是。smilebug觉得呢?我看过一个静态websvr,把文件都cache到内存(有的还要gzip压缩),开个8G内存能满足网站的大部分需求。

你考虑的几点要素,我的意见供参考:
1、如何处理分布式:在设计系统时,会根据业务的不同考虑水平扩展和垂直扩展的能力。例如静态websvr,在各IDC相应部署就行;动态websvr可以通过反向代理,转到主IDC处理;像MMOG,一个区就是一个独立世界,相关机器放一个IDC,不考虑水平扩展等等。

2、如果易于扩展:同1也是在设计整体系统时考虑。

3、如何利用好多核的CPU资源:部署多套是种选择,公司很乐意看到一台机器当多台机器。有些语言和框架的多进程/多线程天然能利用多核,但不是本文讨论的范围。

4、至于内核版本差异问题,我研究不多。个人感觉对网络服务程序,只要支持epoll,差别不大。不知有没有更多信息可参考?

异步svr写起来没同步那么顺手,期待有更好的语言和框架
17 楼 thinkry 2010-03-15  
mryufeng 写道
随便用GO或者Erlang做个web服务器都是C10K以上的并发,不用这么麻烦的,选择好个工具最重要。。。


在我了解的tx的许多服务器都是C/C++开发的,例如dbsvr(架设在mysql前缓读/缓写的svr)、中转svr、游戏逻辑svr,所以选择C++也是比较平滑的方案,毕竟这是个通用组件,不用像产品那样经常迭代。用GO(是google的那个么?)和Erlang总是有些技术风险的,比较适合有相关经验的人和一个小case做试点积累经验。
16 楼 smallratluobin 2010-03-14  
不是很了解,请详细说明。。
15 楼 xiaolin0105 2010-03-13  
ilove2009 写道
各位大牛,我想研究高性能web怎么搞,麻烦指点如果入手,谢谢。


你接触不了这类系统的话就都是纸上谈兵,没戏。根本没必要浪费时间去研究这东西,你搞不来的。

等你接触到了就会知道,不同系统有着不同业务,所用技术软件硬件网络数据库都不一样,解决方案也不会是千篇一律,而是和系统本身高度相关的。
14 楼 zxc005 2010-03-12  
有一点需要考虑,而且是第一时间考虑,那就是带宽。这一条件被满足的前提下其他论证才有讨论的必要。
13 楼 mercyblitz 2010-03-12  
thinkry 写道
haibo 写道
怎么看,感觉你说的这个东东好像有人已经做过了似的,,如果异步Server能每秒1万的性能的话,前端我宁可使用jsp/servlet 服务器,动态多线程,现在服务器的硬件配置都趋向于多核多线程,,应该好好利用才是啊


我对jsp/servlet的性能不了解,呵呵。

我使用的服务器一般是4核,业务一般是单线程单进程异步模式,充分利用CPU,一般划分接入进程、逻辑进程、辅助进程等。网络IO的软中断本身也会耗CPU。如果更多核怎么办?这是后面需要研究的。一个简单的解决方法是把多套服务部署到一台机器上。

至于多线程/多进程,一般是同步模式,逻辑简单,能快速开发,但容易被后端接口阻塞住。我一般用在同步转异步的地方或对性能要求不高的地方。



Servlet3.0的目标之一就是异步Web,不过性能是取决于JDK实现,利用操作系统和硬件平台的特性等等。
12 楼 mercyblitz 2010-03-12  
ilove2009 写道
各位大牛,我想研究高性能web怎么搞,麻烦指点如果入手,谢谢。



协议入手。
11 楼 mercyblitz 2010-03-12  
thinkry 写道
mercyblitz 写道
thinkry 写道
不是。fastcgi本质上是多进程同步模型,我的想法是为异步模型增加HTTP支持。按照这样混合使用能平衡性能和开发效率:
·异步模型:性能高,开发复杂度高。适用于访问量大的,业务简单的访问。例如判断是否登录
·同步模型(fastcgi):性能较低,开发复杂度低。适用于逻辑复杂的场景。


你说是AsycWeb吗?


你要用C实现,还是Java呢?


C++实现。在mmog游戏后台的一些Server中,一般能做到1万/秒的并发。当然有些逻辑比较重的主逻辑Server就另当别论了。
感觉现在做游戏后台的人挺多的,开发异步Server也变得平常了,一旦打通异步Server和HTTP之前的障碍,Web服务就能有更高性能了。



我个人不太赞成使用低级别的语言,因此C++不是特别好,利用高并发的编程语言来是实现,加快实现的速度。

10 楼 ilove2009 2010-03-12  
如何入手    
9 楼 ilove2009 2010-03-12  
各位大牛,我想研究高性能web怎么搞,麻烦指点如果入手,谢谢。
8 楼 smilebug 2010-03-12  
“IO一般不是瓶颈”这个结论不能苟同,这部分应该是最大的瓶颈
要写一个好的服务器要考虑的东西不少,比如:
如何处理分布式
如何易于扩展
如何利用好多核的CPU资源
如何减少在用户态和内核态之间的切换次数
在不同系统上,甚至不同内核版本之间功能实现的机制差异,以及支持的策略差异,如何调整服务器的动作方式
……
写一个服务器容易,写好一个服务器难啊。当然还是希望LZ能早日写出个好的服务器
7 楼 mryufeng 2010-03-11  
随便用GO或者Erlang做个web服务器都是C10K以上的并发,不用这么麻烦的,选择好个工具最重要。。。
6 楼 thinkry 2010-03-10  
haibo 写道
怎么看,感觉你说的这个东东好像有人已经做过了似的,,如果异步Server能每秒1万的性能的话,前端我宁可使用jsp/servlet 服务器,动态多线程,现在服务器的硬件配置都趋向于多核多线程,,应该好好利用才是啊


我对jsp/servlet的性能不了解,呵呵。

我使用的服务器一般是4核,业务一般是单线程单进程异步模式,充分利用CPU,一般划分接入进程、逻辑进程、辅助进程等。网络IO的软中断本身也会耗CPU。如果更多核怎么办?这是后面需要研究的。一个简单的解决方法是把多套服务部署到一台机器上。

至于多线程/多进程,一般是同步模式,逻辑简单,能快速开发,但容易被后端接口阻塞住。我一般用在同步转异步的地方或对性能要求不高的地方。
5 楼 thinkry 2010-03-10  
mercyblitz 写道
thinkry 写道
不是。fastcgi本质上是多进程同步模型,我的想法是为异步模型增加HTTP支持。按照这样混合使用能平衡性能和开发效率:
·异步模型:性能高,开发复杂度高。适用于访问量大的,业务简单的访问。例如判断是否登录
·同步模型(fastcgi):性能较低,开发复杂度低。适用于逻辑复杂的场景。


你说是AsycWeb吗?


你要用C实现,还是Java呢?


C++实现。在mmog游戏后台的一些Server中,一般能做到1万/秒的并发。当然有些逻辑比较重的主逻辑Server就另当别论了。
感觉现在做游戏后台的人挺多的,开发异步Server也变得平常了,一旦打通异步Server和HTTP之前的障碍,Web服务就能有更高性能了。

相关推荐

    nginx高性能web服务器.pdf

    《Nginx高性能Web服务器》是一本深入探讨Nginx技术的权威著作,它涵盖了Nginx的基础知识、配置技巧以及优化策略。Nginx,以其高性能、轻量级和反向代理能力著称,是现代互联网架构中的关键组件。在本资料中,我们将...

    Nginx高性能Web服务器详解.pdf

    《Nginx高性能Web服务器详解》是一本深入探讨Nginx技术的专业书籍,由博文视点出版,电子工业出版社发行。Nginx是一款广泛应用的开源Web服务器,以其高性能、高并发处理能力以及轻量级的特性著称。本书旨在帮助读者...

    Nginx高性能Web服务器详解

    Nginx是一款高性能、轻量级的Web服务器和反向代理服务器,因其高效稳定和出色的并发处理能力而在互联网行业中广泛应用。本章将深入探讨Nginx的架构原理、配置、功能以及如何利用它来构建高性能的Web服务。 一、...

    实战Nginx:取代Apache的高性能Web服务器+张宴.扫描版

    《实战Nginx:取代Apache的高性能Web服务器》是一本深度探讨Nginx技术的书籍,作者张宴通过丰富的实践经验和深入的技术解析,为读者揭示了Nginx作为高性能Web服务器的优势及其应用策略。这本书主要涵盖了以下几个...

    实战Nginx取代Apache的高性能Web服务器.rar

    《实战Nginx取代Apache的高性能Web服务器》一书,主要探讨了如何利用Nginx这一现代、高性能的Web服务器来替代传统的Apache服务器,以提升网站的运行效率和响应速度。Nginx以其异步非阻塞的I/O模型、模块化设计以及...

    nginx高性能web服务器详解

    **Nginx高性能Web服务器详解** Nginx是一款开源、高性能、轻量级的Web服务器/反向代理服务器,广泛应用于互联网和企业级应用中。它的设计目标是高并发、低内存占用,使得Nginx在处理静态内容和作为反向代理时表现...

    [实战Nginx_取代Apache的高性能Web服务器].张宴.扫描版-new2

    ### 实战Nginx:取代Apache的高性能Web服务器 #### Nginx简介 Nginx是一款轻量级的Web服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,由俄罗斯的程序设计师Igor Sysoev所开发。自2004年公开发布以来,...

    实战Nginx:取代Apache的高性能Web服务器

    Nginx是一款高性能的Web服务器,它以其高效、稳定和低资源消耗而闻名,常被用作替代Apache的解决方案。本篇文章将深入探讨Nginx的特性、优势以及如何在实际环境中部署和配置Nginx。 一、Nginx的特点与优势 1. 异步...

    实战Nginx:取代Apache的高性能Web服务器.

    Nginx是一款高性能、轻量级的Web服务器和反向代理服务器,因其高效稳定和低内存占用而备受青睐。在互联网行业中,Nginx经常被用来替代传统的Apache服务器,以应对高并发访问和大型网站的需求。本教程将深入探讨Nginx...

    实战Nginx搭建高性能Web服务器

    本教程将深入探讨如何通过实战来搭建一个基于Nginx的高性能Web服务器。 首先,我们需要了解Nginx的工作原理。Nginx采用事件驱动的异步非阻塞模型,能够高效地处理大量并发连接,这得益于其多进程架构。主进程主要...

    实战Nginx(取代Apache的高性能Web服务器).pdf

    《实战Nginx:取代Apache的高性能Web服务器》是一本深度探讨Nginx技术的书籍,旨在帮助读者理解和掌握如何利用Nginx构建高效、稳定且可扩展的Web服务环境。Nginx作为一款轻量级、高性能的HTTP和反向代理服务器,近年...

    高性能并发Web服务器实现核心内幕

    首先,书中提到,高性能Web服务器的实现不仅仅是对Apache、Lighttpd或Nginx等现有开源服务器源代码的研究,而是要理解其背后的理论基础和通用代码。这包括网络IO的基础操作,如`read()`和`write()`函数,它们在...

    实战Nginx取代Apache的高性能Web服务器_文字版

    本实战指南旨在探讨如何通过Nginx实现高性能的Web服务,以提升网站的响应速度和稳定性。 一、Nginx与Apache的性能对比 1. 并发处理:Nginx采用异步非阻塞I/O模型,可以同时处理大量并发请求,而Apache则采用多进程...

    Nginx高性能Web服务器详解.rar

    本资源“Nginx高性能Web服务器详解.rar”将深入探讨Nginx的核心特性、配置技巧以及在实际应用中的最佳实践。 一、Nginx简介 Nginx由俄罗斯开发者Igor Sysoev于2002年开发,其设计目标是解决高并发问题,提供低延迟...

    实战Nginx取代Apache的高性能Web服务器

    "实战Nginx取代Apache的高性能Web服务器"这个主题,旨在探讨如何利用Nginx替换Apache来实现更高效的Web服务。Nginx以其高性能、低内存占用和强大的反向代理能力而闻名,这使得它成为许多大型网站和高流量应用的首选...

Global site tag (gtag.js) - Google Analytics