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的配置项,在容器启动参数中添加:
这样每个Agent容器启动时都会带上该限制,避免容器内文件句柄不足。--ulimit nofile=16384:65536
3. 优化测试代码减少资源泄漏
即便调整了系统限制,也建议检查测试代码是否存在资源浪费:
- 确保Testcontainers创建的容器、网络等资源在测试结束后正确关闭(可使用
@AfterAll注解或Testcontainers自动清理机制) - 检查Pulsar客户端是否复用连接池,避免每次测试都创建新的客户端实例
- 降低集成测试的并行度,避免同时启动过多容器和连接导致句柄耗尽
补充:流水线内直接用ulimit无效的原因
ulimit -n仅能调整当前shell进程的软限制,且不能超过系统设置的硬限制。Jenkins Agent进程启动时已继承系统限制,流水线的sh步骤是Agent的子进程,普通用户权限无法突破硬限制,因此会报"Operation not permitted"。
内容的提问来源于stack exchange,提问作者Faran
相关产品推荐
相关产品推荐

