epoll 正在参加 2020 年度 OSC 中国开源项目评选,请投票支持!
epoll 在 2020 年度 OSC 中国开源项目评选 中已获得 {{ projectVoteCount }} 票,请投票支持!
投票让它出道
已投票
授权协议 GPL
开发语言 C/C++
操作系统 Linux
软件类型 开源软件
开发厂商
地区 不详
提 交 者 红薯
适用人群 未知
收录时间 2011-02-07

软件简介

Epoll是Linux内核为处理大批量句柄而作了改进的poll。要使用epoll只需要这三个系统调用:epoll_create(2), epoll_ctl(2), epoll_wait(2)。它是在2.5.44内核中被引进的(epoll(4) is a new API introduced in Linux kernel 2.5.44),在2.6内核中得到广泛应用,例如LigHttpd

epoll 的优点

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

select 最不能忍受的是一个进程所打开的FD是有一定限制的,由FD_SETSIZE设置,默认值是2048。对于那些需要支持的上万连接数目的IM服务器来说显然太少了。这时候你一是可以选择修改这个宏然后重新编译内核,不过资料也同时指出这样会带来网络效率的下降,二是可以选择多进程的解决方案(传统的Apache方案),不过虽然linux上面创建进程的代价比较小,但仍旧是不可忽视的,加上进程间数据同步远比不上线程间同步的高效,所以也不是一种完美的方案。不过 epoll则没有这个限制,它所支持的FD上限是最大可以打开文件的数目,这个数字一般远大于2048,举个例子,在1GB内存的机器上大约是10万左右,具体数目可以cat /proc/sys/fs/file-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_buff结构,那么可以在运行时期动态调整这个内存pool(skb_head_pool)的大小--- 通过echo XXXX>/proc/sys/net/core/hot_list_length完成。再比如listen函数的第2个参数(TCP完成3次握手的数据包队列长度),也可以根据你平台内存大小动态调整。更甚至在一个数据包面数目巨大但同时每个数据包本身大小却很小的特殊系统上尝试最新的NAPI网卡驱动架构。

epoll 的使用

令人高兴的是,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 3个系统调用,
具体用法请参考http://www.xmailserver.org/linux-patches/nio-improve.html
在http://www.kegel.com/rn/有一个完整的例子。

展开阅读全文

评论 (0)

加载中
更多评论
暂无内容
发表了博客
2018/05/15 10:29

[epoll]epoll理解

转自:http://blog.51cto.com/yaocoder/888374 1. 流   首先我们来定义流的概念,一个流可以是文件,socket,pipe等等,可以进行I/O操作的内核对象,不管是文件,还是套接字,还是管道,我们都可以把他们看作流。   之后我们来讨论I/O的操作,通过read,我们可以从流中读入数据;通过write,我们可以往流写入数据。现...

0
1
发表了博客
09/03 12:42

epoll机制:epoll_create、epoll_ctl、epoll_wait、close

在linux的网络编程中,很长的时间都在使用select来做事件触发。在linux新的内核中,有了一种替换它的机制,就是epoll。相比于select,epoll最大的好处在于它不会随着监听fd数目的增长而降低效率。因为在内核中的select实现中,它是采用轮询来处理的,轮询的fd数目越多,自然耗时越多。并且,linux/posix_types.h头文件有...

0
0
发表了博客
2019/07/09 17:00

epoll使用详解:epoll_create、epoll_ctl、epoll_wait、close

epoll - I/O event notification facility 在linux的网络编程中,很长的时间都在使用select来做事件触发。在linux新的内核中,有了一种替换它的机制,就是epoll。 相比于select,epoll最大的好处在于它不会随着监听fd数目的增长而降低效率。因为在内核中的select实现中,它是采用轮询来处理的,轮询的fd数目越多,自然耗...

0
0
发表了博客
2012/12/11 16:47

epoll

epoll精髓 在linux的网络编程中,很长的时间都在使用select来做事件触发。在linux新的内核中,有了一种替换它的机制,就是epoll。 相比于select,epoll最大的好处在于它不会随着监听fd数目的增长而降低效率。因为在内核中的select实现中,它是采用轮询来处理的,轮询的fd数目越多,自然耗时越多。并且,在linux/posix_t...

0
0
发表了博客
2011/12/22 16:47

epoll

之前用epoll都是知其然不知其所以然,很多东西还不是很了解,网上找了一大圈,精辟的多,垃圾文章更多,在此总结下,算是做个笔记,其实就以下几点,但可以想明白很多东西。 1、如果fd被注册到两个epoll中时,如果有事件发生则两个epoll都会触发事件。 2、如果注册到epoll中的fd被关闭,则其会自动被清除出epoll监听列表...

0
6
2014/12/28 21:08

epoll

#include <sys/socket.h> #include <sys/epoll.h> #include <netinet/in.h> #include <arpa/inet.h> #include <fcntl.h> #include <unistd.h> #include <stdio.h> #include <errno.h> #include <iostream> using namespace std; /* typedef union epoll_data { void *ptr; int fd; __uint32_t u32; __uint64_t u64; } ep...

0
0
发表于AI & 大数据专区
2019/07/10 12:18

epoll

Linux socket accpet 对应的内核结构 https://blog.csdn.net/u010039418/article/details/80628490 Linux socket https://blog.csdn.net/u010039418/article/details/80628490 epoll 的两种用法: https://www.cnb......

0
0
发表了博客
2019/04/19 21:43

epoll

[toc] epoll epoll是linux下多路复用I/O接口select和poll的增强版本, 他能显著提高程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率, 因为它会复用文件描述符集合来传递结果, 而不用迫使开发者每次等待事件之前都必须重新准备要被监听的文件描述符集合. 另一点原因就是获取事件的时候, 它无须遍历整个被监听的描...

0
0
没有更多内容
加载失败,请刷新页面
点击加载更多
加载中
下一页
08/22 07:25

I/O多路复用中select/poll/epoll的区别?

2020-08-22:I/O多路复用中select/poll/epoll的区别?

2
0
05/23 20:29

spring gateway 网关报错

访问量小的时候不会 现在访问起来了 网关一直报这个错 ERROR 116528 --- [server-epoll-38] reactor.core.publisher.Operators : Operator called default onErrorDropped reactor.ipc.netty.channel.AbortedException: Connection has been closed at reactor.ipc.netty.channel.ChannelOperationsHandler.discard(Chan...

1
0
发表于软件架构专区
2019/05/27 16:53

关于linux epoll有个问题想请教下各位

我是看的这篇博客https://my.oschina.net/editorial-story/blog/3052308?p=4,里面有部分说到 当程序执行到 epoll_wait 时,如果被监听的socket没有数据返回时,会阻塞,但是问题来了,如果 同一时刻有多个socket有数据返回,那么是不是一个一个的处理,如果是这样,那根本就没做到并行 处理,而且看这部分代码是在单线程...

2
0
发表了问答
2017/04/21 00:34

相同一个程序源码,为什么在不同版本REDHAT不同BITS环境里编译后运行性能相差很大?

发现一个奇怪的现象,相同一个程序源码,为什么在不同版本REDHAT不同BITS环境里编译后运行性能相差很大? 我写了一个发号服务器 http://git.oschina.net/calvinwilliams/coconut 其实就是创建了一个HTTP协议的服务端,用epoll多路复用,响应给每个客户端一个唯一序号,在我的两个环境里编译运行压测 环境A:WinXP里装了V...

2
0
发表了问答
2016/08/09 20:30

Linux下epoll的ET模式

在ET模式中,内核只会通知一次,高并发的情况ET效率会高一点,ET模式下内核只会通知一次,如果没有来的及接受或者处理那内核再也不会通知,,这种情况下该怎么办

1
0
发表了问答
2016/05/10 18:15

memcached配置1个线程和6个线程的区别

测试机:24核,128G,万兆网卡 测试程序:c语言编写,使用libmemcached库,多线程。 程序执行set操作,key和value都是数字,1到2000000。这些key被平均分配给6个/12个线程,每个线程与memcached建议一个client连接。 测试结果如下: 我的问题有两个: 1. 为什么memcached开一个线程和开六个线程,set200万个key所需的时间...

2
0
发表了问答
2016/03/02 13:56

epoll_wait返回结果?

问题: 0.1ms s ocket a 过来一起个请求 a 0.2ms socket b 过来一起个请求 b epoll_wait返回几次,返回结果是什么 这个我不懂epoll原理 里面过程是如何呢 还是跟et和lt有关系呀? 我理解只要检测事件 麻烦就返回 返回两次 每次返回事件是1 理解正确吗?

4
0
发表了问答
2012/07/30 01:52

关于Linux epoll的疑问

对于如下代码: struct epoll_event events[MAX_EVENTS]; nfds = epoll_wait(epoll_fd, events, MAX_EVENTS, -1); 返回的events数组里是否会出现重复的文件描述符? 或者说,是否存在 i, j 满足以下条件: (1) 0 <= i, j < nfds 并且 i 不等于 j (2) events[i] 和 events[j] 的文件描述符相同...

11
0
发表了问答
2011/02/07 08:08

Linux Epoll 的使用方法

epoll的优势? 这个可能大家都知道,我稍微提一下:1、每次调用epoll的侦听函数epoll_wait时,它只会返回确实有事件发生的那些套接字,而不会返回所有注册的套接字,显然,这个会增强效率,特别是对于那些有大量的套接字,但套接字大多时候是处于休眠状态的场景;2、能够支持大量的套接字的同时监管:理论上讲,epoll能够...

3
4
发表了问答
2010/06/04 13:55

Python中使用epoll开发服务端程序

服务端代码: import socket, logging import select, errno logger = logging.getLogger("network-server") def InitLog(): logger.setLevel(logging.DEBUG) fh = logging.FileHandler("network-server.log") fh.setLevel(logging.DEBUG) ch = logging.StreamHandler() ch.setLevel(logging.ERRO...

2
9
发表了问答
2015/01/04 16:43

关于 epoll 的小小疑问, epoll 在等待事件的过程中会阻塞么

最近在看tornado的源码,有个RT的疑问 try: event_pairs = self._impl.poll(poll_timeout) except Exception as e: # Depending on python version and IOLoop implementation, # different exception types may be thrown and there are # two ways EINTR might be signaled: # * e.errno == ...

2
0
发表了问答
2015/01/18 14:46

socket在epoll两种工作模式下注册事件的工作原理是怎样的?

1.LT是epoll缺省的工作方式,同时支持blocking和nonblocking socket 通常的NIO framework均要把socket设置为nonblocking,blocking是用在什么场景下使用? 2.ET仅支持nonblocking socket,为什么? java中的selector对于linux而言底层实现为epoll的LT模式,为什么不提供ET模式? @乌龟壳,@中山野鬼...

7
3
发表了问答
2014/11/28 09:49

close套接字后为什么系统不立即重新分配相同值的套接字

如题,我使用线程池+epoll做了一个服务器端。 客户请求连接,accept返回一个套接字值为13,加入epoll监听,客户请求到来epoll返回事件,服务器处理完后将结果写入套接字13,线程继 续等待请求到来。直到当客户请求下线后服务器端调用close关闭套接字13,服务器继续等待。接着第二个客户链接到来时,accept返回一个套接字...

1
0
发表了问答
2014/10/19 18:50

C++ epoll网络编程 buffer缓存

最近研究代码发现一些问题,诚意请教大牛,最近研究了一些C++工程项目,现在的网络层一般使用epoll轮询操作,现在一般使用多个线程,一个网络线程,其余逻辑线程,逻辑线程中当有socket要发送数据的时候,会先将数据加载到buffer中,然后将socketfd 添加到epoll中的写事件,然后等网络线程epoll轮询到此写事件的时候将数...

2
0
发表了问答
2014/08/20 17:23

epoll有什么用处。。。

亲们,帮看下 我们胡坎的讨论对不对。。。 这是群里讨论: Q: 很多blog说 大幅提升java nio性能。。。 A: 对于连接数不大,链接活跃度非常高的服务来说,epoll的性能还不如select A: 对并发idle connection会有大幅度的性能提升 A: 有大量不活跃链接的情况下,epoll比select性能好 A: 链接服务器基本就是hold住链接,不做运...

3
0
发表了问答
2014/08/01 22:58

为什么select打开的FD数量有限制,而poll、epoll等打开的FD数量没有限制?

select、poll、epoll常用来构建性能较好的服务器,其中在性能上select<poll<epoll,除了select,对于另外两个的原理我也是云里雾里。我的主要问题是:为什么select打开的FD数量有限制,而poll、epoll等打开的FD数量没有限制? 当然,更希望各位看官能给出select、poll、epoll的更通俗易懂的关于原理的解释。 希望大神们不...

1
0
发表了问答
2013/10/10 19:25

如果在epoll_wait 之后的处理中阻塞了

最近在学linux下的c编程 在网络编程的异步处理中用到epoll,网上各种教程都是讲的echo server的例子。 while(1){ nfds=epoll_wait(epfd,events,20,1000); for(i=0; i<nfds; i++){ /* 各种判断,各种处理 */ if(读事件){ 读出一堆数据; 处理请求; } } } 我想...

2
1
发表了问答
2013/09/16 17:23

我用Epoll写的socket服务器,持续接受数据经常接收错误的数据,各位大神帮忙解决一下!有好用的实例给发一个yushadow@126.com

#include "test.h" int iEpollfd = 0; struct epoll_event Epoll_ev; struct epoll_event Epoll_events[EPOLLMAXNUM]; int main() {   int iRetvalue = 0;   while(TRUE)   {     iRetvalue = server_init();     if(0 > iRetvalue)     {       sleep(3);     }     continue;   }      return 0; } static int server_init() {   ...

3
1
发表了问答
2013/05/20 14:58

udp有必要用epoll吗??

如题,我需要一个udp服务端,接受来自客户端的小文件传输,客户端并发不严重。 udp属于无连接状态的socket,有必要用epoll吗??还是用select就行了?

2
0
发表了问答
2013/03/03 12:26

你用什么样的网络库?优缺点是?

你用哪个网络库?libevent,ace,epool,boost还是别的?优缺点各是什么呢?

2
0
没有更多内容
加载失败,请刷新页面
点击加载更多
加载中
下一页
0 评论
64 收藏
分享
返回顶部
顶部