多进程支持高并发

来源:互联网 发布:北山狼淘宝 编辑:程序博客网 时间:2024/04/23 19:32

http://blog.csdn.net/win_lin/article/details/7755773

多进程结构是实现那些服务内容不相关的服务器的os层面的自然抽象。

1. 容错:若系统在提供服务时,服务单元之间界限清晰没有或很少交互(例如浏览两个不相关的网页),而服务单元有很大可能出错,希望出错时不影响其他单元。

2. 高性能:服务器若支持多CPU或超线程,多线程无法完全利用机器性能,多进程则可以让服务器满载。

最近使用多进程开发流媒体服务器,性能很不错,预计能支持1000个客户端并发播放1000kbps,能跑到千兆网的极限。参考这篇文章:http://blog.csdn.net/winlinvip/article/details/7840285 。

支持高并发的多进程服务器,应遵循以下设计要点:

  1.  并非每个connection新建一个进程,这样支持的并发并不高。
  2. 每个进程处理多个connection,使用event-base来管理这些连接。
  3. master由信号驱动,worker由epoll驱动(当然信号会让epoll_wait返回)。
  4. 多进程用来利用多CPU硬件,所以按照业务边界来划分进程,或者就按CPU个数配置。
  5. 若有特殊业务逻辑,譬如chrome的站点抽象,多进程有提高系统容错性的优点。
  6. 每个connection的fd(socket)使用非阻塞方式(即异步方式,参考 http://blog.csdn.net/winlinvip/article/details/7843000 )。
  7. 每个进程是单线程的:event-based, non-blocking, async-io 这些足以避免多线程。
  8. 关键点就是尽量使用异步。 

关于chrome的多进程结构的背景:

http://blog.chromium.org/2008/09/multi-process-architecture.html

http://www.charlesreis.com/research/publications/eurosys-2009-talk.pdf?attredirects=0

总结如下:

1. 应该对系统分析,先搞清楚系统的目标,根据目标划分边界,再设计系统结构。
例如浏览器模型中,多进程模型分为:核心进程(存储,网络,UI)、插件进程、展现进程(DOM,JS引擎,HTML展示)。
这样设计的原因在于对于浏览器系统的分析————系统的边界可以定义在相关的页面,即将可相互操作的页面分为Site组。
区分系统边界的原因在于浏览器的实际问题“网页和脚本极易出错导致崩溃“、”加载速度随网页增多变慢“。
所以,先应分析系统的主要设计目标(要解决的问题),然后分析边界(可分解的子系统),最后才能设计系统的结构(进程的模型之类的)。

插件进程作为单独进程的原因,也是由系统的目标决定的:插件在边界上很明显,独立于HTML展现,而且也有崩溃的可能性。
核心进程一旦崩溃,整个系统也就崩溃了,所以核心进程的边界是也避开那些容易崩溃的系统(譬如把插件独立出去)。
2. 系统的目标和内涵:稳定性,性能。
稳定性:包括容错性,内存管理,可问责性。
    容错性:即某个子系统崩溃时是否能不影响其他系统。譬如某个页面崩溃是否其他页面还能不受影响。
    可问责性:即当系统出问题时,是否能快速定位是某个子系统,并采取措施解决问题。譬如,当浏览器占用过多资源时(内存泄漏啦之类),是否能快速找到出问题的页面,关闭它解决问题。
    内存管理:是否能汇报各个子系统的内存使用情况,内存泄漏时是否能重启或关闭子系统解决问题。
性能:包括实时性,吞吐速度,多CPU加速。
    实时性:即系统对于用户的响应是否实时。譬如,A页面现在很慢,但用户在B页面中操作是否能实时响应。
    吞吐速度:当任务增多时系统的整体吞吐能力。譬如,开很多个页面,系统是否还能性能良好。
    多CPU加速:系统是否能利用多CPU的服务器加速。譬如,是否能利用24CPU的机器能力,还是说24CPU能力和4CPU能力一样?
3. 多进程架构会占用更多内存。
4. Chrome其实支持单进程和多进程结构。


nginx也是多进程,虽然单个进程也可以支持高并发,但在实际服务器上,一般还是会使用多进程——这也是为什么用多进程的原因之一。参考nginx的系统结构一文:http://www.aosabook.org/en/nginx.html (我的朋友雷总分享给我的好东西,感谢他)。

参考《Unix环境高级编程》中对fork的总结,即多进程的使用场景:

fork有两种用法:
(1) 一个父进程希望复制自己,使父、子进程同时执行不同的代码段。父进程侦听请求,当请求到达时,父进程fork子进程处理此请求,父进程继续侦听下一个请求。
(2) 一个进程要执行一个不同的程序。这对shell是常见的情况。在这种情况下,子进程在从fork返回后立即调用exec。

其实也提到了服务器的应用。可见网络服务器使用多进程是有很长历史了。


0 0
原创粉丝点击