epoll LT/ET 深入剖析

2023-05-16

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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

epoll LT/ET 深入剖析 的相关文章

  • 多路IO转接服务器实现方法三:epoll()函数

    epoll是Linux下多路复用接口select poll的增强版本 它能显著提高程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率 xff0c 因为它会复用文件描述符集合来传递结果而不用每次等待时间之前都必须重新准备要被监听的文件
  • send的 epoll_wait EPOLLOUT事件 与 MSG_WAITALL参数

    1 send 10G的数据 xff0c send返回值不会是10G xff0c 而是大约256k xff0c 表示你只成功写入了256k的数据 接着调用send xff0c send就会返回EAGAIN xff0c 告诉你socket的缓冲
  • Epoll服务器的简单实现

    1 Begins 学习linux编程很久 xff0c 只知道网络编程是socket xff0c bind xff0c listen xff0c 然而这些都是网络通信软件最基本的接口 在某网络公司待了y xff0c 也了解到公司的基础就是网络
  • 关于epoll的调试的几个问题

    将今天调试的几个小问题点总结下 xff0c 后续遇到再添加 一 将总结的问题点放在最前面 1 epoll wait的maxevents参数 epoll wait的maxevents参数 xff0c 经过测试 xff0c maxevents的
  • Linux epoll详解

    Linux epoll详解 一 什么是epoll epoll是什么 xff1f 按照man手册的说法 xff1a 是为处理大批量句柄而作了改进的poll 当然 xff0c 这不是2 6内核才有的 xff0c 它是在2 5 44内核中被引进的
  • Linux-epoll机制

    主要接口 epoll create epoll ctl epoll wait epoll create 头文件 include
  • epoll用法详解与编程实例

    1 epoll使用的三个函数 使用epoll时会用到三个函数 因此把这个三个函数弄明白了 也就明白了epoll的用法 要明白这个三个函数 最重要的就是要明白函数的参数 明白需要什么样的参数以及每一个参数的含义 1 1 epoll creat
  • epoll实现原理

    epoll的使用 epoll只有以下的三个系统函数调用 epoll create epoll ctl和epoll wait int epoll create int size 其中参数 1 size指明了生成描述符的最大范围 该函数返回一个
  • PyWebIo

    Part1什么是 PyWebIo PyWebIO 提供了一系列命令式的交互函数来在浏览器上获取用户输入和进行输出 将浏览器变成了一个 富文本终端 可以用于构建简单的 Web 应用或基于浏览器的 GUI 应用 使用 PyWebIO 开发者能像
  • 基于升序链表的定时器及其简单应用

    Linux网络编程笔记 定时器 基于升序链表的定时器 这其实就是一个结点为 class util timer public util timer prev NULL next NULL 构造函数 public time t expire 任
  • 面试官:说说Node中的EventEmitter? 如何实现一个EventEmitter?

    一 是什么 我们了解到 Node采用了事件驱动机制 而EventEmitter就是Node实现事件驱动的基础 在EventEmitter的基础上 Node几乎所有的模块都继承了这个类 这些模块拥有了自己的事件 可以绑定 触发监听器 实现了异
  • 一文明白IO模型和常问多路复用机制

    1 IO模型 Socket的输入操作有两步 wait for data 等待网络传输数据到达 到达后复制到内核缓冲区 copy data from kernel to user 把数据从内核缓冲区复制到应用进程缓冲区 涉及到两个对象 pro
  • 基于epoll实现简单的web服务器

    1 简介 epoll 是 Linux 平台下特有的一种 I O 复用模型实现 于 2002 年在 Linux kernel 2 5 44 中被引入 在 epoll 之前 Unix Linux 平台下的 I O 复用模型包含 select 和
  • 网络编程——epoll

    参考 TCP IP网络编程 尹圣雨 epoll epoll也是Linux下实现I O复用的一种方法 其性能优于select 基于select的I O复用服务器的设计缺陷 调用select函数后 针对所有文件描述符的循环语句 调用select
  • java IO、NIO、AIO详解

    目录 概述 一 IO流 同步 阻塞 二 NIO 同步 非阻塞 三 NIO2 异步 非阻塞 正文 回到顶部 概述 在我们学习Java的IO流之前 我们都要了解几个关键词 同步与异步 synchronous asynchronous 同步是一种
  • EPOLLRDHUP 不可靠

    我正在通过客户端 服务器 TCP 连接使用非阻塞读 写epoll wait 问题是 我无法使用以下方法可靠地检测 对等关闭连接 事件EPOLLRDHUP旗帜 经常会发生标志未设置的情况 客户端使用close 大多数时候 服务器从epoll
  • epoll(epoll_wait等)可用于iOS吗?

    我正着手将一些现有的 POSIX 兼容代码移植到 iOS 据我所知 pthreads 可用 良好 但编译器未找到 iOS 上可以使用 epoll 吗 No epoll是 Linux 特定的系统调用 达尔文内核上最接近的等价物是kqueue
  • 为什么在 epoll 中推荐使用非阻塞套接字

    我正在尝试学习如何将 epoll 用于 tcp 服务器应用程序 因为我期望有很多连接 我尝试检查示例和教程 他们总是建议使用 设置在 epoll 中添加的套接字为非阻塞套接字 为什么 对于级别触发的 epoll 非阻塞套接字可以帮助最大限度
  • 一次性*level*触发的epoll():EPOLLONESHOT是否意味着EPOLLET?

    是否可以使用epoll一击level 触发模式 我在搜索时没有找到任何相关信息 看来每个人都使用边缘触发模式 当 的时候EPOLLONESHOT标记被选中并且您已经为套接字提取了一个事件 那么该套接字不会像许多人想象的那样从 epoll 中
  • epoll_wait()接收socket关闭两次(read()/recv()返回0)

    我们有一个使用 epoll 来侦听和处理 http 连接的应用程序 有时 epoll wait 会连续两次收到 fd 上的 close 事件 含义 epoll wait 返回连接 fd 其中 read recv 返回 0 这是一个问题 因为

