iis服务器助手广告
返回顶部
首页 > 资讯 > 精选 >怎么处理Accept出现Emfile的问题
  • 246
分享到

怎么处理Accept出现Emfile的问题

2023-06-15 13:06:12 246人浏览 安东尼
摘要

这篇文章主要介绍了怎么处理Accept出现Emfile的问题,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。通常情况下,服务端调用 accept 函数会返回一个新的文件描述符,

这篇文章主要介绍了怎么处理Accept出现Emfile的问题,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

通常情况下,服务端调用 accept 函数会返回一个新的文件描述符,用于和客户端之间的数据传输

服务器开发中,有时会遇到这种情况:当调用 accept 函数接受客户端连接,函数返回失败,对应的错误码是 EMFILE,  它表示当前进程打开的文件描述符已达上限,此时,服务器不能再接受客户端连接

当遇到上述问题,怎么合理的处理呢,下面就来分析一下

建立连接的流程

先简单回顾下客户端和服务器建立连接的流程,具体的如下图所示:

怎么处理Accept出现Emfile的问题

客户端发起 SYN 请求

服务器收到客户端的 SYN 请求后,内核把连接放入半连接队列,同时给客户端返回一个 SYN + ACK

客户端向服务器返回一个确认的 ACK, 服务器收到本次 ACK  之后,三次握手完成,同时,内核把连接从半连接队列中移除,创建新完全连接,加入到全连接队列中

应用层调用 accept 函数从全连接队列中取出连接

上面的第 1、第 2、第 3 步是 tcp 的三次握手,它是由内核中TCP协议完成的, 第 4 步是应用层调用 accept 接口

在 epoll 中的问题

epoll 是 linuxio多路复用模型,在服务器的开发中有广泛的应用,下面就以 epoll 为例来详细说明

服务器端创建侦听文件描述符 listenfd 之后, 向 epoll 注册读事件

当 epoll 检测到 listenfd 上有读事件发生,会立即通知应用层,应用层调用 accept  接受新连接,而此时进程打开的文件描述符数量已经达到上限了,所以每次 accept 都是失败的

这里会出现以下几个问题

  1. 鸿蒙官方战略合作共建——HarmonyOS技术社区

  2. 由于 每次 accept 都失败了,相当于 listenfd 上的可读事件没有处理,epoll 会不停的触发 listenfd  上的可读事件,应用层也就会不停的调用 accept,然后又出现 accept 调用失败,如此这般不停的执行无效的循环,白白浪费了CPU的资源

  3. 上面提到服务器在不停的执行无效的循环, 将会引发另一个问题,如果此时有新客户端连接到来,建立连接的过程会很慢

前面说的 epoll 默认是使用了水平触发模式,如果使用垂直触发模式会出现什么问题呢?

垂直触发模式下,listenfd 从无读事件状态到有读事件状态时,才会通知到应用层,在应用层处理完 listenfd 上所有的读事件之前,epoll  不会再通知应用层

也就是说,应用层收到 listenfd 上读事件通知之后,需要把 listenfd 上所有的读事件全部处理完,下次listenfd  上再有读事件时,才会通知应用层

回到 accept 的问题上,在垂直触发模式下,当 epoll 通知应用层 listenfd 上有可读事件时,应用层调用 accept,  由于此时进程打开的文件描述符数量已经达到上限了,所以 accept 调用失败

也即 listenfd 上的可读事件还没有处理,在应用层处理完 listenfd 上可读事件之前,epoll 不会再通知应用层 listenfd  上有可读事件

如果在应用层处理完 listenfd 上可读事件之前,有新的客户端连接到来,这个时候 epoll 是不会通知应用层 listenfd  上有可读事件,这会导致一个严重的问题:accept 只要出现了 EMFILE的错误码,就再也无法接受客户端的连接了

所以,当出现 EMFILE 时,不管使用 epoll 的水平触发模式还是垂直触发模式都会存在问题

如何解决

EMFILE 表示进程打开的文件描述符数量达到上限了,可以把这个值调大些,但这治标不治本

