分类:
2011-11-09 18:53:23
原文地址:linux 高性能的网络服务系统 作者:jian_g_
一、用 Epoll 后将限制最大连接数的因素 另一篇关于epoll的文章 http://blog.chinaunix.net/space.php?uid=12453618&do=blog&id=3012621
Note:一个处理上万连接的系统稳定性和可靠性要比性能重要得多!
二、多进程
那么这个时候就有人问了,如果此时有客户端发来连接请求会是怎么样呢?答案是所有进程都会作出相应的反映。换句话说,如果所有进程都采用epoll来获得这个连接请求的事件,那么所有进程都会得到通知。但是,只有一个进程调用accept会成功,其他的进程都会失败。具体是那个进程是不一定的,Linux的任务调度子系统负责处理。调用accept成功的进程可以获得这个连接,这个连接属于那个幸运进程的私有资源,之后的一切数据收发请求都只能由那个进程来负责,直到关闭。
15. 1)master 负责listen,每个worker子进程独自accept,accept无上锁。所有worker阻塞于同一个监听套接字上睡眠,当有新的客户连接请求时,内核会唤醒所有等待该事件的睡眠worker子进程,最先执行的worker将获得连接套接字并处理请求,这种模型会导致惊群问题,尽管只有一个子进程将获得连接,但是所有子进程却都会被唤醒,子进程越多,惊群问题对于性能的影响就越大。另一方面,如果每个worker不是阻塞于accept而是阻塞于select,则很容易造成select冲突问题,这种情况的性能损耗更大,所以这种模型一般都是直接阻塞于accept,不阻塞于select;
2)master 负责listen,每个worker子进程独自accpet,accept有上锁。这种模型解决了惊群问题,只有一个worker阻塞于accpet,其余worker都阻塞于获取锁资源,上锁可以使用文件上锁或者使用共享内存的互斥锁,这种模型的cpu耗时略高于第一种模型。这两种模型都是由内核负责把客户连接请求交由某个worker,客户连接请求的处理比较均匀,因为内核使用了公平的进程切换方式;
参考文档: Linux那些破事儿之我的高性能.pdf
资料来源:操作系统原理和计算机原理讲师—赵鑫磊 狂热的计算机爱好者、开源项目领导者、Linux内核代码贡献者;原新浪UC的技术总监,铁路车载电视系统专家。在此分享他所写的有关linux的课件:《Linux那些破事儿之我是特种文件系统》:与《Linux那些破事儿之我的高性能》:
2. nginx源码分析 http://blog.sina.com.cn/s/blog_677be95b0100iivw.html