You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Jenkins流水线IT阶段报错:文件打开过多引发IllegalStateException

解决Jenkins流水线IT测试中"Too many open files"报错问题

问题核心

从错误栈能明确,根本原因是进程打开的文件句柄数超出系统限制,导致Netty无法创建事件循环,进而阻断Pulsar客户端初始化。你尝试在流水线里用ulimit -n修改失败,是因为普通用户权限无法突破系统设置的硬限制,且Jenkins进程的资源限制在启动时就已确定,流水线内动态修改无效。

解决方案

1. 调整Jenkins Agent的系统级文件句柄限制

这是最彻底的解决方式,需在Jenkins运行的Agent节点上操作:

  • 修改limits.conf配置:
    以root用户编辑/etc/security/limits.conf,添加或更新以下内容:

    jenkins soft nofile 16384
    jenkins hard nofile 65536
    

    其中soft是普通用户可自行调整的上限,hard是系统允许的绝对最大值。

  • 若Jenkins用systemd管理:
    编辑/etc/systemd/system/jenkins.service(或对应service文件),在[Service]段添加:

    LimitNOFILE=65536
    

    执行重载配置并重启Jenkins:

    systemctl daemon-reload
    systemctl restart jenkins
    

2. 针对Docker Agent的特殊配置

你的流水线使用label 'docker'的Agent,说明构建在Docker容器内执行,需在启动Agent容器时指定ulimit参数:

  • 进入Jenkins全局配置,找到Docker Agent的配置项,在容器启动参数中添加:
    --ulimit nofile=16384:65536
    
    这样每个Agent容器启动时都会带上该限制,避免容器内文件句柄不足。

3. 优化测试代码减少资源泄漏

即便调整了系统限制,也建议检查测试代码是否存在资源浪费:

  • 确保Testcontainers创建的容器、网络等资源在测试结束后正确关闭(可使用@AfterAll注解或Testcontainers自动清理机制)
  • 检查Pulsar客户端是否复用连接池,避免每次测试都创建新的客户端实例
  • 降低集成测试的并行度,避免同时启动过多容器和连接导致句柄耗尽

补充:流水线内直接用ulimit无效的原因

ulimit -n仅能调整当前shell进程的软限制,且不能超过系统设置的硬限制。Jenkins Agent进程启动时已继承系统限制,流水线的sh步骤是Agent的子进程,普通用户权限无法突破硬限制,因此会报"Operation not permitted"。

内容的提问来源于stack exchange,提问作者Faran

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 15:15:53