免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 7194 | 回复: 2
打印 上一主题 下一主题

关于高性能服务器的架构 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-05-05 11:56 |只看该作者 |倒序浏览
目前主流服务器架构,就我所知,大致分3类
(1)每来一个客户请求,启动一个进程或线程来处理它。这样做的缺点很明显,当并发客户请求很多时,花在进程或线程调度上的开销会非线性上升,导致吞吐量急剧下降
2)预先建立一个进程池或线程池,当里面的工作进程或工作线程都被占用之后,新来的请求就排队等待,直至有工作进程空闲出来,apache,IIS好像都用这种方式。避免了大量进程或线程调度造成的恐怖开销。但缺点也很明显,比如一个很费时的请求,如果先来,占用了工作进程,后面到来的请求,即使很快就能处理完,也必须等待前面那个费时请求完成,降低了系统的公平性
(3)多进程(或线程)+非阻塞I/O+多路复用(如epoll)方式。lighttpd似乎就是这样(没深入研究过lighttpd,不敢肯定)。一个进程(或线程)处理多个请求,在进程(或线程)内部为每个请求维持一个状态机。这样就可以用较少的进程(或线程)来处理大量的并发请求。但是我想到一个问题:在这种模型中,如果一个进程(或线程)中的某个请求需要读磁盘,使得该进程(或线程)睡眠,那岂不是以为一个请求的缘故,耽误了改进程(或线程)中的其他请求?磁盘I/O不像socketI/O,它不存在非阻塞模式,只要操作系统的cache中没有要读的内容,就一定要启动磁盘操作,该进程(或线程)就一定会睡眠。那该进程处理的其他请求岂不是受了连累?大家对这个问题有什么好的解决办法吗?

论坛徽章:
0
2 [报告]
发表于 2010-05-05 12:22 |只看该作者
回复 1# cjog


    首先所谓高性能的服务结构, 也是根据具体需求来设计的, 你上面分析的情况, 最起码也该分为每个连接连上后的服务时间, 也就是长连接还是段连接。才可以展开讨论。

    你最后问的问题常用的解决方法是这样的:

    假设磁盘读写没有非阻塞的, 那你可以用一个或者几个专门负责读写磁盘的线程来完成异步处理。

    网络线程依旧是异步收发网络包, 有需要读写磁盘的地方, 就通过fifo之类的方法, 给磁盘读写线程加任务, 磁盘操作完了, 在通过fifo通知网络线程。

论坛徽章:
0
3 [报告]
发表于 2010-05-05 12:52 |只看该作者
楼主说的是服务模型,高性能架构是软件和硬件的构成方式,包括要使用cluster,mp等技术
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP