论坛首页 综合技术论坛

Epoll,Poll,Select

浏览 5661 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2009-09-16   最后修改:2009-09-16
先说Select:
1.Socket数量限制:该模式可操作的Socket数由FD_SETSIZE决定,内核默认32*32=1024.
2.操作限制:通过遍历FD_SETSIZE个Socket来完成调度,不管哪个Socket是活跃的,都遍历一遍.

后说Poll:
1.Socket数量几乎无限制:该模式下的Socket对应的fd列表由一个数组来保存,大小不限(默认4k).
2.操作限制:同Select.

再说:Epoll:
1.Socket数量无限制:同Poll
2.操作无限制:基于内核提供的反射模式,有活跃Socket时,内核访问该Socket的callback,不需要遍历轮询.

总体来说:
大部分情况下,反射的效率都比遍历来的高,但是!
但是当所有Socket都活跃的时候,反射还会更高么?这时候所有的callback都被唤醒,会导致资源的竞争.既然都是要处理所有的Socket,那么遍历是最简单最有效的实现方式.

举例来说:
对于IM服务器,服务器和服务器之间都是长链接,但数量不多,一般一台60\70个,比如采用ICE这种架构设计,但请求相当频繁和密集,这时候通过反射唤醒callback不一定比用select去遍历处理更好.
对于web portal服务器,都是浏览器客户端发起的http短链接请求,数量很大,好一点的网站动辄每分钟上千个请求过来,同时服务器端还有更多的闲置等待超时的Socket,这时候没必要把全部的Socket都遍历处理,因为那些等待超时的请求是大多数的,这样用Epoll会更好.
   发表时间:2009-09-16  
epoll的适用情景就是大量的socket,但是活跃多不是很高的情况。
0 请登录后投票
   发表时间:2009-09-19  
特别是IBM的aix系统!
0 请登录后投票
   发表时间:2009-09-20  
raojl 写道
特别是IBM的aix系统!


深有感触?
0 请登录后投票
   发表时间:2009-09-20  
如果是有限数量的长连接,,用不用 async方式 都可以。我现在和tokyo tyrant都是用长连接,同步操作。

0 请登录后投票
   发表时间:2009-09-21  
还有 kqueue,实际上有不少服务器是基于 BSD 开发的
kqueue 和 epoll 类似,据说效率上稍微高一些,不过没比较过
0 请登录后投票
   发表时间:2009-09-21  
mryufeng 写道
epoll的适用情景就是大量的socket,但是活跃多不是很高的情况。


是的,说到底还是一个场景的问题,具体情况具体分析
0 请登录后投票
   发表时间:2009-09-23  
kqueue和epoll都是异步IO的实现。按理说只要一定量以后表现一定会比同步的机制更优越。
0 请登录后投票
   发表时间:2009-09-24  
check 写道
kqueue和epoll都是异步IO的实现。按理说只要一定量以后表现一定会比同步的机制更优越。


异步IO只有windows下的IOCP,其他都不是
0 请登录后投票
   发表时间:2010-04-26  
bachmozart 写道
check 写道
kqueue和epoll都是异步IO的实现。按理说只要一定量以后表现一定会比同步的机制更优越。


异步IO只有windows下的IOCP,其他都不是


同步IO
0 请登录后投票
论坛首页 综合技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics