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:
    ...
相关推荐
gelald几秒前
AQS 工具之 CountDownLatch 与 CyclicBarry 学习笔记
java·后端·源码阅读
且去填词几秒前
Go 语言的“反叛”——为什么少即是多?
开发语言·后端·面试·go
q***o37628 分钟前
Spring Boot环境配置
java·spring boot·后端
hhzz29 分钟前
Springboot项目中使用POI操作Excel(详细教程系列3/3)
spring boot·后端·excel·poi·easypoi
TaiKuLaHa44 分钟前
Spring Bean的生命周期
java·后端·spring
JavaGuide1 小时前
SpringBoot 官宣停止维护 3.2.x~3.4.x!
java·后端
Victor3562 小时前
Hibernate(39)Hibernate中如何使用拦截器?
后端
Victor3562 小时前
Hibernate(40)Hibernate的命名策略是什么?
后端
Knight_AL2 小时前
Spring 事务管理:为什么内部方法调用事务不生效以及如何解决
java·后端·spring