免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123
最近访问板块 发新帖
楼主: GNM
打印 上一主题 下一主题

关于nginx/lighttpd epoll高并发的疑惑 [复制链接]

论坛徽章:
0
21 [报告]
发表于 2009-06-08 22:24 |只看该作者
原帖由 GNM 于 2009-6-8 13:37 发表
nginx/lighttpd等web server 采用epoll+单进程模式能支持并发几w的并发。但有个问题一直没搞明白,如果单进程的话,来个请求肯定得read/write操作吧,如果get数据很大的话(如sleep 1000),单进程服务串行处理请求还不得严重阻塞啊?? ,请大牛们解惑   ;对于apache进程+线程池的并发处理就比较好理解了

如果单纯对于这个问题来说, lighttpd使用类似流水线的方式读取来自客户端的数据和向客户端发送响应数据, 在一个周期内, 每一个连接发送/读取一段数据. 如果请求的是小文件, 在一个或者少量的周期内即可响应完毕. 对于这些请求, 不存在延时; 如果请求的是大文件, 可能需要上百个周期或者更多的周期才能响应完毕, 这就是严重的延时. 但是, 一个连接不会被其它请求"严重阻塞".

当然, 上面的分析是上大量的连接是闲置的情况, 也即在一个周期内, 由于网络数据未准备好, 这些连接既不会读取, 也不会写. 如果几十K个连接都是活跃的, 那么, 显然已经达到了服务器的计算能力之外, 这时, 除非增加硬件, 即使在单台服务器上使用何种算法(epoll, iocp, 多线程, 多进程)都没有用.

论坛徽章:
0
22 [报告]
发表于 2009-06-21 17:31 |只看该作者
现在的想法是,用一个线程处理epoll的事件通知,然后把读到的数据或者要写出的数据转给一个线程池里面的work线程处理,不知道行不行,望指点下~~


[ 本帖最后由 anders0913 于 2009-6-22 10:25 编辑 ]

论坛徽章:
0
23 [报告]
发表于 2009-09-01 15:06 |只看该作者

回复 #7 hightman 的帖子

说得非常对。。还是得根据具体的业务具体分析!
另外,2.2以后就不存在accept惊群效应(指的是linux),所以不必上锁!

[ 本帖最后由 jolonchan 于 2009-9-1 15:31 编辑 ]

论坛徽章:
0
24 [报告]
发表于 2009-09-01 15:47 |只看该作者
这个问题现在才看到,就ligty的处理,我做一下解答,有不对的请指出:

1. ligty是多进程的,所以即使是能够同时处理几万个连接,也不是一个进程搞定全部工作的.

2. ligty是非阻塞方式处理IO的,就是说,即使在发送一个文件的时候速度较慢,也不会对其它的连接处理造成影响,一个文件一次发送不完,就再次把它加入到select/epoll等多路复用模型的可写集合中,等待下一次可写的时候继续发送.一次发送不完的,就记录下这次已经发送的长度,下一次从这个长度继续发送.

3.ligty有流量控制,某个连接在一段时间内发送了较多数据的话,就会控制对这个连接的发送.

4.ligty使用sendfile函数,上面也有朋友提到过.

还有什么优化的地方,麻烦补充.

论坛徽章:
0
25 [报告]
发表于 2009-09-01 17:29 |只看该作者
原帖由 GNM 于 2009-6-8 16:07 发表
谢谢版主详尽解答,目前我也有个项目遇到类似高并发的需求,看来还得借助线程池,之前都是用select的,下来好好看看epoll,网上找了找,感觉以下这种模型也不错,和大家分享


一个echo server实现:

...

你是哪个公司,用CWINUX系统吧。

论坛徽章:
0
26 [报告]
发表于 2009-09-01 22:58 |只看该作者
主线程kqueue()处理核心的网络事件,将事件交给线程池(threadpool,N个线程)去处理,业务处理完毕后归还给主线程进行IO。

这边有个细节,就是threadpool到底管理多少个线程的问题,即N的值,
1>N越大,线程间的切换就越大;
2>N小了,比如说极端的N=1,假如业务逻辑很耗时的话,那么就会出现LZ提的问题,直接导致整个框架变得很慢。

我的做法:
1>假如业务逻辑不是很耗时的话,我建议项目的所有线程数之和最好和CPU个数相等;
2>如果很耗时的话,就得考虑好,如何安排N值,在线程间切换的消耗和业务逻辑的效率之间进行平衡,一般的时候我会写一个测试客户端进行测试,测试出合理的N值。


当然这是我的做法,楼下的请补充或者纠正!

[ 本帖最后由 zsniper 于 2009-9-1 23:58 编辑 ]

论坛徽章:
0
27 [报告]
发表于 2009-09-02 09:40 |只看该作者
下面是我目前多数服务的进程结构,楼上也有人提到过,主进程+多工作进程+线程池的模式,每个子进程都有epoll线程和工作线程池。
对于进程和线程的管理,框架中加入了apache积分板的机制,实现根据配置自动调节。

