基于EPOLL+多进程+线程池的server框架设想_程序世界_百度空间
基于EPOLL+多进程+线程池的server框架设想
最近,看了几个开源代码的server框架,有了一些自己的想法,把它记下来。
针对server要求高性能的同时还需要稳定性的特点,有了这样一个构思,建立一个EPOLL+多进程+线程池的server框架,暂且叫它emptyServer(e:epoll,m:muti,p:process,t:thread,y:ycc.哈哈)。
考虑的出发点如下:
(1) 为什么用epoll?
众所周知的原因,这里就不多说了。
(2) 为什么使用多进程模型?
在emptyServer框架中,多进程的想法来源于apache和lighttpd。它的作用是多个进程共享监听socket,当有连接过来时,唤醒其中一个进程处理,这样可以保证了emptyServer的稳定性,又可以提高emptyServer的处理能力。
也许,大家会想,这不就会引起“惊群”问题了吗?linux2.4以后的内核版本,已经解决了“惊群”问题,所以不需要担心“惊群”影响性能。
注:“惊群”问题,多进程共享监听socket,当有请求过来时,系统会唤醒所有的进程,从而造成系统颠簸使性能严重下降。
(3) 为什么要使用线程池?
线程池的作用:线程处理具体的逻辑,不参与主线程的网络IO,通过socketpair与主线程交互。
使用线程是基于以下的考虑:
1) 对于耗时比较长的逻辑,如数据库访问、复杂数值计算等,如果不启用另外的线程处理,主线程就会把时间都花在处理逻辑上,就会影响网络IO的处理和其它请求的逻辑处理,从而影响整体性能。
2) 现在的服务器基本上都是多核多cpu的,通过多线程,可以把线程映射到不同的cpu去执行,充分利用多核多cpu的处理能力。
下面,给出一个粗略的流程图,打算8月初开始实现emptyServer。