`

epoll LT/ET 深入剖析

 
阅读更多
来自:http://dongfuye.iteye.com/blog/2282573




epoll LT/ET 深入剖析

EPOLL事件有两种模型:

Level Triggered (LT) 水平触发
.socket接收缓冲区不为空 有数据可读 读事件一直触发
.socket发送缓冲区不满 可以继续写入数据 写事件一直触发
符合思维习惯,epoll_wait返回的事件就是socket的状态

Edge Triggered (ET) 边沿触发
.socket的接收缓冲区状态变化时触发读事件,即空的接收缓冲区刚接收到数据时触发读事件
.socket的发送缓冲区状态变化时触发写事件,即满的缓冲区刚空出空间时触发读事件
仅在状态变化时触发事件

ET还是LT?

LT的处理过程:
. accept一个连接,添加到epoll中监听EPOLLIN事件
. 当EPOLLIN事件到达时,read fd中的数据并处理
. 当需要写出数据时,把数据write到fd中;如果数据较大,无法一次性写出,那么在epoll中监听EPOLLOUT事件
. 当EPOLLOUT事件到达时,继续把数据write到fd中;如果数据写出完毕,那么在epoll中关闭EPOLLOUT事件

ET的处理过程:
. accept一个一个连接,添加到epoll中监听EPOLLIN|EPOLLOUT事件
. 当EPOLLIN事件到达时,read fd中的数据并处理,read需要一直读,直到返回EAGAIN为止
. 当需要写出数据时,把数据write到fd中,直到数据全部写完,或者write返回EAGAIN
. 当EPOLLOUT事件到达时,继续把数据write到fd中,直到数据全部写完,或者write返回EAGAIN

从ET的处理过程中可以看到,ET的要求是需要一直读写,直到返回EAGAIN,否则就会遗漏事件。而LT的处理过程中,直到返回EAGAIN不是硬性要求,但通常的处理过程都会读写直到返回EAGAIN,但LT比ET多了一个开关EPOLLOUT事件的步骤

LT的编程与poll/select接近,符合一直以来的习惯,不易出错
ET的编程可以做到更加简洁,某些场景下更加高效,但另一方面容易遗漏事件,容易产生bug

这里有两个简单的例子演示了LT与ET的用法(其中epoll-et的代码比epoll要少10行):
https://github.com/yedf/handy/blob/master/raw-examples/epoll.cc
https://github.com/yedf/handy/blob/master/raw-examples/epoll-et.cc

针对容易触发LT开关EPOLLOUT事件的情景(让服务器返回1M大小的数据),我用ab做了性能测试
测试的结果显示ET的性能稍好,详情如下:
LT 启动命令 ./epoll a
ET 启动命令 ./epoll-et a
ab 命令:ab -n 1000 -k 127.0.0.1/
LT 结果:Requests per second:    42.56 [#/sec] (mean)
ET 结果:Requests per second:    48.55 [#/sec] (mean)

当我把服务器返回的数据大小改为48576时,开关EPOLLOUT更加频繁,性能的差异更大
ab 命令:ab -n 5000 -k 127.0.0.1/
LT 结果:Requests per second:    745.30 [#/sec] (mean)
ET 结果:Requests per second:    927.56 [#/sec] (mean)

对于nginx这种高性能服务器,ET模式是很好的,而其他的通用网络库,更多是使用LT,避免使用的过程中出现bug
分享到:
评论

相关推荐

    举源码实例来说明epoll之LT和ET模式的区别

    本篇将通过源码实例深入探讨epoll中的两种事件触发模式:Level Triggered(LT)和Edge Triggered(ET)模式的区别。 1. **Level Triggered(LT)模式** LT模式是epoll的默认模式。在这种模式下,当调用`epoll_wait...

    epoll demo(LT和ET)

    本篇将深入讲解`epoll`的工作原理,以及如何实现`Level Triggered (LT)`模式和`Edge Triggered (ET)`模式。 首先,理解`epoll`的基本概念。`epoll`通过`epoll_create()`创建一个`epoll`实例,然后使用`epoll_ctl()`...

    epoll监听/处理/线程池

    epoll监听,处理,高并发操作。其中处理采用线程池的操作方式,处理速度提速。

    linux epoll ET和LT触发深入分析

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

    aLiLua基于 epoll/kqueue/Lua 构建的网络服务开发框架

    aLiLua 是一套基于 epoll/kqueue/Lua 构建的网络服务开发框架 aLiLua 使用 epoll 进行网络/文件IO事件读写,对Lua协程进行调度,其性能高效并且简单 Lua 语言就像 PHP 那么简单容易理解

    poll/epoll源码剖析

    根据提供的文件信息,本文将会深入分析poll和epoll两种I/O多路复用技术的源码,并且阐述其工作原理及效率差异。 首先,poll和epoll都是Linux系统中用于处理大量文件描述符(file descriptor,简称fd)的I/O多路复用...

    linux socket tcp大并发 epoll使用教程 有关epoll的一切

    linux socket tcp大并发 epoll使用教程 有关epoll的一切

    epoll/iocp 比较

    - **性能**:epoll在处理大量连接时性能更优,尤其是使用ET模式时;iocp适合处理异步I/O操作,更适合Windows环境。 - **线程模型**:epoll更适合多线程同步模型,而iocp更适合异步I/O模型。 - **兼容性**:epoll...

    poll和epoll内核源码剖析

    本文将深入剖析`poll`和`epoll`的内核源码,以揭示其工作原理和优化策略。 首先,我们从`poll`开始。`poll`函数通过`pollfd`结构体来定义要监视的文件描述符及其事件类型(读、写、错误等)。当调用`poll`时,内核...

    epoll使用方法

    epoll 有两种工作方式:LT (Level Triggered) 和 ET (Edge Triggered)。LT 模式是缺省的工作方式,同时支持 block 和 no-block socket。在 LT 模式下,内核告诉你一个文件描述符是否就绪了,然后你可以对这个就绪的 ...

    Linux网络编程,包括tcp/upd,select/poll/epoll/pdf

    它主要涉及到TCP/UDP协议以及select/poll/epoll等多路复用技术。 TCP/UDP协议是网络通信的基础,其中TCP协议提供面向连接的可靠数据传输,而UDP协议则提供无连接的不可靠数据传输。在Linux网络编程中,开发者需要...

    epoll机制epoll_create、epoll_ctl、epoll_wait、close(在epoll的ET模式下,read和write或send和recv当返回值0且errno=EAGAIN - linking530的专栏 - CSDN博客.mht

    epoll机制epoll_create、epoll_ctl、epoll_wait、close(在epoll的ET模式下,read和write或send和recv当返回值0且errno=EAGAIN - linking530的专栏 - CSDN博客.mht

    Epoll模型详解

    epoll提供了两种工作模式:边缘触发(Edge Triggered, ET)和水平触发(Level Triggered, LT)。ET模式下,只有当数据真正到达时才会触发事件,适合非阻塞I/O。LT模式则只要fd上有未处理的数据就会触发事件,适合...

    EPOLL-linux下select-poll的增强版

    - EPOLL:使用红黑树存储 FD,支持水平触发(LT)和边缘触发(ET),并且通过 epoll_wait 直接返回就绪事件,避免了无谓的遍历。 2. EPOLL 的核心函数: - epoll_create:创建一个 epoll 实例,返回一个 epoll ...

    一个基于 io-uring/epoll/kqueue 和 thread-per-core 模型 Rust Runtime

    基于io_uring/epoll/kqueue 的 Runtime,Monoio目标是在兼顾平台兼容性的情况下,做最高效、性能最优的 thread-per-core Rust Runtime。

    Monoio一个基于io-uring/epoll/kqueue和thread-per-core模型Rust Runtime

    一个基于 io_uring/epoll/kqueue 的 Runtime,Monoio 目标是在兼顾平台兼容性的情况下,做最高效、性能最优的 thread-per-core Rust Runtime。

    Linux 下 c++ 封装的 epoll ET模式 的 服务器

    本项目聚焦于使用C++封装的`epoll`事件驱动模型,采用边缘触发(Edge Triggered,ET)模式来设计一个服务器。`epoll`是Linux内核提供的I/O多路复用技术,它在高并发场景下表现优越,能有效解决传统轮询方式的效率...

    linux下Epoll模型实例代码

    5. ** Epoll的优点**:Epoll的优点在于其“边缘触发”(EPOLLET)模式和“水平触发”(EPOLLONESHOT)。边缘触发只在事件状态改变时通知,避免了重复唤醒。而水平触发则会在事件未被完全处理时持续通知。EPOLLONESHOT则...

Global site tag (gtag.js) - Google Analytics