epoll的 et,lt关注点

epoll ET LT性能测试 结论 总体来看两者差距不大,甚至LT比ET还稍微好一点。两者区别:epoll的句柄是否对缓冲区的变化进行状态变化。 绑定的单核cpu 16GB内存 centos 7.0 gcc 版本 4.8.5 使用taskset绑定为单核,ab压测 taskset -cp 6 10714 ab -n 50000 -k 127.0.0.1/ ET: Requests per second: 497... 阅读详情
epoll模型有两种工作模式,ET和LT,两种模式下都有一些细节值得注意,以下是一些思考:
 
一、ET模式下
Q1: 调用accept时,到底TCP完成队列里有多少个已经建立好的连接?
这里又得分情况来说:
  • 没有连接。这种情况发生在TCP连接被客户端夭折,即在服务端调用accept之前客户端给出一个RST。该RST导致刚刚建立好的连接从服务器端的TCP完成队列中被移出。源自berkeley的实现会在内核处理该事件,并不会将该事件通知给服务程序,如果套接口被设置为阻塞模式,就会导致accept函数被阻塞,程序挂起,一直要等到下一个连接到来,这也是为什么采用非阻塞的accept的原因;其他的实现通常会返回ECONNABORTED或EPROTO错误。

解决方法: 采用非阻塞的accept,在accept返回后处理ECONNABORTED、EPROTO、EINTR错误。

  • 一个以上的连接。一个连接很容易理解,多个连接的情况出现在有多个连接请求同时到达的情况,由于是边缘触发,epoll_wait只返回一次,然后调用accept处理一个请求。这会导致TCP完成队列中依然存在连接未被处理。

解决办法: 1):将该套接口设置为非阻塞模式,然后将accept用while循环包住,处理完TCP完成队列中的所有连接再跳出循环。2): 将accept放入一个单独的线程中,这样还可以采用阻塞模式。

Q2: read函数应当如何处理?

read函数有可能不能够一次将内核缓冲的数据读完,由于采用的ET模式,epoll_wait不会因为内核缓冲区还有数据而继续返回。这就会导致内核数据不能及时、完全地读到服务程序。

解决办法: 将套接口设置为非阻塞,再用while循环包住read一直读到产生EAGAIN错误,采用非阻塞套接口的原因在于防止read被阻塞住。网上看见有的朋友说也可以采用阻塞套接口,判断read的返回值是否小于期望值,小于就证明数据读完,但是个人认为这里存在一个临界情况,比如内核缓冲有2048字节,期望读1024字节,读完第二次后read返回的是1024,等于期望值,于是再读,但此时内核已经没有数据,于是read被阻塞(自个的思考,不知有务否)。

Q3: 写缓冲区什么时候可以导致epoll_wait函数返回可写状态?

个人对这个问题不是很清楚,按资料说法是该缓冲区从不可写变为可写则返回,那么该套接口刚创建的时候处于可写状态,是否会导致一直返回不了可写状态,也就是说第一次永远返回不了,因为没有任何调用会使该套接口从不可写变为可写。

另外,写的时候还有些什么要注意的么?

二、LT模式下

Q1: accept函数

accept函数同样存在连接被夭折的情况,和ET模式下类似。但这种模式下不会存在处理不完多个请求的情况。因为只要有连接存在TCP完成队列中,epoll_wait就会一直返回。

Q2: read函数

同样可以避免因为一次读不完内核缓冲区的数据的情况。

Q3: 当内核写缓冲空闲时,可写状态会一直返回,如何处理?(这个曾是tencent的一个面试题)

A1: 不将可写条件加入epoll集中,采用非阻塞I/O,有数据可写时,直接写,如果返回是EAGAIN,则将可写加入epoll集中,写完后移出。


通常都是写失败情况下,才会将写加入epoll中操作