本来系统设置文件描述符数量上限是为了限制进程对系统资源的过度占用,况且,这个值调整到多大合适呢,总不能无限大吧,所以调整上限值的方式不是最合适的方式

accept 成功时会返回一个新的文件描述符,如果此时进程打开的文件描述符数量已经达到上限了,就会返回失败

假如此时能关闭一个空闲的文件描述符,让出一个名额,再调用 accept 就会创建成功,这种方式具体的处理步骤如下:

事先准备一个空闲的文件描述符 idlefd,相当于先占一个"坑"位

调用 close 关闭 idlefd,关闭之后,进程就会获得一个文件描述符名额

再次调用 accept 函数, 此时就会返回新的文件描述符 clientfd, 立刻调用 close 函数,关闭 clientfd

重新创建空闲文件描述符 idlefd,重新占领 "坑" 位,再出现这种情况的时候又可以使用

由于测试代码比较长,这里就不贴了,感兴趣可以通过文末的方式获取,下面是处理 EMFILE 的伪代码:

int ret = accept( listenfd, (struct sockaddr*)&addr, sizeof(addr) );  if (-1 == ret) {   if ( errno == EMFILE )   {      //关闭空闲文件描述符,释放 "坑"位      close(idlefd);            //接受 clientfd      clientfd = accept( listenfd, nullptr, nullptr);      //关闭 clientfd,防止一直触发 listenfd 上的可读事件      close(clientfd);            //重新占领 "坑"位      idlefd = ::open("/dev/null", O_RDONLY | O_CLOEXEC);   } }

感谢你能够认真阅读完这篇文章,希望小编分享的“怎么处理Accept出现Emfile的问题”这篇文章对大家有帮助,同时也希望大家多多支持编程网,关注编程网精选频道,更多相关知识等着你来学习!

--结束END--

本文标题: 怎么处理Accept出现Emfile的问题

本文链接: https://www.lsjlt.com/news/280368.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 怎么处理Accept出现Emfile的问题
    这篇文章主要介绍了怎么处理Accept出现Emfile的问题,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。通常情况下,服务端调用 accept 函数会返回一个新的文件描述符,...
    99+
    2023-06-15
  • MySQL5出现乱码问题的处理办法
    本篇内容介绍了“MySQL5出现乱码问题的处理办法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1 设置M...
    99+
    2024-04-02
  • mysql 5.1升5.6 升级后出现问题怎么处理
    这篇文章主要为大家展示了“mysql 5.1升5.6 升级后出现问题怎么处理”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“mysql 5.1升5.6 升级后出现...
    99+
    2024-04-02
  • 亚马逊代理服务器出现问题怎么处理呢
    1. 确认问题 首先,需要确认亚马逊代理服务器出现问题的具体情况。可以通过以下方式进行确认: 检查代理服务器的连接状态,确认是否能够正常连接。 检查代理服务器的日志,查看是否有异常信息。 尝试使用其他代理服务器进行连接,确认是否是代理服...
    99+
    2023-10-27
    亚马逊 代理服务器 怎么处理
  • 亚马逊代理服务器出现问题怎么处理好
    1. 了解亚马逊代理服务器 在处理亚马逊代理服务器出现问题之前,我们需要了解一下什么是亚马逊代理服务器。亚马逊代理服务器是一种用于访问亚马逊网站的服务器,它可以帮助用户隐藏其真实 IP 地址,从而保护用户的隐私和安全。亚马逊代理服务器通常...
    99+
    2023-10-27
    亚马逊 代理服务器 怎么处理
  • Ubuntu中处理系统更新时出现的问题怎么解决
    在Ubuntu中处理系统更新时出现的问题可能需要根据具体情况进行解决。以下是一些常见问题及其可能的解决方法: 更新过程中出现错误...
    99+
    2024-03-05
    Ubuntu
  • 华为云服务器出问题怎么处理
    如果您的华为云服务器出现了问题,您可以尝试以下几种方法来处理: 清除数据:清除所有与系统相关的数据,可以在系统日志文件中找到相关的信息。 更新服务器配置:您可以通过手动更新服务器配置来修复服务器问题。 重启服务器:如果您的华为云服务器是...
    99+
    2023-10-26
    华为 怎么处理 服务器
  • 美国服务器出现卡顿问题应该怎么处理
    美国服务器出现卡顿问题的处理方法:1、及时更新美国服务器系统,减少故障排查时间;2、将美国服务器上冗余文件和帐户进行清除,降低服务器空间占用率;3、使用美国服务器过程中不要忽视重复问题,需要及时对故障问题进行处理,防止黑客利用问题漏洞进行入...
    99+
    2024-04-02
  • docker安装rocketMQ和安装过程中出现问题怎么处理
    小编给大家分享一下docker安装rocketMQ和安装过程中出现问题怎么处理,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!本文主要介绍安装rocketMQ4.4.0,主要分为四步,分别为:1、拉取rocketmq镜像。2...
    99+
    2023-06-22
  • 怎么处理HDFS问题
    这篇文章主要介绍“怎么处理HDFS问题”,在日常操作中,相信很多人在怎么处理HDFS问题问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么处理HDFS问题”的疑惑有所帮助!接...
    99+
    2024-04-02
  • 怎么处理Docker代理问题
    本篇内容主要讲解“怎么处理Docker代理问题”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么处理Docker代理问题”吧!在本地安装Kubernetes时,遇到错误消息:request ca...
    99+
    2023-06-04
  • Oracle数据库中出现的坏块问题如何处理
    本篇内容主要讲解“Oracle数据库中出现的坏块问题如何处理”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Oracle数据库中出现的坏块问题如何处理”吧!一:什...
    99+
    2024-04-02
  • 怎么处理Oracle OER 7451的问题
    这篇文章主要讲解了“怎么处理Oracle OER 7451的问题”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么处理Oracle OER 7451的问题”...
    99+
    2024-04-02
  • PHP出现启动问题怎么办?
    标题:PHP出现启动问题怎么办?解决方法及代码示例 近年来,PHP作为一种流行的服务器端脚本语言,在Web开发中得到了广泛应用。然而,有时候在使用PHP时会遇到启动问题,这可能会让开发...
    99+
    2024-03-12
    调试php php启动问题 问题解决方法 php脚本
  • win10出现config.msi问题怎么解决
    要解决Windows 10中的config.msi问题,可以尝试以下方法: 重命名config.msi文件夹:首先,打开资源管理...
    99+
    2024-02-29
    win10
  • c#闭包出现的问题怎么解决
    在C#中,闭包可能会引发内存泄漏或者变量捕获不正确的问题,可以通过以下方法来解决: 手动解除闭包引用:在闭包中,确保不再需要引用...
    99+
    2024-04-02
  • win2003出现各种硬件故障问题时的处理方法
    在电脑的使用过程中,电脑在硬件设施上难免会出现一些问题。Windows 2003系统在针对服务器的需求上,对声卡、显卡等硬件的默认设置做了处理,因此,大多数用户在使用时经常会碰到一些“故障”。那么...
    99+
    2023-06-01
    win2003 硬件故障 硬件 问题 处理 故障
  • 域名解析出问题如何处理
    域名解析出问题的处理方法:1、检查网站域名解析时,域名是否设置正确;2、网络不稳定时会导致域名解析不成功,因此需要检查网站空间是否存在故障问题;3、注册商一般都是用自身服务器进行域名解析的,因此需要检查域名供应商的操作是否存在问题;4、DN...
    99+
    2024-04-02
  • 解决bat批处理输出乱码的问题
    乱码原因 Windows的cmd.exe默认编码格式为ANSI 简体中文版的Windows, 其ANSI对应微软Codepage为cp936 大致等同于GBK编码 如果你的bat文...
    99+
    2024-04-02
  • oracle锁表问题怎么处理
    本篇内容介绍了“oracle锁表问题怎么处理”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! ...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作