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:
    ...
相关推荐
大鸡腿同学14 小时前
【成长类】《只有偏执狂才能生存》读书笔记:程序员的偏执型成长地图
后端
0xDevNull14 小时前
MySQL数据冷热分离详解
后端·mysql
AI袋鼠帝15 小时前
OpenClaw(龙虾)最强开源对手!Github 40K Star了,又一个爆火的Agent..
后端
新知图书16 小时前
搭建Spring Boot开发环境
java·spring boot·后端
宸津-代码粉碎机16 小时前
Spring Boot 4.0虚拟线程实战调优技巧,最大化发挥并发优势
java·人工智能·spring boot·后端·python
小码哥_常17 小时前
一个Starter搞定六种防护,Spring Boot API的超强护盾来了
后端
小村儿18 小时前
连载04-最重要的Skill---一起吃透 Claude Code,告别 AI coding 迷茫
前端·后端·ai编程
IT_陈寒19 小时前
Vite的alias配置把我整不会了,原来是这个坑
前端·人工智能·后端
gelald20 小时前
Spring Boot - 自动配置原理
java·spring boot·后端
希望永不加班20 小时前
SpringBoot 集成测试:@SpringBootTest 与 MockMvc
java·spring boot·后端·log4j·集成测试