epoll原理与嵌入式高并发网络编程实战 epoll是Linux系统中实现I/O多路复用的核心机制,其本质是通过红黑树和就绪链表构建的事件驱动模型,取代传统select/poll的线性轮询。原理上,它将监控注册与事件通知分离,以内核回调替代用户态轮询,实现O(1)就绪检测与零拷贝通知。技术价值在于显著提升单机连接承载能力与CPU能效比,尤其适配嵌入式网关、工业协议服务器等资源受限但需百万级长连接的场景。典型应用包括MQTT代理、Modbus TCP网关、CoAP服务等,结合ET模式与Reactor架构可进一步优化实时性与功耗。本文深入解析epoll 阅读详情

相关推荐

多路转接 [ epoll ]

摘要 本文详细介绍了Linux中的高效I/O多路复用机制epoll,对比了select/poll的不足,如文件描述符数量限制和效率问题。epoll通过红黑树管理文件描述符,使用就绪队列和回调机制实现O(1)时间复杂度的事件检测。文章解析了epoll的核心接口(epoll_create、epoll_ctl、epoll_wait)及底层原理,包括红黑树节点结构、就绪队列和回调机制。最后,通过一个简单的EchoServer示例代码展示了epoll的实际应用,并指出后续需解决的问题,如完整报文接收和多线程处理。

Small_entreprene的博客 981

认识epoll模型的两种工作方式 以及 ET模式必须设为非阻塞的原因

了解EPOLL模型中的ET模式以及使用ET模式的两个要求

challenglistic的博客 3887

DRAM 埋入式字线(Buried Wordline)技术深度解析:从二维平面到三维凹槽

埋入式字线(bWL)及其核心的埋入式沟道阵列晶体管(BCAT)架构,无疑是 DRAM 发展史上的一次关键性革命。它在约 40nm 技术节点被行业主流采纳,成功地帮助 DRAM 产业克服了传统平面晶体管的物理缩放极限。力挽狂澜的续命技术:bWL 通过引入三维沟道结构,从根本上解决了由短沟道效应和漏电流失控引发的数据保持危机,为经典的 1T1C(单晶体管 - 单电容)DRAM 单元架构延续了超过十年的生命力。协同优化的基石技术。

m0_37606066的博客 3325

了解epoll模型的作用原理

简单了解epoll模型的作用原理

challenglistic的博客 1592

H3C交换机Console口连接全攻略:从接线到PuTTY配置(附常见问题排查)

本文详细介绍了H3C交换机Console口的连接与配置方法,包括硬件线缆选择、驱动安装、PuTTY参数设置及常见问题排查。特别针对Console转USB线缆的兼容性和驱动安装难点提供实用建议,帮助网络工程师快速掌握串联调试技巧,解决连接中的黑屏、乱码等典型问题。

weixin_42549451的博客 674

MultiOTP Credential Provider避坑指南:从安装到RDP双因素认证的全流程解析

本文详细解析了MultiOTP Credential Provider从安装到实现RDP双因素认证(MFA)的全流程,重点分享了Docker部署、Active Directory集成及网络级认证(NLA)兼容性等环节的实战避坑经验,旨在帮助运维人员高效、稳定地部署离线双因素认证方案,提升Windows远程桌面安全性。

weixin_29255731的博客 642

【Linux高性能服务器编程】:9、select/poll/epoll系列 系统调用

无

哥特的博客 444

将AAL图谱对应到Yeo7大网络中【原理,代码分析】

本文介绍了将AAL2图谱映射到Yeo7大功能网络的方法。通过整合皮层(Yeo2011)、小脑(Buckner2011)和纹状体(Choi2012)三个区域的功能网络图谱,采用投票机制确定每个AAL区域的网络归属。具体步骤包括:1)统计每个AAL区域体素在各网络图谱中的分布;2)选择体素数量最多的网络作为该区域的最终标签。该方法实现了从解剖结构到功能网络的映射,可获得120个AAL区域对应的7大功能网络标签。

yes666666的博客 2204

使用epoll进行高性能网络编程

