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