当前位置: 首页 > news >正文

Too many open files 问题处理

某个简单的 python 服务,运行一段时间就崩溃。查看日志后发现有一个系统错误

OSError: Errno24 Too many open files

要理解这个问题,首先要理解什么是文件描述符,可以参考我的另一篇文章(Linux 系统文件描述符(File Descriptor)小白级介绍).

简言之,就是 linux 系统每个进程会维护一张文件描述符表,而这个表是有大小限制的,用来控制每个进程可以打开的最多文件描述符数量。

如果一个进程打开了过多的文件,当再次尝试打开文件时,就会因为系统限制,产生 “Too many open files” 的错误。

1. 解决思路

  1. 问题产生时(不是事前和事后,而是事中),查看当前进程打开了哪些文件描述符,结合程序逻辑分析是正常情况还是异常情况
  2. 正常情况:查看和修改文件描述符数量限制
  3. 异常情况:
    • 查看是否有未正确关闭的资源使用(文件、网络、数据库)
    • 是否代码异常导致过多的打开文件,例如循环中打开了过多的文件

1.1 如何查看当前进程打开的文件描述符信息

# 查看指定进程打开的文件描述符
lsof -p <pid># 统计打开的文件描述符数量
lsof -p <pid> | wc -l

详细参考

1.2 如何查看和修改单进程文件描述符数量限制

  • 查看:ulimit -n
  • 临时修改:ulimit -n <数值>(仅作用于当前的 shell)
  • 永久修改:编辑文件 /etc/security/limits.conf,按照如下格式编辑
    * soft nofile 65535
    * hard nofile 65535
    
    • 第一列:
      • * 表示适用于所有用户
      • 也可以指定具体用户名或用户组名(使用 @用户组名)
    • 第二列 soft/hard:
      • soft:软限制,用户可以临时超过这个限制,但会收到警告
      • hard:硬限制,是绝对的上限,用户不能超过这个值
      • soft 值不能超过 hard 值
    • 第三列 nofile:
      • nofile 表示进程可以打开的最大文件描述符数量,这是最常见的限制之一 。
    • 第四列:具体的限制数值

2. 我们的案例分析

分析打开的文件描述符

存在大量如下文件描述符