提升网络I/O 性能 翻译:韩红军。hanhj@vrlab.buaa.edu.cn ; hongjun_han@163.com原文出自:https://www.captech.com.cn英文原文:http://www.xmailserver.org/linux-patches/nio-improve.html 由于水平有限,错误在所难免,希望各位指正。 07-01-2001 – 初稿 - Dav

漂泊的程序人生 5271

在Ubuntu系统中安装和使用wxPython进行Python图形用户界面(GUI)开发

在本文中,我将向您展示如何在Ubuntu系统上安装和使用wxPython,并提供一些示例代码来帮助您开始使用这个强大的工具。在MyFrame的构造函数中,我们创建了一个wx.Panel和一个按钮,并将按钮的点击事件绑定到一个自定义的方法on_button_click上。最后,我们创建了一个wx.App的实例,创建了一个MyFrame对象并显示它,最后通过调用app.MainLoop()启动应用程序的主事件循环。这只是一个简单的示例,但它演示了如何使用wxPython创建一个基本的GUI应用程序。

qq_37934722的博客 1038

Android16 RK3576修改亮度调节为线性调节

文章摘要: 本文分析了Android系统中亮度调节的非线性问题,并提供了线性化改造方案。首先通过追踪Settings和SystemUI代码,发现亮度调节使用了BrightnessUtils类中的非线性Gamma空间转换算法。然后重点修改了BrightnessUtils类,将原有的Hybrid Log Gamma(HLG)算法替换为简单的线性映射公式。最后在自定义工具窗口中实现了基于系统标准接口的亮度调节功能,通过SeekBar的0-100%百分比值线性映射到1-255的系统亮度值。改造后的亮度调节更加直观,

tzj1058756809的博客 75

UNIX网络编程——epoll的 et,lt关注点

epoll模型有两种工作模式,ET和LT两种模式下都有一些细节值得注意,以下是一些思考: 一、ET模式下Q1:调用accept时,到底TCP完成队列里有多少个已经建立好的连接?这里又得分情况来说:没有连接。这种情况发生在TCP连接被客户端夭折,即在服务端调用accept之前客户端给出一个RST。该RST导致刚刚建立好的连接从服务器端的TCP完成队列中被移出。源自berkeley的实现会在内核处理该

ctthuangcheng 3083

从基础到前沿:深度剖析光束整形与扫描技术

光束扫描的核心在于通过特定手段改变光束的传播方向,从而实现对目标区域的扫描。在这个过程中,振镜、声光偏转器、电光偏转器等元件发挥着关键作用。振镜是一种常见的光束扫描元件,它主要由电机、反射镜和透镜组成。当电机驱动反射镜旋转时,根据光的反射定律,反射镜会改变入射光线的反射方向。假设初始时光束垂直入射到反射镜上,当反射镜绕某一轴旋转一定角度时,光束的反射方向就会相应改变,从而实现光束在空间中的扫描。在激光打标设备中,通过控制振镜的快速摆动,能够使激光束在工件表面快速移动,完成各种图案和文字的标记。

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 2098

epoll详解

在一个非阻塞的socket上调用read/write函数,返回EAGAIN或者EWOULDBLOCK(注:EAGAIN就是EWOULDBLOCK)。 从字面上看,意思是:   EAGAIN: 再试一次EWOULDBLOCK:如果这是一个阻塞socket, 操作将被blockperror输出:Resource temporarily unavailable 总结:

一直在路上 1203

【生信分析】clusterProfiler: universal enrichment tool for functional and comparative study(1)

