没有合适的资源?快使用搜索试试~ 我知道了~
epoll是Linux下多路复用IO接口select-poll的增强版本
4星 · 超过85%的资源 需积分: 18 18 下载量 69 浏览量
2011-09-23
20:20:12
上传
评论
收藏 44KB DOCX 举报
温馨提示
试读
15页
epoll是Linux下多路复用IO接口select-poll的增强版本
资源推荐
资源详情
资源评论
Epoll
epoll 是 Linux 下多路复用 IO 接口 select/poll 的增强版本,
它能显著提高程序在大量并发连接中只有少量活跃的情况下的系统
CPU
利用率,
因为它不会复用
文件描述符
集合来传递结果而迫使开发者每次等待事件之前都必须重新
准备要被侦听的文件描述符集合,
另一点原因就是获取事件的时候,它无须遍历整个被侦听的描述符集,只要遍历那些被
内核
IO
事件异步唤醒而加入
Ready
队列的描述符集合就行了。
epoll 除了提供 select/poll
那种 IO 事件的电平触发(Level Triggered)外,还提供了边沿触发(Edge Triggered),
这就使得用户空间程序有可能缓存 IO 状态,减少 epoll_wait/epoll_pwait 的调用,提高应
用程序
效率。
支持一个进程打开大数目的 socket 描述符
select 最不能忍受的是一个进程所打开的 FD 是有一定限制的,由
FD_SETSIZE
设置,默认值是 2048。对于那些需要支持的上万连接数目
的 IM 服务器来说显然太少了。这时候你一是可以选择修改这个宏然后重新编
译内核,不过资料也同时指出这样会带来网络效率的下降,二是可以选择多
进程的解决方案(传统的 Apache 方案),不过虽然 linux 上面创建进程的
代价比较小,但仍旧是不可忽视的,加上进程间数据同步
远比不上线程间同
步的高效,所以也不是一种完美的方案。不过 epoll 则没有这个限制,它所
支持的 FD 上限是最大可以打开文件的数目,这个数字一般远大于 2048,举
个例子,在 1GB 内存的机器上大约是 10 万左右,具体数目可以 cat
/proc/sys/fs/le-max 察看,一般来说这个数目和系统内存
关系很大。
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
之上了 。
使用 mmap 加速内核与用户空间的消息传递。
这点实际上涉及到
epoll
的具体实现了。无论是
select,poll
还是
epoll
都需要内核把
FD
消息通知给用户空间,如何避免不必要的内存拷贝
就很重要,在这点上,
epoll
是通过内核于用户空间
mmap
同一块内存实
现的。
而如果你想我一样从 2.5 内核就关注 epoll 的话,一定不会忘记手工
mmap 这一步的。
内核微调
这一点其实不算 epoll 的优点了,而是整个 linux 平台的优点。也许
你可以怀疑 linux 平台,但是你无法回避 linux 平台赋予你微调内核的能力。
比如,内核 TCP/IP
协议
栈使用内存池管理 sk_bu" 结构,那么可以在运行时
期 动 态 调 整 这 个 内 存 pool ( skb_head_pool ) 的 大 小 --- 通 过 echo
XXXX>/proc/sys/net/core/hot_list_length 完成。再比如 listen 函数的
第 2 个参数(TCP 完成 3 次握手的数据包队列长度),也可以根据你平台内
存大小动态调整。更甚至在一个数据包面数目巨大但同时每个数据包本身大
小却很小的特殊系统上尝试最新的 NAPI 网卡驱动架构。
使用
令人高兴的是,2.6 内核的 epoll 比其 2.5 开发版本的/dev/epoll 简洁
了许多,所以,大部分情况下,强大的东西往往是简单的。唯一有点麻烦是
epoll 有 2 种工作方式:LT 和 ET。
LT(level triggered)是缺省的工作方式,并且同时支持 block 和 no-
block socket.在这种做法中,内核告诉你一个文件描述符是否就绪了,然后
你可以对这个就绪的 fd 进行 IO 操作。如果你不作任何操作,内核还是会继
续通知你的,所以,这种模式编程出错误可能性要小一点。传统的 select/
poll 都是这种模型的代表。
ET (edge-triggered)是高速工作方式,只支持 no-block socket。
在这种模式下,当描述符从未就绪变为就绪时,内核通过 epoll 告诉你。然
后它会假设你知道文件描述符已经就绪,并且不会再为那个文件描述符发送
更多的就绪通知,直到你做了某些操作导致那个文件描述符不再为就绪状态
了(比如,你在发送,接收或者接收请求,或者发送接收的数据少于一定量
时导致了一个 EWOULDBLOCK 错误)。但是请注意,如果一直不对这个 fd
作 IO 操作(从而导致它再次变成未就绪),内核不会发送更多的通知(only
once ) , 不 过 在 TCP 协 议 中 , ET 模 式 的 加 速 效 用 仍 需 要 更 多 的
benchmark 确认。
系统调用
epoll 相关的系统调用有:epoll_create, epoll_ctl 和
epoll_wait。Linux-2.6.19 又引入了可以屏蔽指定信号的 epoll_wait:
epoll_pwait。至此 epoll 家族已全。其中 epoll_create 用来创建一个
剩余14页未读,继续阅读
资源评论
- yimingjie2012-06-08貌似写的还不错咯,谢谢lz
- fanb62014-11-24写的比较细致,容易理解
gcrfrank
- 粉丝: 0
- 资源: 9
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功