在对系统问题进行排查时,我发现了一个奇怪的现象:明明是对方断开连接,系统却报告一个查询失败的错误,但从用户角度来看请求的结果正常返回,没有任何问题。

对这个现象深入分析后发现,这是一个基于epoll的连接池实现上的问题,或者说是特性。

首先解释一下导致这个现象的原因。

在使用epoll时,对端正常断开连接(调用close()),在服务器端会触发一个epoll事件。在低于2.6.17版本的内核中,这个epoll事件一般是EPOLLIN,即0x1表示连接可读。

连接池检测到某个连接发生EPOLLIN事件且没有错误后,会认为有请求到来,将连接交给上层进行处理。这样以来,上层尝试在对端已经close()的连接上读取请求,只能读到EOF,会认为发生异常,报告一个错误。

因此在使用2.6.17之前版本内核的系统中,我们无法依赖封装epoll的底层连接库来实现对对端关闭连接事件的检测,只能通过上层读取数据进行区分处理。

因此在使用2.6.7版本内核中增加EPOLLRDHUP事件,表示对端断开连接,关于添加这个事件的理由可以参见 http://lkml.org/lkml/2003/7/12/116。

在使用2.6.17之后版本内核的服务器系统中,对端连接断开触发的epoll事件会包含EPOLLIN | EPOLLRDHUP,即0x2001。有了这个事件,对端断开连接的异常就可以在底层进行处理了,不用再移交到上层。

重现这个现象的方法很简单,首先telent到server,然后什么都不做直接退出,查看在不同系统中触发的事件码。

注意,在使用2.6.17之前版本内核的系统中,sys/epoll.h的EPOLL_EVENTS枚举类型中是没有EPOLLRDHUP事件的,所以带EPOLLRDHUP的程序无法编译通过。

EPOLL事件之EPOLLRDHUP相关推荐

  1. EPOLL 事件之 EPOLLRDHUP

    在对系统问题进行排查时,我发现了一个奇怪的现象:明明是对方断开请求,系统却报告一个查询失败的错误,但从用户角度来看请求的结果正常返回,没有任何问题. 对这个现象深入分析后发现,这是一个基于 epoll ...

  2. 【Nginx】epoll事件驱动模块

    Linux 2.4之前的内核版本号,Nginx事件驱动的方法是使用poll.select功能.过程必须等待一个事件发生在连接上(接收数据)时间,部连接都告诉内核,由内核找出哪些连接上有事件发生.因为须 ...

  3. linux epoll事件模型详解

    一.介绍 epoll是Linux(内核版本2.6及以上支持)下多路复用IO接口select/poll的增强版本,它能显著提高程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率,因为它会复用文件 ...

  4. 简约而不简单epoll之EPOLLRDHUP

    上一篇主要介绍EPOLLOUT,本篇介绍EPOLLRDHUP.在内核2.6.17(不含)以前版本,要想知道对端是否关闭socket,上层应用只能通过调用recv来进行判断,在2.6.17以后,这种场景 ...

  5. 利用epoll写一个迷你的网络事件库

    epoll是linux下高性能的IO复用技术,是Linux下多路复用IO接口select/poll的增强版本,它能显著提高程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率.另一点原因就是获取 ...

  6. select事件有哪些_Android 深入底层:Linux事件管理机制 epoll

    在linux 没有实现epoll事件驱动机制之前,我们一般选择用select或者poll等IO多路复用的方法来实现并发服务程序.在linux新的内核中,有了一种替换它的机制,就是epoll. sele ...

  7. epoll边缘触发_epoll事件通知机制详解,水平触发和边沿触发的区别

    看到网上有不少讨论epoll,但大多不够详细准确,以前面试有被问到这个问题.不去更深入的了解,只能停留在知其然而不知其所以然.于是,把epoll手册翻译一遍,更深入理解和掌握epoll事件处理相关知识 ...

  8. epoll EPOLLOUT事件未触发

    记录一次epoll事件未触发的经历,由于是tcp通信,使用了io多路复用epoll,客户端只发送数据,不处理服务端响应,服务端处理对应的事件,并且会响应消息给客户端,遇到了EPOLLOUT事件未触发的 ...

  9. Linux编程入门三网络编程三 epoll的LT和ET模式以及EPOLLONESHOT事件

    epoll对文件描述符的操作有两种模式:LT(Level Trigger 电平触发)模式和ET(Edge Trigger 边沿触发)模式. LT是默认的工作模式,这种模式下epoll相当于一个效率较高 ...

最新文章

  1. 顺序队列之C++实现
  2. PyQt5 技术篇-鼠标移动控件显示提示,Qt Designer控件提示设置方法。
  3. numpy.linspace详解
  4. MySQL复制表-INSERT INTO SELECT
  5. 【Linux】一步一步学Linux——cp命令(31)
  6. android dialog 结构,Android 原生Dialog实现
  7. 计算机科学导论课后单词,计算机科学导论课后总结
  8. RxHttp 一条链发送请求之强大的Param类(三)
  9. 数据库面试要点:关于MySQL数据库千万级数据查询和存储
  10. layui前端页面table表格怎么格式化转换时间_个人经历:我的前端学习历程
  11. 图像数据流识别圆形_python opencv :使用Hough变换检测圆形,数钱。
  12. Caffe学习系列(16):caffemodel可视化
  13. 最详细的Quartus + Modesim完整波形仿真过程
  14. KNX智能照明系统在福安中医院的应用
  15. python培训大数据分析师_CPDA数据分析师需要深入的学习python等工具吗?
  16. sql server的linux版命令行,Linux配置SQLServer
  17. Java语言实现文本转语音
  18. 现代汉语常用3500字=常见字2500字+次常见字1000字
  19. Python+OpenCV中的Shi-Tomasi角点检测实现(附代码)
  20. PHPExcel出现 Formula Error的解决方案

热门文章

  1. 2021牛客多校1 - Find 3-friendly Integers(数位dp)
  2. HDU - 4333 Revolving Digits(扩展KMP)
  3. UVa810 A Dicey Problem 筛子难题
  4. Jupyter-进阶教程
  5. 不平等博弈问题学习记录(一)(超实数篇)
  6. 2.IDA-数据显示窗口(反汇编窗口、函数窗口、十六进制窗口)
  7. windbg 符号表
  8. 另一种sysenter hook方法(绕过绝大多数的rootkit检测工具的检测)
  9. C,C++中使用可变参数
  10. 网卡MAC地址相关信息大全