讨论:web服务器的架构设计

27 views
Skip to first unread message

liu chuncheng

unread,
Mar 20, 2006, 12:33:55 AM3/20/06
to dev4s...@googlegroups.com
前两天看了一篇有关IOCP的文章,里面提到apache。文章作者的观点是用IOCP模型的IIS应该比进程模型的apache的性能要高。我想针对这个主题发起讨论。
首先说一下我的观点:
1、IOCP是windows下比较高效的一个异步IO模型,他可以克服I/O设备慢速的缺点,从而可以构建一个高效的网络通讯模型。
2、但我认为IOCP也不是万能的,只有合适的应用才会发挥他的长处。比如游戏服务器,或者流媒体服务器等。
3、但我认为对于web服务器它不是最好的方案,原因如下:
    a、web服务器的连接之间的数据是独立的,没有联系的,那么每个连接的数据用一个线程或者进程来处理是很高效的,处理完之后就退出了,再没有任何其它的 开销。如果用IOCP那么就要放到队列里,从线程池里面频繁的切换线程来处理数据,这种开销还是比较大的。只是web的资源需要做同步的机制。
    b、web服务器是基于短连接的,区别于游戏服务器的长连接,就是不需要对这个连接做更多的管理。相当于一个连接上来之后就做一个任务,做完任务之后就一拍两散。
    综合上面的两点,化繁为简,我认为对于web服务器用最简单的网络模型——1连接+1线程,可能也是比较好的方案。

    一家之言,欢迎大家拍砖!

Ghost Cheng

unread,
Mar 20, 2006, 12:48:37 AM3/20/06
to dev4s...@googlegroups.com
Hi liu chuncheng:
 
1连接+1线程的话,如果同时大量的连接,就完蛋了~。
页面里的每个图片,都是一个连接阿。访问一个页面,并不是仅仅一个连接,如果页面里面图片多的话,
那每刷新一个页面,就需要几十个连接。服务器的线程不可能有那么多,那么人多了还是需要排队。


 
On 3/20/06, liu chuncheng <city...@gmail.com> wrote:
前两天看了一篇有关IOCP的文章,里面提到apache。文章作者的观点是用IOCP模型的IIS应该比进程模型的apache的性能要高。我想针对这个主题发起讨论。
首先说一下我的观点:
1、IOCP是windows下比较高效的一个异步IO模型,他可以克服I/O设备慢速的缺点,从而可以构建一个高效的网络通讯模型。
2、但我认为IOCP也不是万能的,只有合适的应用才会发挥他的长处。比如游戏服务器,或者流媒体服务器等。
3、但我认为对于web服务器它不是最好的方案,原因如下:
    a、web服务器的连接之间的数据是独立的,没有联系的,那么每个连接的数据用一个线程或者进程来处理是很高效的,处理完之后就退出了,再没有任何其它的开销。如果用IOCP那么就要放到队列里,从线程池里面频繁的切换线程来处理数据,这种开销还是比较大的。只是web的资源需要做同步的机制。

    b、web服务器是基于短连接的,区别于游戏服务器的长连接,就是不需要对这个连接做更多的管理。相当于一个连接上来之后就做一个任务,做完任务之后就一拍两散。




--

Sincerely,
Ghost Cheng
Email : ghost...@gmail.com
Web : http://www.GhostSoft.net

一无所知

unread,
Mar 20, 2006, 12:56:24 AM3/20/06
to 高性能网络编程邮件列表
我不这么认为

1、IOCP
的作用是高效的一个异步IO模型,相对于同步IO模型的等待操作完成后返回的方式显然要快的多!
2、如果应用不是过于简单的话,IOCP
肯定是理想的模式,因为
Windows下目前还没有其他模式能够比 IOCP
的效率高,当然了,不考虑 IOCP
的复杂度问题,如果性能不是问题话,那么也无须讨论了。
3、我看作者根本没有看过书吧?不知道 IOCP
的内部工作机制?
我只问你新开一个线程的开销大还是线程切换一下的开销大???

另外,是长连接还是短连接以及连接之间是否独立和使用不使用
IOCP 模型有什么关系么???


建议,还是多看看书......

els...@gmail.com

unread,
Mar 20, 2006, 1:19:12 AM3/20/06
to 高性能网络编程邮件列表
一个图片不一定是一个连接
浏览器选择是一个连接还是多个连接 Keep-Alive 头
一般浏览器一个页面就一个连接
先下载文本,然后再依次下载图片,这些都是一个连接
至多也就是一个连接下载文本 一个连接下载图片

els...@gmail.com

unread,
Mar 20, 2006, 1:30:11 AM3/20/06
to 高性能网络编程邮件列表
这个要看你WEB服务器的性能瓶颈在哪
通常的WEB服务器,特别是执行动态脚本,进行连接数据库
查库
等操作,网络I/O就不是主要矛盾了。这样,采取一线程一连接也基本差不多,毕竟,逻辑处理限制了每秒请求响应数,服务器不会有太多的同时在线。

但正如 Ghost Cheng
所说,“如果页面里面图片多的话”,通常Web服务器有一大半的流量在图片等静态资源上,这些就要求
I/O性能也不能太差,所以,还是IOCP比较合适

sunway

unread,
Mar 20, 2006, 2:10:24 AM3/20/06
to 高性能网络编程邮件列表
1。如果一个连接一个线程绝对是不行的。因为这种情况下线程切换太消耗时间。一般并发连接1000个是非常正常的情况。
2。用队列来传递请求效率,也可以考虑,当然比一个连接一个线程要高。但是处理工作队列的线程数目应该比较多。

