关于nginx/lighttpd epoll高并发以及apache为何不采用epoll的的疑惑

jackxiang 2010-3-13 17:24 | |
ginx/lighttpd等web server 采用epoll+单进程模式能支持并发几w的并发。但有个问题一直没搞明白,如果单进程的话,来个请求肯定得read/write操作吧,如果get数据很大的话(如sleep 1000),单进程服务串行处理请求还不得严重阻塞啊?? ,请大牛们解惑   ;对于apache进程+线程池的并发处理就比较好理解

而且epoll模式是非阻塞的,应该不会存在sleep 1000什么的.问题可能存在于处理数据的效率上吧...可以考虑分离吧使用非阻塞模式做I/O操作需检查errno是不是EAGAIN、EWOULDBLOCK、EINTR,如果是就需要循环重读,也就非阻塞处理IO时间与阻塞是一样,只是非阻塞能立即返回而且,你得人工去重复处理数据,还是需要等很长时间
单线程epoll ET,处理几万个并发连接是小case,LT模式都能处理上万并发连接,只是LT时CPU占用是居高不下。

单线程但并不是单线程啊! nginx 多线程的, 底下真正做事时还是一个线程伺候一个client的, 但accept()是在主线程统一处理的 ...

nginx/lighttpd之类只是取巧于各种常用web应用的多数情况, 如果您用nginx,lighttpd的web服务器处理论坛等高度发, 高复杂的业务时, 它们也没什么优势的, 甚至不如apache

如果这样的话,nginx还是会用到类似线程池技术罗??  之前粗略看了看lighttpd源码结构,没有用到线程池,一般情况是单进程,考虑多CPU情况也可以fork几个worker进程,但不像apache好几百的进程摆在那



ighttpd和nginx采用异步服务器模式,epoll模式,为何apache不采用这个模式,可以提高并发性能?

个人理解:
1. apache的模块大都是采用select模式开发,换到epoll模式不容易?

2. 跨平台问题,epoll模式只在linux2.6内核上有,其他平台无法实现,那么可以搞个支持epoll模式的apache新版本,叫apache3.0也可以啊

3.对于apache模块话其实没有必要去学习epool,相对php处理一些复杂的逻辑运算可能稳定性会比nginx更好更稳定(我自己加的一条)
但是apache有很多模块是阻塞方式运行的,所以需要每个请求开启一个线程/进程,这跟worker没什么区别。线程/进程之间切换时要一定代价的,另外也并不能发挥event非阻塞的优势。
我觉得,apache本身的线程模式与event非阻塞方式是有冲突的。再加上现有很多apache模块是用阻塞方式来写的,所以我觉得要完全移植很难。
如果楼主一定要用的话,建议还是用lighttpd或nginx吧,apache现在主要还是定位于功能强大的后端服务器。
前几天用apache-2.2.11的event模式和nginx-0.7.30的epoll模式做了下简单对比  同样7万个连接 apache只撑了大概15分钟后就已经不能提供服务了 在前15分钟能访问到后端的连接数也很少 相比使用nginx顶7万个连接 在系统负载和cpu消耗上nginx都占有优势 至少我用nginx来跑7万并发的静态图片到现在还没挂过 不错 呵呵




apache在兼容性上考虑的比较好,nginx性能不错!各取所需!!!

作者:jackxiang@向东博客 专注WEB应用 构架之美 --- 构架之美,在于尽态极妍 | 应用之美,在于药到病除
地址:https://jackxiang.com/post/2808/
版权所有。转载时必须以链接形式注明作者和原始出处及本声明!


最后编辑: jackxiang 编辑于2011-1-25 19:26
评论列表
发表评论

昵称

网址

电邮

打开HTML 打开UBB 打开表情 隐藏 记住我 [登入] [注册]