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

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

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

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

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

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

不过,2.6.17 版本内核中增加了 EPOLLRDHUP 事件,代表对端断开连接,关于添加这个事件的理由可以参见 “[Patch][RFC] epoll and half closed TCP connections”。

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

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

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

转载于:https://blog.51cto.com/no001/1314657

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. 计算机包括桌面计算机和便携式计算机,()计算机包括桌面计算机和便携式计算机这两种形式...
  2. python底层源码_Python每天一分钟:解析python底层类的实现原理——竟然是type()
  3. 分布式认证需求-统一认证授权
  4. 【全0、全1的地址干嘛用的】几类特殊的IP地址,网络号全0,主机号全1等
  5. JsonRequestBehavior.AllowGet 方便浏览器调试
  6. 用Flask开发Web版日历应用
  7. Kali Linux 无线渗透测试入门指南 第六章 攻击客户端
  8. java实现线性回归(简单明了,适合理解)
  9. linux 内核配置v4l2,深入理解linux内核v4l2框架之videobuf2【转】
  10. 浅谈Visual Studio 2010并行运算原理
  11. React五——React-router
  12. php从入门到精通分享,PHP从入门到精通学习路线图分享
  13. R:导入其他样式数据的方法
  14. 大黄,今年实在太难了!
  15. PTES标准中的渗透测试阶段
  16. grok java_Java Grok.match方法代码示例
  17. 由LHS和RHS深入理解javascript引擎与作用域的交互
  18. l那是计算机房吗,机房设计常用计算公式
  19. cordova 调起拨打电话
  20. JavaScript今日所学 数组

热门文章

  1. poll函数_I/O--多路复用的三种机制Select,Poll和Epoll对比
  2. C++:线程操作之CRITICAL_SECTION用法的介绍和例子理解
  3. 论文笔记之:Let there be Color!: Joint End-to-end Learning of Global and Local Image Priors for Automatic
  4. 中国火电设备市场发展方向与投资策略研究报告2022版
  5. java邮箱找回密码_Spring实现简单的邮箱找回密码功能
  6. android 数组赋值字符串_C语言奇淫技巧,字符串的三种表示方法,不会用不是合格的程序员...
  7. 廊田镇楼下村定点帮扶-农业大健康·李喜贵:功能性农业深加工
  8. 考察大新和南宁农业产业园 农业大健康·李喜贵:赋能乡村振兴
  9. Java使用Future设置方法超时
  10. node:express:error---填坑之路