其实我认为直接 开N个
GetC***线程,直接处理用户请求,好象MS的IIS就是,据说开了256个这样的线程。
这样没有太多的线程切换。处理时间也能跟的上。
>>前两天看了一篇有关IOCP的文章,里面提到apache。文章作者的观点是用IOCP模型的IIS应该比进程模型的apache的性能要>>高。我想针对这个主题­发起讨论。
>>首先说一下我的观点:
>>1、IOCP是windows下比较高效的一个异步IO模型,他可以克服I/O设备慢速的缺点,从而可以构建一个高效的网络通讯模>>型。

guowei...@126.com

unread,
Mar 21, 2006, 6:43:16 AM3/21/06
to 高性能网络编程邮件列表
Web服务环境下的短连接和一般游戏服务器中的长连接是很不同的,长连接情况下IOCP效率当然比线程模式要高,但是短连接情况下就不一定了,Apache采用短连接,我认为是基于如下考虑:
1)Apache多面向Unix系列的操作平台,采用线程模式有利于多平台开发;
2)Apache的优良的connect->请求的内存继承树状池采用线程模式比较方便;
3)不可能同一时刻有很多短连接同时访问服务器,这和长连接有很大不同,Apache有线程池,当一个连接连上时,分配一个已经产生的线程,用完后回归,不存在效率问题;
4)Apache注重的是“稳定第一,效率第二”的原则,一个好的服务器不能单纯从效率上考虑,其可扩展性,容错性也是很关键的,尤其是对于Web服务器这种不需要很多专业知识就能上手操作编程的服务器而言,容错性,可扩展性比效率从某种意义上而言,要重要的多。

xMan

unread,
Mar 21, 2006, 8:50:24 AM3/21/06
to 高性能网络编程邮件列表
"如果用IOCP那么就要放到队列里,从线程池里面频繁的切换线程来处理数据,这种开销还是比较大的"
这段里对IOCP处理线程的描述是不对的。

IOCP里一般只开2个线程(假设运行在一个CPU上),IOCP内部的线程队列是由操作系统核心提供管理的,不存在普通“线程切换”的问题,这才是为什么MS做IOCP的主要原因!

你只需要在Completion
Port对应的Buffer取出数据使用就可以了。你说的“开销还是比较大的”是不成立的。

一无所知

unread,
Mar 21, 2006, 8:29:38 PM3/21/06
to 高性能网络编程邮件列表
同意!
IOCP
内部对线程队列做了优化,内部使用了三个线程表,
并且做到了尽量只使用最新的同一个线程的功能,所以大量减少了线程切换!

一无所知

unread,
Mar 21, 2006, 8:40:43 PM3/21/06
to 高性能网络编程邮件列表
1、Windows 平台下有 IOCP, Unix
系统下可采用select/poll(epoll)/kqueue 等差不多的技术。
2、内存池和采用何种线程模式没有什么关系吧?这个还有方便不方便之言?
3、无论是长连接还是短连接都是使用 IOCP
效率来的高吧?
Apache
线程池再好,不存在创建线程的开销,但是如果是一个连接一个线程,那还是不如
IOCP 的尽量利用最后线程的线程切换次数来的少!
4、“稳定第一,效率第二”想不通和使用不使用 IOCP
有什么关系,稳定性取决于你的容错设计和代码的强壮与否,可扩展性,容错性等等都是设计上的问题。
当然了,如果是个人写一个没有几个连接的小型 Web
服务器,那当然怎么快怎么写了,因为通常小型 Web
服务器不存在执行效率问题。

guowei...@126.com

unread,
Mar 22, 2006, 2:53:19 AM3/22/06
to 高性能网络编程邮件列表
IOCP的线程是针对数据处理而言的,Apache的线程是针对连接而言的,考虑如下情况:
一个处理过程中发生内存泄漏;
IIS:没有办法处理,只有如下方法:利用一个监视进程监视处理进程(处理进程中包含IOCP),当该进程占用的内存达到一定数量(可配置),则将其杀死,重启它。(IIS就是这样做的)
Apache:运用其特有的内存管理机制,在处理过程中,用户(扩展者)不需要释放内存,而是运用其树状继承管理机制来管理内存。有效的避免了内存泄漏。(关于Apache内存管理,有很多地方都有讲)
所以说Apache从设计上说是“稳定第一,效率第二”。

那用IOCP+一个类似Apache的内存管理机制(不是内存池)能实现吗?因为IOCP是针对数据的,不是针对请求的(一个请求可能需要从几次IOCP数据中组合而成),所以是不可能实现的。

对于长连接和短连接,是IOCP高,还是Apache高,
IOCP处理:
socket连接---》将Socket与IOCP相连--》投递一个异步IO请求--》完成一个连接的建立;
Apache:
socket连接---》从线程池中找一个空闲线程--》让该线程从socket进行阻塞取数据--》完成;
说谁高,这其实不一定,需要试验,我没试验过。

Apache2其实是运用了IOCP的(Apache1.3系列没有用),只是它不是用来接收数据,而是
当一个socket连接建立时,它运用IOCP来进行通知有一个Socket建立连接。

“Windows 平台下有 IOCP, Unix
系统下可采用select/poll(epoll)/kqueue
等差不多的技术”这是对的,但是IOCP和
select等的处理模型是不同的,采用IOCP不容易和Select等模式,不好编出一致风格的代码,(当然,ACE做到了,需要
用大量的模式来实现)

Reply all
Reply to author
Forward
0 new messages