剖析 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 的性能瓶颈需要视应用场景而定,不可一概而论。

时间: 2024-08-17 18:26:46

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

mysql redo/binlog 放在ssd盘或SAS盘性能差异测试

背景:写这篇博客主要原因是因为看到某司线上数据库都配置了SSD盘,但是他们却把redo文件放在普通SAS盘,看到这个忽然想到这配置SSD盘有什么作用呢?对数据库的性能到底是否有提升? 以下是我用sysbench测试的结果: ./sysbench --test=tests/db/update_non_index.lua --mysql-user=dbauser --mysql-password= --mysql-port=3307 --oltp-table-size=1000000 --oltp-

一个字节造成的巨大性能差异——SQL Server存储结构

今天同事问了我一个SQL的问题,关于SQL Server内部存储结构的,我觉得挺有意思,所以写下这篇博客讨论并归纳了一下.问题是这样的: 首先我们创建两张表,一张表的列长度是4039字节,另一张表的长度是4040字节,他们就只有一个字节的差距,比如以下创建表的SQL: CREATE TABLE tb4039(c1 INT IDENTITY,c2 char(4035) not null)CREATE TABLE tb4040(c1 INT IDENTITY,c2 char(4036) not nu

.NET深入学习笔记(1):DataSet和SqlDataReader性能差异深入剖析

DataSet和SqlDataReader的比较的文章和帖子网上已经很多,我也看了很多前辈的随笔.自己在面试和实际工作中也遇到这样的问题.但是始终是没深入进行学习.最近在工作空闲之余,特地查阅了一些文章,也包括msdn的官方文档.自己建立数据库和测试程序,对DataSet和SqlDataReader做了比较. 首先关于两者比较主流的观点就是: 1.DataReader使用时始终占用SqlConnection,在线操作数据库.DataSet则是将数据一次性加载在内存中.支持数据库访问的断开连接模型

比较一下以“反射”和“表达式”执行方法的性能差异

由于频繁地使用反射会影响性能,所以ASP.NET MVC采用了表达式树的方式来执行目标Action方法.具体来说,ASP.NET MVC会构建一个表达式来体现针对目标Action方法的执行,并且将该表达式编译成可执行代码.编译后的可执行代码体现为一个委托对象,该委托对象会被缓存起来以用于针对同一个Action方法的执行.为了让大家能够和直观地理解两种(直接利用反射和利用表达式编译后的委托对象)方法执行在性能上的差异,我们来做一个简单的实例演示.我们在一个控制台应用中定义了如下一个Foobar类型

简单代码的性能差异

性能 <.net 框架程序设计>里的几句代码,我重新整理了一下,写成函数,这样下面的反编译代码看起来更方便点: public void Boxing() { Int32 v = 5; Console.WriteLine("{0},{1},{2}",v,v,v); } public void Boxing1() { Int32 v = 5; object o = v; Console.WriteLine("{0},{1},{2}",o,o,o); }两个函

硬件防火墙性能差异的鉴别方法

有一些问题常令用户困惑:在产品的功能上,各个厂商的描述十分雷同,一些"后起之秀"与知名品牌极其相似.面对这种情况,该如何鉴别?描述得十分类似的产品,即使是同一个功能,在具体实现上.在可用性和易用性上,个体差异也十分明显. 一.网络层的访问控制 所有防火墙都必须具备此项功能,否则就不能称其为防火墙.当然,大多数的路由器也可以通过自身的ACL来实现此功能. 1.规则编辑 对网络层的访问控制主要表现在防火墙的规则编辑上,我们一定要考察:对网络层的访问控制是否可以通过规则表现出来?访问控制的粒

Hadoop中master和slave机器性能差异怎么分配好,master需要好性能或说slave可以差一点?

问题描述 我的Hadoop集群配置如下:master:机子性能非常好,内存8G,硬盘1T以上4个slaves:全是差机子,内存只有2G,真正剩余的只有1G左右,硬盘500G主要看内存,master和slaves差别有点大,不知道这样的配置是不是非常不好,因为我实际测试起来效果不太理想,经常还出现"outofmemory"的错误,我想问的是slave机子的性能需要和master一样好吗?master负责调度.资源分配等任务,需要好性能,而slaves只是负责执行程序,只要内存够执行程序应

从内存方面解释Java中String与StringBuilder的性能差异_java

以前经常在网上看到关于Java字符串拼接等方面的讨论.看到有些Java开发人员在给新手程序员的建议中类似如下写道: 不要使用+号拼接字符串,要使用StringBuffer或StringBuilder的append()方法来拼接字符串. 不过,用+号拼接字符串就真的那么令人讨厌,难道使用+号拼接字符串就没有一点可取之处吗? 通过查阅Java API文档中关于String类的部分内容,我们可以看到如下片段: "Java 语言提供对字符串串联符号("+")以及将其他对象转换为字符串

最薄平板iPad Air2与iPad mini3性能差异引关注

[环球网综合报道]据日本Livedoor新闻10月17日报道,苹果公司近日发布了新型平板iPadAir和 iPadmini3,本文将就新产品的性能作以诠析.与之前iPadAir和配备了Retina显示屏的iPadmini仅存在分辨率上的差距有所不同,本次发布的新产品性能上有很大改进,这是消费者在购买时所需关注的,具体 如下: iPadAir2 该机搭载了面向iPhone6研发的强化图形处理性能的AppleA8X处理器,相比于第一代iPadAir,CPU性能提升了40%,图形处理性能提升了2.5倍