1.支持一个进程打开大数目的socket描述符(FD)

select 最不能忍受的是一个进程所打开的FD是有一定限制的,由FD_SETSIZE设置,默认值是2048。对于那些需要支持的上万连接数目的IM服务器来说显然太少了。这时候你一是可以选择修改这个宏然后重新编译内核,不过资料也同时指出这样会带来网络效率的下降,二是可以选择多进程的解决方案(传统的 Apache方案),不过虽然linux上面创建进程的代价比较小,但仍旧是不可忽视的,加上进程间数据同步远比不上线程间同步的高效,所以也不是一种完美的方案。不过 epoll则没有这个限制,它所支持的FD上限是最大可以打开文件的数目,这个数字一般远大于2048,举个例子,在1GB内存的机器上大约是10万左右,具体数目可以cat /proc/sys/fs/file-max察看,一般来说这个数目和系统内存关系很大。

2.IO效率不随FD数目增加而线性下降

传统的select/poll另一个致命弱点就是当你拥有一个很大的socket集合,不过由于网络延时,任一时间只有部分的socket是"活跃"的,但是select/poll每次调用都会线性扫描全部的集合,导致效率呈现线性下降。但是epoll不存在这个问题,它只会对"活跃"的socket进行操作---这是因为在内核实现中epoll是根据每个fd上面的callback函数实现的。那么,只有"活跃"的socket才会主动的去调用 callback函数,其他idle状态socket则不会,在这点上,epoll实现了一个"伪"AIO,因为这时候推动力在os内核。在一些 benchmark中,如果所有的socket基本上都是活跃的---比如一个高速LAN环境,epoll并不比select/poll有什么效率,相反,如果过多使用epoll_ctl,效率相比还有稍微的下降。但是一旦使用idle connections模拟WAN环境,epoll的效率就远在select/poll之上了。

3.使用mmap加速内核与用户空间的消息传递。

这点实际上涉及到epoll的具体实现了。无论是select,poll还是epoll都需要内核把FD消息通知给用户空间,如何避免不必要的内存拷贝就很重要,在这点上,epoll是通过内核于用户空间mmap同一块内存实现的。而如果你想我一样从2.5内核就关注epoll的话,一定不会忘记手工 mmap这一步的。

4.内核微调

这一点其实不算epoll的优点了,而是整个linux平台的优点。也许你可以怀疑linux平台,但是你无法回避linux平台赋予你微调内核的能力。比如,内核TCP/IP协议栈使用内存池管理sk_buff结构,那么可以在运行时期动态调整这个内存pool(skb_head_pool)的大小--- 通过echo XXXX>/proc/sys/net/core/hot_list_length完成。再比如listen函数的第2个参数(TCP完成3次握手的数据包队列长度),也可以根据你平台内存大小动态调整。更甚至在一个数据包面数目巨大但同时每个数据包本身大小却很小的特殊系统上尝试最新的NAPI网卡驱动架构。

转载于:https://my.oschina.net/alphajay/blog/5217