clusterProfiler: universal enrichment tool for functional and comparative studyClusterProfiler: 用于功能和比较研究的通用富集工具总览1. 引言1.1 术语1.1.1 基因集和通路1.1.2 基因同源(GO)1.1.3 京都基因与基因组百科全书(KEGG)1.1.4 其他基因集2. 功能富集分析方法2.1 过度表征分析(Over Representation Analysis)2.2 基因集富集分析(Gene Se

小哲的博客 1365

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

监听socket和epoll的ET模式

同事遇到一个问题,他的一个服务器,在用ab压力测试时发现有时会阻塞。 ab测试: $ ab -v4 -c1 -n100 "http://127.0.0.1:19988/getprice" ab的并发数(-c选项)是1的话,程序运转正常;并发数大于1时,很容易出现阻塞现象。 我自己用epoll(ET)写了个测试程序,服务器收到客户端连接后,把accept下来的socket扔到epoll中...

iteye_13578的博客 398

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Linux IO 模型纵深解析 05:epoll 的诞生

epoll是Linux高并发IO的核心模型,通过事件驱动机制重构了IO处理方式。相比select/poll的轮询扫描,epoll采用状态变更主动通知机制,将时间复杂度从O(n)降为O(1)。其核心设计包括:1)将监听集合维护与等待过程解耦;2)通过红黑树管理fd集合;3)使用就绪队列存储活跃事件。epoll的价值不仅在于性能优化,更在于确立了事件驱动编程范式,为Nginx、Redis等高性能网络应用奠定了基础。文章将从系统调用接口、内核数据结构到事件回调机制,深入剖析epoll的设计原理与工程实践。

a1933580388的博客 644

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

浅聊一下epoll

events:分配好的 epoll_event 结构体数组,epoll 将会把发生的事件赋值到events 数组中(events 不可以是空指针,内核只负责把数据复制到这个 events 数组中,不会去帮助我们在用户态中分配内存)。:关注点是变化,只要缓冲区的数据有变化(从无到有,或者从有到无,或者变多变少),epoll_wait就会返回就绪。:关注点在于数据是否有无,只要读缓冲区不为空,写缓冲区不满,那么epoll_wait就会一直返回就绪,水平触发是epoll的默认工作方式。

qq_45812901的博客 523

UNIX网络编程——epoll 的accept , read, write(重要)

在一个非阻塞的socket上调用read/write函数,返回EAGAIN或者EWOULDBLOCK(注:EAGAIN就是EWOULDBLOCK)。       从字面上看,意思是: EAGAIN: 再试一次 EWOULDBLOCK:如果这是一个阻塞socket, 操作将被block perror输出:Resource temporarily unavailable总结:       这个错误表示

ctthuangcheng 4062

UNIX网络编程之epoll的 accept , read , write

本文转载自:http://www.it165.net/os/html/201308/5868.html 非阻塞模式下的网络编程,非阻塞模式常常需要不停地进行轮询,大量耗费CPU资源,这种方式并不可取。 在一个非阻塞的socket上调用read/write函数,返回EAGAIN或者EWOULDBLOCK(注:EAGAIN就是EWOULDBLOCK)。 从字面上看,意思是: EAGA...

weixin_34044273的博客 83

UNIX网络编程之epoll 的accept , read, write(重要)

在一个非阻塞的socket上调用read/write函数,返回EAGAIN或者EWOULDBLOCK(注:EAGAIN就是EWOULDBLOCK)。 从字面上看,意思是:   EAGAIN: 再试一次EWOULDBLOCK:如果这是一个阻塞socket, 操作将被blockperror输出:Resource temporarily unavailable 总结:

闪电小子 613

UNIX网络编程之epoll 的accept , read, write(重要) C语言版本

在一个非阻塞的socket上调用read/write函数,返回EAGAIN或者EWOULDBLOCK(注:EAGAIN就是EWOULDBLOCK)。 从字面上看,意思是:   EAGAIN: 再试一次EWOULDBLOCK:如果这是一个阻塞socket, 操作将被blockperror输出:Resource temporarily unavailable 总结:

WHACKW的专栏 1024
上一篇: epoll 的accept , read, write(重要)
下一篇: shared_ptr 的使用及注意事项
dodo_check
博客等级 码龄19年 29粉丝 21原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值