Jenkins 2.375.4中hudson.triggers.SafeTimerTask执行失败求助
Jenkins无法创建本地线程问题排查与解决
环境信息
- Jenkins版本:2.375.4
- 运行环境:RHEL-8系统的Podman容器,容器由systemd服务管理
错误日志
Apr 18 11:39:19 rhrd0100lws004d.ncte.navy.local container-jenkins[2628014]: [72922.726s][warning][os,thread] 无法启动线程 - pthread_create调用失败(EAGAIN),属性:stacksize: 1024k, guardsize: 0k, detached。 Apr 18 11:39:19 rhrd0100lws004d.ncte.navy.local container-jenkins[2628014]: 2023-04-18 11:39:19.832+0000 [id=51] SEVERE hudson.triggers.SafeTimerTask#run: 定时任务hudson.model.Queue$MaintainTask@4bd07352执行失败 Apr 18 11:39:19 rhrd0100lws004d.ncte.navy.local container-jenkins[2628014]: java.lang.OutOfMemoryError: 无法创建本地线程:可能是内存不足或达到进程/资源限制 Apr 18 11:39:19 rhrd0100lws004d.ncte.navy.local container-jenkins[2628014]: at java.base/java.lang.Thread.start0(Native Method) Apr 18 11:39:19 rhrd0100lws004d.ncte.navy.local container-jenkins[2628014]: at java.base/java.lang.Thread.start(Thread.java:798) Apr 18 11:39:19 rhrd0100lws004d.ncte.navy.local container-jenkins[2628014]: at hudson.model.Executor.start(Executor.java:844) Apr 18 11:39:19 rhrd0100lws004d.ncte.navy.local container-jenkins[2628014]: at hudson.model.Computer.startFlyWeightTask(Computer.java:1303) Apr 18 11:39:19 rhrd0100lws004d.ncte.navy.local container-jenkins[2628014]: at hudson.model.Queue.lambda$createFlyWeightTaskRunnable$1(Queue.java:1790) Apr 18 11:39:19 rhrd0100lws004d.ncte.navy.local container-jenkins[2628014]: at hudson.model.Queue.maintain(Queue.java:1578) Apr 18 11:39:19 rhrd0100lws004d.ncte.navy.local container-jenkins[2628014]: at hudson.model.Queue$MaintainTask.doRun(Queue.java:2909) Apr 18 11:39:19 rhrd0100lws004d.ncte.navy.local container-jenkins[2628014]: at hudson.triggers.SafeTimerTask.run(SafeTimerTask.java:94) Apr 18 11:39:19 rhrd0100lws004d.ncte.navy.local container-jenkins[2628014]: at jenkins.security.ImpersonatingScheduledExecutorService$1.run(ImpersonatingScheduledExecutorService.java:69) Apr 18 11:39:19 rhrd0100lws004d.ncte.navy.local container-jenkins[2628014]: at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515) Apr 18 11:39:19 rhrd0100lws004d.ncte.navy.local container-jenkins[2628014]: at java.base/java.util.concurrent.FutureTask.runAndReset(FutureTask.java:305) Apr 18 11:39:19 rhrd0100lws004d.ncte.navy.local container-jenkins[2628014]: at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:305) Apr 18 11:39:19 rhrd0100lws004d.ncte.navy.local container-jenkins[2628014]: at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) Apr 18 11:39:19 rhrd0100lws004d.ncte.navy.local container-jenkins[2628014]: at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) Apr 18 11:39:19 rhrd0100lws004d.ncte.navy.local container-jenkins[2628014]: at java.base/java.lang.Thread.run(Thread.java:829)
原因分析
- 线程资源配额耗尽:
pthread_create返回EAGAIN错误,说明当前进程已达到系统或容器允许的最大线程数限制,无法创建新线程。 - 内存不足:每个Java线程默认分配1024KB栈内存,当容器或系统可用内存不足时,无法为新线程分配栈空间,触发
OutOfMemoryError。 - 容器资源限制:Podman容器可能被设置了严格的进程数(PIDs)或内存配额,限制了Jenkins进程的线程创建能力。
- Jenkins线程配置不合理:如果Jenkins主节点执行器数量过多、插件后台线程冗余,会导致线程资源被快速耗尽。
解决办法
1. 调整Java线程栈大小
修改Jenkins的JVM启动参数,减小线程栈占用,从而在相同内存下支持更多线程:
- 找到Jenkins的启动配置(如systemd服务文件
/etc/systemd/system/container-jenkins.service),在JVM参数中添加-Xss512k(将栈大小从1024KB改为512KB)。 - 执行命令重启服务:
systemctl daemon-reload systemctl restart container-jenkins
2. 提升容器资源限制
- 增加进程数限制:修改Podman容器启动命令,添加
--pids-limit 65535(允许最大65535个进程/线程),更新systemd服务文件后重启容器。 - 增加内存配额:在容器启动命令中添加
--memory 4g(分配4GB内存,根据实际情况调整),确保有足够内存分配线程栈。
3. 优化Jenkins内部线程使用
- 减少执行器数量:登录Jenkins管理界面,进入「系统管理」→「节点管理」→「主节点配置」,降低「执行器数量」,避免创建过多执行线程。
- 清理冗余插件与任务:禁用或卸载未使用的插件,减少后台线程消耗;检查并删除不必要的定时任务,降低线程负载。
4. 调整系统级资源限制
在RHEL-8宿主机上,提升Jenkins用户的进程数限制:
- 编辑
/etc/security/limits.conf,添加以下配置:jenkins soft nproc 65535 jenkins hard nproc 65535 - 重启系统或重新登录后,配置生效,再重启Jenkins容器。
内容的提问来源于stack exchange,提问作者Eric Dunn
相关产品推荐
相关产品推荐

