`
thinkry
  • 浏览: 38500 次
  • 性别: 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:取代Apache的高性能Web服务器

    Nginx作为新兴的Web服务器,目前的发展势头迅猛,已经在众多知名网站的各项产品中取代Apache。但是,Nginx相关的中文资料却比较欠缺,目前还没有关于Nginx服务器的任何书籍,这也使得一些朋友对于是否采用Nginx取代...

    高性能高并发服务器架构大全

     Lighttpd+Squid+Apache搭建高效率Web服务器 9  浏览量比较大的网站应该从哪几个方面入手? 17  用负载均衡技术建设高负载站点 20  大型网站的架构设计问题 25  开源平台的高并发集群思考 26  大型...

    毕业论文-于基龙芯2f平台的web服务器性能测试设计.doc

    因此,本文旨在探讨龙芯2F平台的Web服务器性能测试问题,研究龙芯2F平台的Web服务器性能测试设计,并探讨龙芯2F平台在Web服务器市场的应用前景。 本文的主要内容包括: 1.龙芯2F平台的概述和应用前景 2.Web服务器...

    主机服务器性能配置测算方法应用服务器.docx

    本文将重点探讨主机服务器的性能配置测算方法,以及如何在不同的应用场景中优化服务器性能。我们将从以下几个方面进行讨论: 1. 主机服务器性能的基本概念 主机服务器是指通过互联网提供各种服务的计算机设备,其...

    C#Web应用程序入门经典

    如服务器控件、数探访问、数据绑定、Asp.NET状态管理、XML与web开发、web应用程序中的web服务、ASP.NET身份验证、授权和安全、调试和异常处理、利用缓存改进性能以及在NET中发布web应用程序等。 本书适用于熟悉...

    大型高并发高负载网站的系统架构

    本文将从高性能服务器、数据库、编程语言、Web服务器等方面进行探讨,并提供一些实际的解决方案。 首先,高性能的服务器是大型网站应对高并发和高负载的首要解决方案。服务器的选择对网站的性能和可扩展性产生了...

    C# web程序入门经典

    如服务器控件、数据访问、数据绑定、ASP.NET状态管理、XML与Web开发、Web应用程序中的Web服务、ASP.NET身份验证、授权和安全、调试和异常处理、利用缓存改进性能以及在.NET中发布Web应用程序等。 本书适用于熟悉C#...

    基于Linux集群的高校校园网服务器平台构建.pdf

    LVS 技术是 Linux 集群技术中的一种负载均衡技术,能够将多台服务器整合起来,实现高性能的服务器功能。 LVS 技术有三种实现方式,即 NAT、IP 隧道和直接路由。其中,直接路由模式是最常用的方式,它可以将请求分发...

    探讨计算机系统性能评价与优化.docx

    3. 网络优化:通过选用高性能的网络设备、合理规划网络拓扑结构和配置 QoS 等技术,可以提高网络传输的性能和效率。 案例分析 ---------- 在这里,我们将介绍一个基于 Linux 的 Web 服务器性能评价和优化的案例。...

    基于Web前端开发技术特点及优化分析.pdf

    同时,Web前端开发技术的创新和迭代速度具有一定的代表意义,在快速发展的互联网技术体系中,需要在高速宽带技术的背景之下,通过不断涌现的高性能浏览器,运用更加高水平的前端开发技术,才能够承载得了不断丰富的...

    Nginx技术的学习 加油

    《Nginx技术》可能是一本深入介绍Nginx(一款高性能的开源Web服务器和反向代理服务器)的技术书籍。以下是可能包含在这本书中的主题: Nginx基础: 对Nginx的基本概念、架构和工作原理进行介绍,包括事件驱动的异步...

    基于LNMP的教学管理系统的设计与开发.pdf

    然后,Nginx是一个轻量级、高性能的HTTP和反向代理Web服务器,并发能力强,可运行在大多数操作系统上,并且配置简单、灵活,是应用范围非常广的服务组件。 此外,MySQL是一个关系型数据库管理系统,其在Web应用方面...

    大型网站商眭能架构研究

    就是 由于Web服务器未进行优化。不管是哪种情况,一但 用户量在短时间内激增,网站就会明显 变 慢。甚至拒绝访问。要想有效地解决这些问题 ,就只有依靠不同的优化技术。本文对大型网站的高性 能 架构做 出来 了一些...

    ASP.NET入门经典(C#)pdg

    如服务器控件、数探访问、数据绑定、Asp.NET状态管理、XML与web开发、web应用程序中的web服务、ASP.NET身份验证、授权和安全、调试和异常处理、利用缓存改进性能以及在NET中发布web应用程序等。 本书适用于熟悉...

    linux运维.doc

    刀片式服务器适合大规模数据中心,塔式服务器适合中小型企业,机架式服务器适合高性能计算和大数据应用。 二、 网络配置 Linux 运维中,网络配置是非常重要的。我们可以使用 vi 编辑器来修改网络配置文件 `/etc/...

    Loadrunner 进行http post测试

    Loadrunner 是一款功能强大且广泛应用的性能测试工具,它可以模拟大量用户对服务器的访问,模拟真实用户行为,对服务器的性能和压力进行测试,以评估服务器的承载能力和响应速度。在本文中,我们将探讨 Loadrunner ...

    js高级程序设计第三版

    深入浅出地探讨了面向对象编程、Ajax 与Comet 服务器端通信,HTML5 表单、媒体、Canvas(包括WebGL)及Web Workers、地理定位、跨文档传递消息、客户端存储(包括IndexedDB)等新API,还介绍了离线应用和与维护、...

    如何设计一个良好的API接口?.doc

    在设计一个良好的 API 接口时,需要考虑到多个要素,包括标准化、兼容性、抽象性、简单性、高性能等。今天,我们将探讨如何设计一个良好的 API 接口,并讨论其中的要素和实现方法。 标准化 在 Web API 标准化方面...

    (完整word版)php+mysql网上购物系统毕业设计.doc

    * 高性能:MySQL可以提供高性能的数据库支持,满足大规模电子商务系统的需求。 * 简单易学:MySQL数据库简单易学,易于开发人员学习和应用。 本文档对PHP+MySQL网上购物系统的毕业设计进行了详细的介绍,分析了电子...

    javascript高级教程

    深入浅出地探讨了面向对象编程、Ajax与Comet服务器端通信,HTML5表单、媒体、Canvas(包括WebGL)及Web Workers、地理定位、跨文档传递消息、客户端存储(包括IndexedDB)等新API,还介绍了离线应用和与维护、性能、部署...

Global site tag (gtag.js) - Google Analytics