COMMAND   PID   USER   FD   TYPE     DEVICE  SIZE/OFF       NODE NAME
pt_main_t 761309 root  872u     unix 0xffff8f8a0e827800       0t0 44797806 type=STREAM
pt_main_t 761309 root  873u     IPv4           44840653       0t0      TCP Ip136-Gpu3080Ti:5000->Ip136-Gpu3080Ti:40474 (CLOSE_WAIT)
pt_main_t 761309 root  874u     unix 0xffff8f890929d000       0t0 44827096 type=STREAM
pt_main_t 761309 root  875u     unix 0xffff8f8909299000       0t0 44827097 type=STREAM
pt_main_t 761309 root  876u  a_inode               0,14         0       53 [eventpoll]
pt_main_t 761309 root  877u     sock                0,8       0t0 44827098 protocol: TCP
pt_main_t 761309 root  878u  a_inode               0,14         0       53 [eventpoll]
pt_main_t 761309 root  879u     unix 0xffff8f8a486f3800       0t0 44844081 type=STREAM
pt_main_t 761309 root  880u     unix 0xffff8f8a486f3c00       0t0 44844082 type=STREAM
pt_main_t 761309 root  881u     unix 0xffff8f890bb65400       0t0 44781151 type=STREAM
pt_main_t 761309 root  882u     IPv4           44797807       0t0      TCP Ip136-Gpu3080Ti:5000->Ip136-Gpu3080Ti:53684 (CLOSE_WAIT)
pt_main_t 761309 root  883u  a_inode               0,14         0       53 [eventpoll]
pt_main_t 761309 root  884u     unix 0xffff8f89322da400       0t0 44837562 type=STREAM
pt_main_t 761309 root  885u     unix 0xffff8f89322da000       0t0 44837563 type=STREAM
pt_main_t 761309 root  886u     unix 0xffff8f890bb66000       0t0 44781152 type=STREAM
pt_main_t 761309 root  887u     IPv4           44781154       0t0      TCP Ip136-Gpu3080Ti:5000->Ip136-Gpu3080Ti:52002 (CLOSE_WAIT)
pt_main_t 761309 root  888u     IPv4           44797845       0t0      TCP Ip136-Gpu3080Ti:5000->Ip136-Gpu3080Ti:47946 (CLOSE_WAIT)
pt_main_t 761309 root  889u  a_inode               0,14         0       53 [eventpoll]
pt_main_t 761309 root  890u     unix 0xffff8f89325a5800       0t0 44840654 type=STREAM
pt_main_t 761309 root  891u     unix 0xffff8f89325a1400       0t0 44840655 type=STREAM
pt_main_t 761309 root  892u     IPv4           44837817       0t0      TCP Ip136-Gpu3080Ti:5000->Ip136-Gpu3080Ti:38346 (CLOSE_WAIT)
pt_main_t 761309 root  893u  a_inode               0,14         0       53 [eventpoll]
pt_main_t 761309 root  894u     unix 0xffff8f89325a4800       0t0 44840657 type=STREAM
pt_main_t 761309 root  895u     unix 0xffff8f89325a6400       0t0 44840658 type=STREAM
pt_main_t 761309 root  896u     IPv4           44845300       0t0      TCP Ip136-Gpu3080Ti:5000->Ip136-Gpu3080Ti:41238 (CLOSE_WAIT)
pt_main_t 761309 root  897u  a_inode               0,14         0       53 [eventpoll]
pt_main_t 761309 root  898u     unix 0xffff8f8909298c00       0t0 44827142 type=STREAM
pt_main_t 761309 root  899u     unix 0xffff8f890929cc00       0t0 44827143 type=STREAM
pt_main_t 761309 root  900u     sock                0,8       0t0 44827144 protocol: TCP
pt_main_t 761309 root  901u  a_inode               0,14         0       53 [eventpoll]
pt_main_t 761309 root  902u     unix 0xffff8f8a0e09f800       0t0 44836864 type=STREAM
pt_main_t 761309 root  903u     unix 0xffff8f8a0e098800       0t0 44845057 type=STREAM
pt_main_t 761309 root  904u     IPv4           44824331       0t0      TCP Ip136-Gpu3080Ti:5000->Ip136-Gpu3080Ti:38008 (CLOSE_WAIT)
pt_main_t 761309 root  905u  a_inode               0,14         0       53 [eventpoll]
pt_main_t 761309 root  906u     unix 0xffff8f8909298000       0t0 44827145 type=STREAM
pt_main_t 761309 root  907u     unix 0xffff8f890929bc00       0t0 44827146 type=STREAM
pt_main_t 761309 root  908u     IPv4           44827147       0t0      TCP Ip136-Gpu3080Ti:5000->Ip136-Gpu3080Ti:40656 (CLOSE_WAIT)

我们发现这里大概有 3 类文件描述符

  • pt_main_t 761309 root 905u a_inode 0,14 0 53 [eventpoll] 这是一个 eventpoll 事件触发
  • pt_main_t 761309 root 906u unix 0xffff8f8909298000 0t0 44827145 type=STREAM 这是 unix 套接字,用于进程间通信
  • pt_main_t 761309 root 908u IPv4 44827147 0t0 TCP Ip136-Gpu3080Ti:5000->Ip136-Gpu3080Ti:40656 (CLOSE_WAIT) 这是一个未被正确关闭的 tcp 请求,本地 5000 端口是我们的服务端口(之所以是本地请求,是因为我们做了一个内网穿透,所以是本地请求本地)

我们的服务作用是接收图片,打开后调用模型处理,然后返回处理结果。
但是代码中并未直接调用 PIL.Image 对象的 close 方法关闭资源。
同时我观察到线上会有超时客户端主动断开链接的行为。

所以关于上面的问题,我有这样一个猜测

  1. Flask 默认使用的是 Werkzeug 提供的 WSGI 服务器,它是一个同步的服务器,不直接支持异步处理。当一个请求到达时,Flask 会为该请求创建一个新的 eventloop(事件循环)来处理该请求。这就解释了为什么在文件描述符中会看到 eventloop 的出现。每个请求都有自己独立的 eventloop,用于处理该请求的异步任务。
  2. 未关闭的 Image 对象与连接断开:在我的代码中,当通过 Image.open() 打开图片时,会创建一个 Image 对象,它占用了一定的资源,如内存和文件描述符。如果在处理完图片后没有显式地调用 image.close() 关闭 Image 对象,那么这些资源会一直保持打开状态。(在对象销毁时,会触发资源关闭;但是这依赖于垃圾回收。个人推测,不知道是否靠谱)

    当客户端因为某些原因(如超时、网络问题等)断开连接时,服务器端的请求处理可能还未完成,特别是在处理大图片或多个图片时。如果此时 Image 对象还未关闭,那么与该请求相关的 eventloop 和文件描述符(如之前的 5000 端口相关的文件描述符)也无法得到及时释放。导致了资源泄漏,并且随着时间的推移和请求的增多,这种情况会变得越来越严重。
  3. 连接的 CLOSE_WAIT 状态:当客户端主动关闭连接时,服务器端会收到一个 FIN 包,表示客户端已经完成了数据发送。服务器端接收到 FIN 包后,会发送一个 ACK 包给客户端,同时将连接状态改为 CLOSE_WAIT,表示服务器端正在等待关闭连接。

    如果服务器端的请求处理还未完成,并且 Image 对象和相关资源还未释放,那么连接会一直保持在 CLOSE_WAIT 状态,直到服务器端完成处理并关闭连接。

上面的分析是我事后的推理,正确性还有待确认,不过最近没什么时间。

当时我改了如下两个地方,这个问题就没有了

  1. 手动关闭 Image 对象,调用 close 方法
  2. aiohttp.ClientSession 设置为全局对象,这是官方文档的建议。

但并没有尝试,将 Werkzeug 替换为支持异步处理的 Web 框架(如 Sanic、FastAPI 等)。

总结

  • 一定要记得释放文件资源(网络连接、文件、图片等)
  • 不要瞬时大量使用文件资源

相关文章:

Too many open files 问题处理

某个简单的 python 服务&#xff0c;运行一段时间就崩溃。查看日志后发现有一个系统错误 OSError: Errno24 Too many open files要理解这个问题&#xff0c;首先要理解什么是文件描述符&#xff0c;可以参考我的另一篇文章(Linux 系统文件描述符&#xff08;File Descriptor&a…...

CentOS 7 环境下常见的操作和配置

目录 1. CentOS 7 中的 vsftpd 配置与使用 安装与启动 vsftpd 配置 vsftpd&#xff08;/etc/vsftpd/vsftpd.conf&#xff09; 常见命令 2. 使用 yum 包管理器 3. 安全性与防火墙配置 开放端口 4. 使用 systemd 管理服务 5. SELinux 配置 查看 SELinux 状态 临时禁用…...

HTTP(超文本传输协议)

HTTP是万维网通信的基础构成&#xff0c;是一个简单的请求相应协议&#xff0c;基于TCP之上80号端口 通信原理 DNS解析 将域名甩个DNS服务器解析&#xff0c;将域名化为IP访问 建立TCP连接 如图&#xff0c;客户端先发送一个sys置位seq为x&#xff08;任意值&#xff09;的…...

etcd-v3.5release-(3)-readIndexRead

笔记1&#xff1a;读操作包括两种&#xff0c;readIndex和serilizable&#xff0c;readIndex指一致性读&#xff0c;一旦a读到了数据x&#xff0c;那么a及a以后的数据都能读到x&#xff0c;readIndex读会先确认本leader是不是有效地leader&#xff0c;如果有效则记录此刻的comm…...

IPv6 NA RTR/SOL/OVR标志位,单播多播选择,ndppd代理和kernel配置

NA消息用单播还是多播的判断理由 单播回复&#xff08;Unicast&#xff09;&#xff1a; 如果客户端发送 RS 消息时&#xff0c;使用的是一个全局地址或链路本地地址作为源地址&#xff0c;则 RA 消息会单播回复到客户端的源地址。这种方式减少了网络中的广播流量&#xff0c;…...

C语言程序设计P5-4【应用函数进行程序设计 | 第四节】——知识要点:数组作函数参数

知识要点&#xff1a;数组作函数参数 视频&#xff1a; 目录 一、任务分析 二、必备知识与理论 三、任务实施 一、任务分析 任务要求用选择法对数组中的 10 个整数按由小到大的顺序排序&#xff0c;前面在讲解数组时讲冒泡法排序曾提到选择法排序的思想。 所谓选择法就是…...

PostgreSQL数据库连接:psqlODBC驱动安装与配置实战指南

本文还有配套的精品资源&#xff0c;点击获取 简介&#xff1a;本文将提供详细的psqlODBC驱动程序在Windows操作系统上的安装和配置指南&#xff0c;使用户能够通过ODBC标准连接到PostgreSQL数据库。安装步骤涵盖获取安装文件、运行安装向导、选择安装路径、完成安装以及配置…...

【NLP 8、normalization归一化函数:sigmoid、softmax】

目录 Normalization&#xff08;归一化&#xff09; 1.特点 目的 应用场景 输出范围 2. Sigmoid 函数 目的 应用场景 输出范围 3. Softmax 函数 目的 应用场景 输出范围 "燃尽最后的本能&#xff0c;意志力会带你杀出重围" —— 24.12.2 Normalization&#…...

鸿蒙ArkTS 与安卓Android-底层逻辑对比

鸿蒙OS&#xff08;ArkTS&#xff09; 架构&#xff1a; 鸿蒙OS采用了微内核架构&#xff0c;其核心操作系统将设备的硬件资源和服务进行模块化&#xff0c;微内核负责最基本的服务&#xff08;如调度、通信、同步等&#xff09;&#xff0c;而其他功能则由用户空间的进程提供。…...

第八节、Bresenham直线插补【51单片机-TB6600驱动器-步进电机教程】

摘要&#xff1a;前面章节主要介绍单个电机控制&#xff0c;本节内容介绍两个电机完成直线插补运动 一、 Bresenham直线算法介绍 Bresenham直线算法由Jack Elton Bresenham于1962年在IBM开发&#xff0c;最初用于计算机显示直线&#xff0c;它确定应该选择的n维光栅的点&#…...

唇形同步视频生成工具:Wav2Lip

一、模型介绍 今天介绍一个唇形同步的工具-Wav2Lip&#xff1b;Wav2Lip是一种用于生成唇形同步&#xff08;lip-sync&#xff09;视频的深度学习算法&#xff0c;它能够根据输入的音频流自动为给定的人脸视频添加准确的口型动作。 &#xff08;Paper&#xff09; Wav2Lip模型…...

旅游管理系统的设计与实现

文末获取源码和万字论文&#xff0c;制作不易&#xff0c;感谢点赞支持。 毕 业 设 计&#xff08;论 文&#xff09; 题目&#xff1a;旅游管理系统的设计与实现 摘 要 如今社会上各行各业&#xff0c;都喜欢用自己行业的专属软件工作&#xff0c;互联网发展到这个时候&#…...

burp常用机漏洞测试理论

声明&#xff01; 学习视频来自B站up主 **泷羽sec** 有兴趣的师傅可以关注一下&#xff0c;如涉及侵权马上删除文章&#xff0c;笔记只是方便各位师傅的学习和探讨&#xff0c;文章所提到的网站以及内容&#xff0c;只做学习交流&#xff0c;其他均与本人以及泷羽sec团队无关&a…...

TCP/IP 和 UDP

一、TCP/IP&#xff08;传输控制协议&#xff09; TCP/IP 是一个协议族&#xff0c;它是互联网的基础协议&#xff0c;为网络通信提供了标准化的方法。TCP/IP 分为四个层次&#xff0c;每一层都有特定的功能&#xff1a; 应用层&#xff1a;这是最接近用户的层&#xff0c;包含…...

FastAPI解决跨域报错net::ERR_FAILED 200 (OK)

目录 一、跨域问题的本质 二、FastAPI中的CORS处理 1. 安装FastAPI和CORS中间件 2. 配置CORS中间件 3. 运行FastAPI应用 三、解决跨域报错的步骤 四、案例&#xff1a;解决Vue.js与FastAPI的跨域问题 1. Vue.js前端应用 2. FastAPI后端API 3. 配置CORS中间件 4. 运行…...

git如何新建分支并提交?

1. 检查当前分支 在开始之前&#xff0c;最好确认你当前所在的分支。 git branch 当前分支前面会有一个 *号。 2. 新建分支 使用 git branch 命令创建一个新的分支。假设你要创建一个名为 new-feature 的分支。 git branch new-feature 3. 切换到新分支 使用 git checkou…...

使用 LlamaFactory 结合开源大语言模型实现文本分类:从数据集构建到 LoRA 微调与推理评估

文章目录 背景介绍文本分类数据集Lora 微调模型部署与推理期待模型的输出结果 文本分类评估代码 背景介绍 本文将一步一步地&#xff0c;介绍如何使用llamafactory框架利用开源大语言模型完成文本分类的实验&#xff0c;以 LoRA微调 qwen/Qwen2.5-7B-Instruct 为例。 文本分类…...

Python基础学习总结篇

Python基础学习_01注释、变量、计算、打印 Python基础学习-02转义、输入、函数 Python基础学习-03逻辑分支语句、循环 Python基础学习-04列表List Python基础学习-05元组 tuple Python基础学习-06字典Dict Python基础学习-07不可重复的set集合 Python基础学习-08字符串 …...

8. Debian系统中显示屏免密码自动登录

本文介绍如何在Debian系统上&#xff0c;启动后&#xff0c;自动免密登录&#xff0c;不卡在登录界面。 1. 修改lightDM配置文件 嵌入式Debian系统采用lightDM显示管理器&#xff0c;所以&#xff0c;一般需要修改它的配置文件/etc/lightdm/lightdm.conf&#xff0c;找到[Seat…...

ubuntu安装nginx并设置开机自启动

1、下载nginx相关依赖包 sudo apt-get install gccsudo apt-get install libpcre3 libpcre3-devsudo apt-get install zlib1g zlib1g-devsudo sudo apt-get install opensslsudo apt-get install libssl-devsudo apt install make2、进入想下载安装包位置 cd /usr/local3、通…...

C++初阶-list的底层

目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...

云计算——弹性云计算器(ECS)

弹性云服务器&#xff1a;ECS 概述 云计算重构了ICT系统&#xff0c;云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台&#xff0c;包含如下主要概念。 ECS&#xff08;Elastic Cloud Server&#xff09;&#xff1a;即弹性云服务器&#xff0c;是云计算…...

树莓派超全系列教程文档--(62)使用rpicam-app通过网络流式传输视频

使用rpicam-app通过网络流式传输视频 使用 rpicam-app 通过网络流式传输视频UDPTCPRTSPlibavGStreamerRTPlibcamerasrc GStreamer 元素 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 使用 rpicam-app 通过网络流式传输视频 本节介绍来自 rpica…...

【解密LSTM、GRU如何解决传统RNN梯度消失问题】

解密LSTM与GRU&#xff1a;如何让RNN变得更聪明&#xff1f; 在深度学习的世界里&#xff0c;循环神经网络&#xff08;RNN&#xff09;以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而&#xff0c;传统RNN存在的一个严重问题——梯度消失&#…...

Nuxt.js 中的路由配置详解

Nuxt.js 通过其内置的路由系统简化了应用的路由配置&#xff0c;使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...

Module Federation 和 Native Federation 的比较

前言 Module Federation 是 Webpack 5 引入的微前端架构方案&#xff0c;允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...

【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)

升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点&#xff0c;但无自动故障转移能力&#xff0c;Master宕机后需人工切换&#xff0c;期间消息可能无法读取。Slave仅存储数据&#xff0c;无法主动升级为Master响应请求&#xff…...

【LeetCode】3309. 连接二进制表示可形成的最大数值(递归|回溯|位运算)

LeetCode 3309. 连接二进制表示可形成的最大数值&#xff08;中等&#xff09; 题目描述解题思路Java代码 题目描述 题目链接&#xff1a;LeetCode 3309. 连接二进制表示可形成的最大数值&#xff08;中等&#xff09; 给你一个长度为 3 的整数数组 nums。 现以某种顺序 连接…...

【C++】纯虚函数类外可以写实现吗?

1. 答案 先说答案&#xff0c;可以。 2.代码测试 .h头文件 #include <iostream> #include <string>// 抽象基类 class AbstractBase { public:AbstractBase() default;virtual ~AbstractBase() default; // 默认析构函数public:virtual int PureVirtualFunct…...

WebRTC调研

WebRTC是什么&#xff0c;为什么&#xff0c;如何使用 WebRTC有什么优势 WebRTC Architecture Amazon KVS WebRTC 其它厂商WebRTC 海康门禁WebRTC 海康门禁其他界面整理 威视通WebRTC 局域网 Google浏览器 Microsoft Edge 公网 RTSP RTMP NVR ONVIF SIP SRT WebRTC协…...