随机推荐

  • 在Windows10上安装CodeSoft 2015,系统蓝屏,解决办法

    最近公司电脑更新换代 xff0c 替换成Windows 10系统 xff0c 在安装CodeSoft 2015 标签软件时 xff0c 电脑蓝屏重启 xff0c 软件安装失败 xff0c 且无法卸载 xff0c 之后只能重装系统 在经过系统
  • Win10 WSL下 Ubuntu20.04 安装与卸载 Mysql 8.0

    一 查询并卸载旧的mysql xff08 未安装可以直接跳过 xff09 查看MySQL的依赖项 dpkg list grep mysql 关闭mysql服务 service mysql stop 自动卸载mysql xff08 包括ser
  • ios性能优化实践

    本文将从原理出发 xff0c 解释卡顿发生的原理 xff0c 然后会讲解项目中行之有效的几个优化点 xff0c 最后会展望一下接下来将要尝试的方向 下面进入正题 屏幕显示的原理 基本原理 屏幕显示原理 我们知道 xff0c 远古时代的CRT
  • MATLAB平面几何图形绘制实例

    MATLAB 平面几何图形绘制实例 实例一 运动控制测试图形 以下图形用于运动综合测试 xff0c 平面图形包含直线 圆弧 整圆 锐拐角 钝拐角 xff0c 能比较充分的测试各种轨迹 运动控制性能 输入圆心和半径可以调整图形大小和偏移 xf
  • Liunx系统ifconfig无法显示ip地址

    1 针对于Liunx的CentOS8 5系统 2 查看NetworkManager网络状态 nmcli n enabled设置下次开机时 xff0c 后面接的 unit 会被启动 开启NetworkManager网络 nmcli n on
  • CentOS8安装MySQL8.0版本遇到的问题

    41 错误1 xff1a libncurses so 5 64bit is needed by MySQL client 5 6 47 1 el6 x86 64以及 libtinfo so 5 64bit is needed by MySQ
  • LiunxCentOS8系统配置yum源

    更新yum源的原因如下 xff1a 因为LiunxCentOS8系统里面停止维护了 xff0c 导致yum无法使用必须自己配置一个yum源 如使用CentOS8系统自带的yum源进行下载安装则会出现以下错误 xff1a 错误 xff1a F
  • redis主从复制

    什么是redis主从复制 redis主从复制是指在redis集群中master节点和slave节点数据同步的机制 将写入redis服务器的数据复制到其他redis服务器里面实现数据同步 master节点负责写操作 xff0c slave节点
  • 单机千万并发连接实战

    c10k xff0c c100k xff0c c1000k等问题大家都已经司空见惯 xff0c 那么10m xff08 千万 xff09 并发连接呢 xff1f 今天就来一起挑战一下吧 准备机器 10m连接 xff0c 大家的个人电脑肯定无
  • mysql数据库dblink的使用

    1 使用mysql数据库里面的FEDERATED引擎 xff0c 这个必须要开启 show engines 我这里是开启了FEDERATED引擎 2 开启FEDERATED引擎 sed i 39 afederated 39 etc my c
  • CentOS8系统安装MySQL过程中遇到的错误问题

    1 启动过程中出现类似于 单元启动失败 错误 解决 xff1a 把之前初始化成功的文件删除掉 var lib mysql 这个文件 注 xff1a 如不想删除则可以备份起来 这是初始化之后生成的文件 1 再次初始化生成文件 mysqld i
  • Liunx系统CentOS Linux release 8.5.2111安装percona-toolkit

    官网 xff1a https www percona com downloads percona toolkit LATEST 依赖 xff1a yum install perl DBI perl DBD MySQL perl Time H
  • MySQL物理备份工具-xtrabackup

    依赖包 xff1a wget O etc yum repos d epel repo http mirrors aliyun com repo epel 7 repo yum y install perl perl devel libaio
  • 传输线与特性阻抗

    一 什么是传输线 我们经常会用到传输线这一术语 xff0c 可是讲到其具体定义时 xff0c 很多工程师都是欲言又止 xff0c 似懂非懂 我们知道 xff0c 传输线用于将信号从一端传输到另一端 xff0c 下图说明了所有传输线的一般特征
  • 51单片机中断号与定时器的工作方式

    中 断 号 interrupt 0 外部中断0 xff08 EX0 xff09 interrupt 1 定时器 计时器器中断0 xff08 ET0 xff09 interrupt 2 外部中断1 xff08 EX1 xff09 interr
  • delay函数

    在VC中使用带上头文件 include lt windows h gt 注意 在VC中Sleep中的第一个英文字符为大写的 34 S 34 在标准C中是sleep 不要大写 下面使用大写的来说明 具体用什么看你用什么编译器 简单的说VC用S
  • 51单片机的中断和定时(全面)

    定时器 计数器 51的定时器 计数器有2个分别是T1和T0 52系列的单片机有3个定时器 计数器 xff0c T0和T1是通用定时器 计数器 xff0c 定时器 计数器2 xff08 简称T2 xff09 是集定时 计数和捕获三种功能于一体
  • 什么是信号完整性?(大白话)

    什么是 信号完整性 xff1f 可能很多人仍然感觉这个词很陌生 xff0c 尤其是哪些没有接触过所谓高速PCB的工程师来说更是如此 于博士网就给大家做一个直观的说明 我们在用示波器测量PCB板上信号时 xff0c 经常会在信号的波形上发现一
  • 什么是高速PCB?

    高速PCB是一个很流行的名词 xff0c 那么到底什么是高速PCB xff1f 可能没几个人能说清楚 xff0c 原因在哪 xff1f 于博士网阐述一下我们对高速PCB这一名词的见解 有一种观点认为 xff1a 数字电路的速率达到或者超过4
  • epoll LT/ET 深入剖析

    epoll LT ET 深入剖析 EPOLL事件有两种模型 xff1a Level Triggered LT 水平触发 socket接收缓冲区不为空 有数据可读 读事件一直触发 socket发送缓冲区不满 可以继续写入数据 写事件一直触发