ragflow-疑难杂症-OSError: [Errno 24] Too many open files

大批量解析文件之后,批量失败报错:OSError: [Errno 24] Too many open files

问题解析:

这个报错指的是进程文件描述符 耗尽了,在 Linux 中,一切都是文件(包括 socket、pipe、普通文件等)。一个进程能同时打开的文件数有上限(ulimit 限制),超出以后再打开新文件/连接就会报这个错。

问题定位:

docker exec 进到容器里, 查看限制数

bash 复制代码
docker exec -it ragflow-server /bin/bash
ulimit -n
输出:
1024

首先找到你进程的id,这里ragflow启动了两个python服务,ragflow-server和task-executor, 依次查看pid

bash 复制代码
ps -ef | grep ragflow 
输出:
root          18      14  4 Aug26 ?        11:34:48 python3 api/ragflow_server.py
root       99300   99286  0 17:29 pts/7    00:00:00 grep --color=auto ragflow

ls -l /proc/18/fd | wc -l
输出:
105

ps -ef | grep task_executor
输出:
root          41      17  0 Aug26 ?        00:41:55 python3 rag/svr/task_executor.py d6bcbdbc7b76_0
root          42      20  0 Aug26 ?        00:42:38 python3 rag/svr/task_executor.py d6bcbdbc7b76_1
root          44      22  0 Aug26 ?        00:41:20 python3 rag/svr/task_executor.py d6bcbdbc7b76_2
root          46      25  0 Aug26 ?        00:41:11 python3 rag/svr/task_executor.py d6bcbdbc7b76_3
root          47      28  0 Aug26 ?        00:43:13 python3 rag/svr/task_executor.py d6bcbdbc7b76_4

ls -l /proc/41/fd | wc -l
输出:
1025
......

可以看出,task-executor 的文件资源数已经超出了最大上限。因此后续的操作就会报错 Too many open files

原因分析与方案:

  1. 同时打开的文件超过了1024,这时候需要修改最大上限
bash 复制代码
## 容器里执行:
ulimit -n 65535
可以临时设置为最大65535

## 永久改动需要修改docker-compose
ulimits:
  nofile:
    soft: 65535
    hard: 65535
  1. 每次解析没有释放文件资源,导致一直累积,文件资源泄露导致超过了1024
    这个错误原因比较多,常见的有 文件资源、网络请求资源等未释放 使用with语法可以做到在结束后 自动释放资源
    with上下文管理器(Context Manager) 语法,它用于在一段代码执行前自动获取资源,并在代码执行完毕后自动清理资源,无论中间是否发生异常。
python 复制代码
with open("file.txt", "r") as f:
    content = f.read()
# 这里 f 已经自动关闭,无需手动调用 f.close()

import requests
with requests.get("http://example.com", stream=True) as r:
    ...
相关推荐
汤姆yu15 小时前
2025版基于springboot的家政服务预约系统
java·spring boot·后端
sunnyday042616 小时前
Spring Boot中Bean Validation的groups属性深度解析
spring boot·后端·python
青柠编程16 小时前
基于 Spring Boot 与 Vue 的前后端分离课程答疑平台架构设计
vue.js·spring boot·后端
tonydf18 小时前
基于SemanticKernel开发一个业务智能体
后端·agent
我不是混子18 小时前
Java的SPI机制详解
java·后端
Moonbit18 小时前
MoonBit Pearls Vol.9:正则表达式引擎的两种实现方法:导数与 Thompson 虚拟机
后端·正则表达式·编程语言
文心快码BaiduComate19 小时前
一人即团队,SubAgent引爆开发者新范式
前端·后端·程序员
掘金一周19 小时前
2025年还有前端不会Nodejs ?| 掘金一周 9.25
android·前端·后端
RoyLin19 小时前
前端·后端·node.js
泉城老铁19 小时前
springboot常用的注解需要了解,开发必备
spring boot·后端