$ pstree -p 5260
echosvc(5260)─┬─echosvc(5261)─┬─{echosvc}(5282)
              │               ├─{echosvc}(5306)
              │               ├─{echosvc}(5307)
              │               ├─{echosvc}(530
              │               ├─{echosvc}(5310)
              │               ├─{echosvc}(5311)
              │               ├─{echosvc}(5313)
              │               ├─{echosvc}(5314)
              │               └─{echosvc}(5315)
              ├─echosvc(5262)─┬─{echosvc}(527
              │               ├─{echosvc}(5280)
              │               ├─{echosvc}(5281)
              │               ├─{echosvc}(5283)
              │               ├─{echosvc}(5330)
              │               ├─{echosvc}(5331)
              │               ├─{echosvc}(5333)
              │               ├─{echosvc}(5335)
              │               └─{echosvc}(5337)
              ├─echosvc(5263)─┬─{echosvc}(5286)
              │               ├─{echosvc}(528
              │               ├─{echosvc}(5289)
              │               ├─{echosvc}(5291)
              │               ├─{echosvc}(5292)
              │               ├─{echosvc}(5294)
              │               ├─{echosvc}(5295)
              │               ├─{echosvc}(5296)
              │               └─{echosvc}(529
              ├─echosvc(5264)─┬─{echosvc}(5287)
              │               ├─{echosvc}(5429)
              │               ├─{echosvc}(5430)
              │               ├─{echosvc}(5431)
              │               ├─{echosvc}(5432)
              │               ├─{echosvc}(5433)
              │               ├─{echosvc}(5434)
              │               ├─{echosvc}(5435)
              │               └─{echosvc}(5436)
              ├─echosvc(5265)─┬─{echosvc}(5293)
              │               ├─{echosvc}(5421)
              │               ├─{echosvc}(5422)
              │               ├─{echosvc}(5423)
              │               ├─{echosvc}(5424)
              │               ├─{echosvc}(5425)
              │               ├─{echosvc}(5426)
              │               ├─{echosvc}(5427)
              │               └─{echosvc}(542
              ├─echosvc(5266)─┬─{echosvc}(5299)
              │               ├─{echosvc}(5413)
              │               ├─{echosvc}(5414)
              │               ├─{echosvc}(5415)
              │               ├─{echosvc}(5416)
              │               ├─{echosvc}(5417)
              │               ├─{echosvc}(541
              │               ├─{echosvc}(5419)
              │               └─{echosvc}(5420)
              ├─echosvc(5267)─┬─{echosvc}(5301)
              │               ├─{echosvc}(5405)
              │               ├─{echosvc}(5406)
              │               ├─{echosvc}(5407)
              │               ├─{echosvc}(540
              │               ├─{echosvc}(5409)
              │               ├─{echosvc}(5410)
              │               ├─{echosvc}(5411)
              │               └─{echosvc}(5412)
              ├─echosvc(526─┬─{echosvc}(5303)
              │               ├─{echosvc}(5397)
              │               ├─{echosvc}(539
              │               ├─{echosvc}(5399)
              │               ├─{echosvc}(5400)
              │               ├─{echosvc}(5401)
              │               ├─{echosvc}(5402)
              │               ├─{echosvc}(5403)
              │               └─{echosvc}(5404)
              ├─echosvc(5269)─┬─{echosvc}(5305)
              │               ├─{echosvc}(5389)
              │               ├─{echosvc}(5390)
              │               ├─{echosvc}(5391)
              │               ├─{echosvc}(5392)
              │               ├─{echosvc}(5393)
              │               ├─{echosvc}(5394)
              │               ├─{echosvc}(5395)
              │               └─{echosvc}(5396)
              ├─echosvc(5270)─┬─{echosvc}(5312)
              │               ├─{echosvc}(5381)
              │               ├─{echosvc}(5382)
              │               ├─{echosvc}(5383)
              │               ├─{echosvc}(5384)
              │               ├─{echosvc}(5385)
              │               ├─{echosvc}(5386)
              │               ├─{echosvc}(5387)
              │               └─{echosvc}(538
              ├─echosvc(5271)─┬─{echosvc}(5317)
              │               ├─{echosvc}(5373)
              │               ├─{echosvc}(5374)
              │               ├─{echosvc}(5375)
              │               ├─{echosvc}(5376)
              │               ├─{echosvc}(5377)
              │               ├─{echosvc}(5378)
              │               ├─{echosvc}(5379)
              │               └─{echosvc}(5380)
              ├─echosvc(5272)─┬─{echosvc}(5319)
              │               ├─{echosvc}(5356)
              │               ├─{echosvc}(5358)
              │               ├─{echosvc}(5359)
              │               ├─{echosvc}(5361)
              │               ├─{echosvc}(5363)
              │               ├─{echosvc}(5365)
              │               ├─{echosvc}(5367)
              │               └─{echosvc}(5369)
              ├─echosvc(5273)─┬─{echosvc}(5321)
              │               ├─{echosvc}(5343)
              │               ├─{echosvc}(5344)
              │               ├─{echosvc}(5345)
              │               ├─{echosvc}(5346)
              │               ├─{echosvc}(5347)
              │               ├─{echosvc}(5349)
              │               ├─{echosvc}(5351)
              │               └─{echosvc}(5353)
              ├─echosvc(5274)─┬─{echosvc}(5323)
              │               ├─{echosvc}(5325)
              │               ├─{echosvc}(5326)
              │               ├─{echosvc}(5327)
              │               ├─{echosvc}(5348)
              │               ├─{echosvc}(5350)
              │               ├─{echosvc}(5352)
              │               ├─{echosvc}(5354)
              │               └─{echosvc}(5355)
              ├─echosvc(5275)─┬─{echosvc}(5329)
              │               ├─{echosvc}(5332)
              │               ├─{echosvc}(5334)
              │               ├─{echosvc}(5336)
              │               ├─{echosvc}(5338)
              │               ├─{echosvc}(5339)
              │               ├─{echosvc}(5340)
              │               ├─{echosvc}(5341)
              │               └─{echosvc}(5342)
              └─echosvc(5276)─┬─{echosvc}(5357)
                              ├─{echosvc}(5360)
                              ├─{echosvc}(5362)
                              ├─{echosvc}(5364)
                              ├─{echosvc}(5366)
                              ├─{echosvc}(5368)
                              ├─{echosvc}(5370)
                              ├─{echosvc}(5371)
                              └─{echosvc}(5372)


[ 本帖最后由 zhoubug 于 2009-9-2 09:42 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP