Unix网络编程之epoll函数模拟10万客户端链接服务器

epoll是Linux内核为优化大量文件描述符处理而设计的,对比select和poll,epoll在高并发下具有更高的效率,因为它基于回调机制和内存共享。epoll的优点包括不限制FD数目、IO效率不随FD数量增加而下降以及使用mmap加速内核与用户空间的消息传递。epoll有两种工作模式:LT和ET,其中ET模式适合高速场景。使用epoll涉及epoll_create、epoll_ctl和epoll_wait等系统调用。
摘要由CSDN通过智能技术生成

          1.epoll函数是Linux内核为处理大批量文件描述符而作了改进的poll,是Linux下多路复用IO接口select/poll的增强版本,它能显著提高程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率。另一点原因就是获取事件的时候,它无须遍历整个被侦听的描述符集,只要遍历那些被内核IO事件异步唤醒而加入Ready队列的描述符集合就行了。epoll除了提供select/poll那种IO事件的水平触发(Level Triggered)外,还提供了边缘触发(Edge Triggered),这就使得用户空间程序有可能缓存IO状态,减少epoll_wait/epoll_pwait的调用,提高应用程序效率。

       2.epoll与select和poll的区别。

               相比select和poll,epoll最大的好处在于它不会随着监听fd数目的增长而降低效率。

               内核中的select与poll的实现是采用轮询的方式来处理的,轮询的fd数目越多,自然就越耗时。

               epoll的实现主要基于回调的,如果fd有期望的事情发生就通过回调函数将其加入到epoll就绪队列当中。也就是说他只关心活跃的fd,与fd数目无关。

               内核/用户空间内存拷贝的问题。如何让内核吧fd关注的消息通知给用户空间呢?在这个问题上,select与poll采用的内存拷贝的方式,而epoll采用的是内存共享的方式。

               epoll不仅会告诉应用程序有I/O事件的到来,还会告诉应用程序相关的信息,这些信息是应用程序填充的。因此,根据这些信息应用程序就能直接定位到事件,而不必遍历整个fd集合。

        3、epoll的优点
       <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的工作模式
    令人高兴的是,2.6内核的epoll比其2.5开发版本的/dev/epoll简洁了许多,所以,大部分情况下,强大的东西往往是简单的。唯一有点麻烦 是epoll有

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值