select VS epoll
来源:互联网 发布:八爪鱼设置数据库 编辑:程序博客网 时间:2024/05/23 19:58
以下资料都是来自网上搜集整理。引用源详见文章末尾。
1 Select、Poll与Epoll简介
Select
select本质上是通过设置或者检查存放fd标志位的数据结构来进行下一步处理。这样所带来的缺点是:
1 单个进程可监视的fd数量被限制
2 需要维护一个用来存放大量fd的数据结构,这样会使得用户空间和内核空间在传递该结构时复制开销大
3 对socket进行扫描时是线性扫描
Poll
poll本质上和select没有区别,它将用户传入的数组拷贝到内核空间,然后查询每个fd对应的设备状态,如果设备就绪则在设备等待队列中加入一项并继续遍历,如果遍历完所有fd后没有发现就绪设备,则挂起当前进程,直到设备就绪或者主动超时,被唤醒后它又要再次遍历fd。这个过程经历了多次无谓的遍历。
它没有最大连接数的限制,原因是它是基于链表来存储的,但是同样有一个缺点:大量的fd的数组被整体复制于用户态和内核地址空间之间,而不管这样的复制是不是有意义。
poll还有一个特点是“水平触发”,如果报告了fd后,没有被处理,那么下次poll时会再次报告该fd。
Epoll
epoll支持水平触发和边缘触发,最大的特点在于边缘触发,它只告诉进程哪些fd刚刚变为就需态,并且只会通知一次。
在前面说到的复制问题上,epoll使用mmap减少复制开销。
还有一个特点是,epoll使用“事件”的就绪通知方式,通过epoll_ctl注册fd,一旦该fd就绪,内核就会采用类似callback的回调机制来激活该fd,epoll_wait便可以收到通知
注:水平触发(level-triggered)——只要满足条件,就触发一个事件(只要有数据没有被获取,内核就不断通知你);边缘触发(edge-triggered)——每当状态变化时,触发一个事件。
2 Select、Poll与Epoll区别
Select
Poll
Epoll
支持最大连接数
1024(x86) or 2048(x64)
无上限
无上限
IO效率
每次调用进行线性遍历,时间复杂度为O(N)
每次调用进行线性遍历,时间复杂度为O(N)
使用“事件”通知方式,每当fd就绪,系统注册的回调函数就会被调用,将就绪fd放到rdllist里面,这样epoll_wait返回的时候我们就拿到了就绪的fd。时间发复杂度O(1)
fd拷贝
每次select都拷贝
每次poll都拷贝
调用epoll_ctl时拷贝进内核并由内核保存,之后每次epoll_wait不拷贝
3 性能比较
由于博主并没有提供测试的机器参数,以及测试程序代码,所以这个性能测试只能够算是一个补充吧,对于epoll在大量fd情况下优势的直观展示。
表格左侧是描述符集合的大小,右侧分别表示1s对poll和epoll的调用次数,也就是性能瓶颈。
从上表可以看出当fd数量较少的时候poll略优于epoll,但是当fd增大到某个阈值时,poll性能急剧下降。而epoll始终保持的稳定的性能。
4 使用
当同事需要保持很多的长连接,而且连接的开关很频繁时,就能够发挥epoll最大的优势了。这里与服务器模型其实已经有些交集了。
同时需要保持很多的长连接,而且连接的开关很频繁,最高效的模型是非阻塞、异步IO模型。而且不要用select/poll,这两个API的有着O(N)的时间复杂度。在Linux用epoll,BSD用kqueue,Windows用IOCP,或者用libevent封装的统一接口(对于不同平台libevent实现时采用各个平台特有的API),这些平台特有的API时间复杂度为O(1)。 然而在非阻塞,异步I/O模型下的编程是非常痛苦的。由于I/O操作不再阻塞,报文的解析需要小心翼翼,并且需要亲自管理维护每个链接的状态。并且为了充分利用CPU,还应结合线程池,避免在轮询线程中处理业务逻辑。
但这种模型的效率是极高的。以知名的http服务器nginx为例,可以轻松应付上千万的空连接+少量活动链接,每个连接连接仅需要几K的内核缓冲区,想要应付更多的空连接,只需简单的增加内存(数据来源为淘宝一位工程师的一次技术讲座,并未实测)。这使得DDoS攻击者的成本大大增加,这种模型攻击者只能将服务器的带宽全部占用,才能达到目的,而两方的投入是不成比例的。
注:长连接——连接后始终不断开,然后进行报文发送和接受;短链接——每一次通讯都建立连接,通讯完成即断开连接,下次通讯再建立连接。
5 引用源
http://xingyunbaijunwei.blog.163.com/blog/static/76538067201241685556302/
http://blog.csdn.net/nailding2/article/details/6858199
http://www.cnblogs.com/xuxm2007/archive/2011/08/15/2139809.html
http://www.zhihu.com/question/20114168
http://www.doc88.com/p-106261947803.html
http://donghao.org/2009/08/linuxiapolliepollaueouaeaeeio.html
- select VS epoll
- Epoll vs Poll vs Select
- epoll VS select之我见
- 海量接入-epoll vs poll vs select
- 中断和轮询 VS select和epoll
- What is EPOLL? Epoll vs Poll vs Select call ? And How to implement UDP server in Linux using EPOLL?
- Select & Epoll
- epoll/select
- select/epoll
- select & epoll
- epoll vs select———— epoll内核源码理解
- What is EPOLL? EPOLL vs Select call? And How to implement UDP server in Linux using EPOLL?
- epoll vs select———— select内核源码赏析
- epoll-select的代替品
- select and epoll
- select 和 epoll比较
- select、Poll、epoll比较。
- epoll,select的区别
- java代码生成uml
- makefile详解(02) 规则
- Set中添加相同的元素
- 设计模式之创建类模式——建造者模式
- Linux下Synaptics笔记本触摸板的配置
- select VS epoll
- 数据库事务隔离级别与锁
- mysql 的 concat 组合的妙用
- Android Layout XML常用属性
- ioctl,unlocked_ioctl 处理方法
- Python嵌入C++详解
- canvas 超出部分自动隐藏
- 高可用集群——piranha(nat—lvs)
- 设计模式之创建类模式——抽象工厂模式