Jenkins执行LangChain DirectoryLoader时性能异常缓慢问题排查
Jenkins流水线中Python脚本执行缓慢的排查与解决思路
一、核对执行环境差异
- 环境变量与依赖版本:手动执行和Jenkins流水线的Python环境可能不一致,比如LangChain或其依赖库版本不同,导致加载逻辑效率差异。在Jenkins流水线里添加
printenv和python3 -m pip list命令,和本地手动执行的输出对比,重点看Python路径、LangChain版本。 - 工作目录正确性:确认Jenkins执行脚本时的当前工作目录是否和手动执行一致。在Python脚本开头加
import os; print(os.getcwd()),避免因为./demo/src路径解析错误,导致脚本遍历无关目录浪费时间。
二、检查Jenkins节点资源限制
- 执行者数量配置:即使虚拟机有12核,如果Jenkins内置节点的「执行者数量」设得太小(默认可能只有2),会限制并发任务的执行。进入Jenkins「系统管理」→「节点管理」→「内置节点」,把执行者数量调大(比如设为8),让Python脚本的多线程/多进程能充分利用CPU资源。
- 进程优先级调整:Jenkins默认运行进程的优先级可能较低,系统调度时分配的CPU时间少。在
/etc/default/jenkins配置文件中添加JENKINS_NICENESS=0(数值越小优先级越高,默认是10),重启Jenkins服务生效。
三、优化LangChain加载逻辑
- 强制开启多线程加载:手动执行时可能默认启用了多线程,但Jenkins环境中可能因为线程池限制没生效。显式在DirectoryLoader中配置多线程参数:
from langchain.document_loaders import DirectoryLoader loader = DirectoryLoader( './demo/src', glob='*.java', use_multithreading=True, max_concurrency=8 # 根据CPU核心数调整 ) docs = loader.load()
- 排查文件权限问题:Jenkins运行用户(通常是
jenkins用户)对./demo/src下的文件可能存在权限不足,导致读文件时出现隐性重试或延迟。在Jenkins流水线中添加ls -l ./demo/src命令,检查文件所有者和权限,确保jenkins用户有读权限。
四、调试定位具体瓶颈
- 添加脚本执行日志:在Python脚本中加入时间戳,统计整体加载时间和单个文件加载耗时,定位是个别文件拖慢还是整体加载机制问题:
import time from langchain.document_loaders import DirectoryLoader total_start = time.time() loader = DirectoryLoader('./demo/src', glob='*.java') docs = loader.load() total_end = time.time() print(f"总加载耗时: {total_end - total_start:.2f}秒") for doc in docs: print(f"文件: {doc.metadata['source']}")
- 用strace分析系统调用:在Jenkins流水线中执行
strace -c python3 your_script.py,统计各类系统调用的时间占比,看是否有大量阻塞的IO调用或异常系统操作,进一步定位瓶颈。
内容的提问来源于stack exchange,提问作者user27155137
相关产品推荐
相关产品推荐