epoll 和select/poll的区别相关推荐

  1. Linux下多路复用IO接口epoll/select/poll的区别

    select比epoll效率差的原因:select是轮询,epoll是触发式的,所以效率高. Select: 1.Socket数量限制:该模式可操作的Socket数由FD_SETSIZE决定,内核默认 ...

  2. select,poll,epoll区别面试常问

    select,poll,epoll区别: select优点 1)select()的可移植性更好,在某些Unix系统上不支持poll() 2)select() 对于超时值提供了更好的精度:微秒,而pol ...

  3. IO模型(select, poll, epoll的区别和原理)

    参考<unix网络编程> 参考http://blog.csdn.net/blueboy2000/article/details/4485874 参考http://blog.csdn.net ...

  4. select,poll,epoll区别

    2019独角兽企业重金招聘Python工程师标准>>> select的本质是采用32个整数的32位,即32*32= 1024来标识,fd值为1-1024.当fd的值超过1024限制时 ...

  5. IO多路复用select,poll epoll以及区别

    看这个一次读懂 Select.Poll.Epoll IO复用技术 文章来简单理解下,如果不是很明白的话,可以参考下面转的知乎上面白话文列子 作者:Leslie 链接:https://www.zhihu ...

  6. C++面试 select poll epoll之间的区别

    目录 摘要 场景描述 Select poll epoll 总结 摘要 先明确几个概念: 面试官问:给我讲讲什么事同步阻塞.异步阻塞.同步非阻塞.异步非阻塞. 我:????? 同步和异步的概念 同步是指 ...

  7. Linux中select poll和epoll的区别

    首先给大家分享一个巨牛巨牛的人工智能教程,是我无意中发现的.教程不仅零基础,通俗易懂,而且非常风趣幽默,还时不时有内涵段子,像看小说一样,哈哈-我正在学习中,觉得太牛了,所以分享给大家!点这里可以跳转 ...

  8. select poll epoll之间的区别

    前导 首先在分析他们之前的区别前,需要明确几个概念. 同步阻塞. 同步非阻塞 异步非阻塞 同步和异步的概念: 同步是指用户线程发起IO请求后,需要等待或者轮询内核IO操作完成后才能继续执行: 异步是指 ...

  9. select,poll,epoll区别。

    1,select的用法 fd_set fd_in, fd_out; struct timeval tv;// Reset the sets FD_ZERO( &fd_in ); FD_ZERO ...

  10. select\poll\epoll之间的区别

    原文http://www.cnblogs.com/Anker/p/3265058.html select,poll,epoll都是IO多路复用的机制.I/O多路复用就通过一种机制,可以监视多个描述符, ...

最新文章

  1. 赢了!赢了!赢了!反抗违法裁员,小米以绩效低为由辞退员工败诉!这里单独给大家一些应对参考!...
  2. RepVGG:极简架构,SOTA性能,让VGG式模型再次伟大 | CVPR-2021
  3. win7怎么安装nodejs_怎么解决win7安装软件提示
  4. P4233-射命丸文的笔记【NTT,多项式求逆】
  5. TensorFlow windows安装
  6. python在线朗读-简单的python代码实现语音朗读
  7. 一网打尽 SCI、SCIE、SSCI 、EI等指标及影响因子查询
  8. uniapp中使用阿里云视频点播功能
  9. ps制作凹陷的的直线
  10. oracle 索引的创建和生效
  11. 【LeetCode】971. Flip Binary Tree To Match Preorder Traversal
  12. Clock and Jitter Phase Noise
  13. Unity发布webgl的一些问题
  14. 使用 Python 将 MP4视频 转换为GIF动画
  15. 服务器主板插显卡进不了系统,关于换了显卡后进不了系统的问题
  16. 线性代数(五)向量空间——向量空间的基 维数 内积 基的规范正交化
  17. [好累的游戏]传球游戏
  18. The Space Elevator -通往地球同步轨道的天梯
  19. go将外部图片转为base64
  20. 【论文笔记】SAFER: A Structure-free Approach for Certified Robustness to Adversarial Word Substitutions

热门文章

  1. excel批量删除公式保留数据_Excel公式大批量输入,这几个技巧你一定不能错过...
  2. Webpack 学习笔记
  3. .NetCore Redis使用及帮助类
  4. string数组转换成int数组,数组转字符串,字符串转list,list集合转字符串,删除数组中为空的元素,list转数组 数组转list
  5. java trimprefix_MyBatis动态SQL中的trim标签的使用方法
  6. 暴露了自己的无知不是问题,问题是还坚决不改
  7. 使用jdk提示Assistive Technology not found: org.GNOME.Accessibility.AtkWrapper
  8. JAVA版的IntHashMap的多个源码
  9. LINUX下载编译FreeType
  10. JAVA对象,直接新建跟反射新建,有区别