`
javatoyou
  • 浏览: 1083185 次
  • 性别: Icon_minigender_2
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

剖析 epoll ET/LT 触发方式的性能差异

 
阅读更多

剖析 epoll ET/LT 触发方式的性能差异误解(定性分析)

平时大家使用 epoll 时都知道其事件触发模式有默认的 level-trigger 模式和通过 EPOLLET 启用的 edge-trigger 模式两种。从 epoll 发展历史来看,它刚诞生时只有 edge-trigger 模式,后来因容易产生 race-cond 且不易被开发者理解,又增加了 level-trigger 模式并作为默认处理方式。

二者的差异在于 level-trigger 模式下只要某个 fd 处于 readable/writable 状态,无论什么时候进行 epoll_wait 都会返回该 fd;而 edge-trigger 模式下只有某个 fd 从 unreadable 变为 readable 或从 unwritable 变为 writable 时,epoll_wait 才会返回该 fd。

通常的误区是:level-trigger 模式在 epoll 池中存在大量 fd 时效率要显著低于 edge-trigger 模式。

但从 kernel 代码来看,edge-trigger/level-trigger 模式的处理逻辑几乎完全相同,差别仅在于 level-trigger 模式在 event 发生时不会将其从 ready list 中移除,略为增大了 event 处理过程中 kernel space 中记录数据的大小。

然而,edge-trigger 模式一定要配合 user app 中的 ready list 结构,以便收集已出现 event 的 fd,再通过 round-robin 方式挨个处理,以此避免通信数据量很大时出现忙于处理热点 fd 而导致非热点 fd 饿死的现象。统观 kernel 和 user space,由于 user app 中 ready list 的实现千奇百怪,不一定都经过仔细的推敲优化,因此 edge-trigger 的总内存开销往往还大于 level-trigger 的开销。

一般号称 edge-trigger 模式的优势在于能够减少 epoll 相关系统调用,这话不假,但 user app 里可不是只有 epoll 相关系统调用吧?为了绕过饿死问题,edge-trigger 模式的 user app 要自行进行 read/write 循环处理,这其中增加的系统调用和减少的 epoll 系统调用加起来,有谁能说一定就能明显地快起来呢?

实际上,epoll_wait 的效率是 O(ready fd num) 级别的,因此 edge-trigger 模式的真正优势在于减少了每次 epoll_wait 可能需要返回的 fd 数量,在并发 event 数量极多的情况下能加快 epoll_wait 的处理速度,但别忘了这只是针对 epoll 体系自己而言的提升,与此同时 user app 需要增加复杂的逻辑、花费更多的 cpu/mem 与其配合工作,总体性能收益究竟如何?只有实际测量才知道,无法一概而论。不过,为了降低处理逻辑复杂度,常用的事件处理库大部分都选择了 level-trigger 模式(如 libevent、boost::asio等)

结论:
• epoll 的 edge-trigger 和 level-trigger 模式处理逻辑差异极小,性能测试结果表明常规应用场景 中二者性能差异可以忽略。
• 使用 edge-trigger 的 user app 比使用 level-trigger 的逻辑复杂,出错概率更高。
• edge-trigger 和 level-trigger 的性能差异主要在于 epoll_wait 系统调用的处理速度,是否是 user app 的性能瓶颈需要视应用场景而定,不可一概而论

分享到:
评论

相关推荐

    linux epoll ET和LT触发深入分析

    linux epoll ET和LT触发深入分析,深入剖析epoll触发机制。

    poll和epoll内核源码剖析

    此外,`epoll`的另一个优势是它可以使用`EPOLLET`(边缘触发)和`EPOLLONESHOT`(只触发一次)标志,这两种标志可以组合使用,进一步优化性能。例如,`EPOLLONESHOT`可以让`epoll_wait`返回后自动将文件描述符从监听...

    epoll完整源代码实例。

    而`epoll`通过引入“边缘触发”(ET)和“水平触发”(LT)模式,以及“红黑树”数据结构和“文件描述符”的高效管理,实现了更优的性能。 1. **epoll的数据结构与工作原理** `epoll`维护了一个连接链表,每个连接...

    epoll服务器

    4. **水平触发和边缘触发**:epoll支持两种触发模式,水平触发(LT)和边缘触发(ET),边缘触发避免了重复读写,提高效率。 ### 二、epoll工作流程 1. **创建epoll实例**:通过调用`epoll_create1()`函数创建...

    linux网络编程之 epoll简介

    - **边缘触发(ET)模式**:epoll支持两种模式:水平触发(LT)和边缘触发(ET)。ET模式只在文件描述符的状态首次变为“就绪”时触发一次,这样可以减少不必要的唤醒次数,提高效率。 - **高效的通知机制**:...

    linux_epoll

    - `EPOLLET`: 将`epoll`设置为边缘触发模式(Edge-Triggered)。 - `EPOLLONESHOT`: 事件发生一次后自动从`epoll`中移除。 4. **epoll封装** 在`epoll_wrapper`中,通常会包含初始化、添加/删除文件描述符、等待...

    linux epoll服务器+windows 客户端 socket tcp通信的例子.zip

    epoll的工作模式分为两种:LT(水平触发)和ET(边缘触发)。LT模式在数据准备好时就会通知,而ET模式只在状态变化时通知,一般推荐使用ET模式,因为它避免了不必要的唤醒。 2. **epoll的API** - `epoll_create()`...

    epoll 原理剖析1

    `epoll`采用边缘触发(ET,Edge Triggered)和水平触发(LT,Level Triggered)两种模式。ET模式只在事件状态变化时通知,而LT模式在事件状态为真时每次都会通知,通常ET模式更高效,但编程上需要额外注意避免遗漏...

    python_epoll_timer.rar

    `epoll`的核心特性在于它的边缘触发(ET)和水平触发(LT)模式,以及等待事件时的非阻塞特性。相比于传统的select和poll,epoll提供了更优秀的性能和扩展性,特别是在大量文件描述符的情况下。 在这个项目中,`...

    linux epoll代码

    1. `epoll`的工作原理:`epoll`采用“红黑树”数据结构存储文件描述符,当有事件发生时,使用“LT”(水平触发)或“ET”(边缘触发)模式通知应用程序。这种设计使得添加、删除和检查文件描述符的复杂度都为O(1)。 ...

    linux下的epoll服务程序实例

    `epoll`有两种工作模式:`LT`(水平触发)和`ET`(边缘触发)。`LT`模式下,只要文件描述符就绪就会一直返回,直到被读取或写入。而`ET`模式仅在描述符状态发生变化时返回一次,更适合高并发场景。 三、epoll的核心...

    Epoll模型详解

    - `EPOLLET`:设置为边缘触发模式,与水平触发相对应。 - `EPOLLONESHOT`:仅监听一次事件,之后需重新注册。 - `data`字段:用户数据变量。 **3. epoll_wait** ```c int epoll_wait(int epfd, struct epoll_...

    select和epoll实现多路复用.zip

    `epoll`支持边缘触发(ET)和水平触发(LT)两种模式,且能有效地处理大量文件描述符。在`epoll.c`和`epollclient.c`中,可以学习到如何创建`epoll`实例,添加和移除文件描述符,以及使用`epoll_wait`来等待事件的...

    Linux C epoll.zip

    而epoll采用“边缘触发”(ET)和“水平触发”(LT)两种模式,以及“事件驱动”的方式,只关注已经准备就绪的I/O事件,显著提高了系统性能。它使用`epoll_create`、`epoll_ctl`和`epoll_wait`等函数进行事件注册、...

    epoll_udp服务器

    epoll的工作模式主要有两种:水平触发(Level Triggered, LT)和边缘触发(Edge Triggered, ET)。在这个服务器实现中,通常会采用边缘触发模式,因为它可以避免不必要的轮询,提高效率。 创建epoll实例,首先调用`...

    poll及epoll内核实现分析

    2. **边缘触发(ET)与水平触发(LT)**:`poll`只支持水平触发,即只要文件描述符有数据可读或可写就会通知。而`epoll`既支持水平触发也支持边缘触发。边缘触发仅在状态发生改变时触发事件,避免了重复通知,从而...

    epoll聊天室r.zip

    epoll还提供两种模式:水平触发(LT)和边缘触发(ET)。水平触发模式下,只要文件描述符上有未处理的事件,`epoll_wait`就会持续返回该事件;而在边缘触发模式中,`epoll_wait`只会在事件发生时返回一次,直到用户...

    网络io与io多路复用select/poll/epoll 服务器并发代码实现

    此外,epoll支持水平触发(LT)和边缘触发(ET)两种模式,边缘触发模式在无数据可读或可写时不会重复通知,提高了效率。 在服务器并发代码实现中,使用这些I/O多路复用技术可以显著提高服务器的并发处理能力。例如...

    linux epoll服务器

    `epoll`的工作原理基于边缘触发(ET)和水平触发(LT)两种模式,其中边缘触发更有效率,因为它只在文件描述符状态发生变化时才触发事件。 在给出的文件列表中,我们看到以下几个关键的源文件: 1. `Epoll.cpp`:这...

    定时器 setitimer & epoll

    - **工作模式**:epoll有两种工作模式,即水平触发(LT)和边缘触发(ET)。LT模式下,只要文件描述符有数据可读或可写,epoll_wait就会返回;ET模式下,只有当数据准备好被完全读取或完全写入时,epoll_wait才会...

Global site tag (gtag.js) - Google Analytics