我有一台Jenkins服务器,内存不足,无法创建本机线程。我已经提升了内存并安装了Monitoring plugin。
服务器上有大约150个项目,我一直在观察线程计数整天都在上升。它现在大约是990.我预计当它达到1024,这是线程的用户限制时,Jenkins会再次耗尽内存。
[edit]: I have hit 1016 threads and am now getting the out of memory error
这是Jenkins运行的适当线程数吗?我怎么能告诉Jenkins在线程结束时销毁线程?
答案 0 :(得分:3)
<强> TL; DR:强>
有一个运行bash脚本的构建后操作没有通过stderr或stdout向Jenkins返回任何内容。因此,每次构建运行时,都会创建线程并卡住wait
。我通过让bash脚本返回exit
状态来解决此问题。
长答案
我在CentOS上运行Jenkins并通过RPM安装。在修改Winstone servlet容器方面,您可以在/etc/sysctrl/jenkins
中的Jenkin的init脚本中更改它。但是,上面的选项只控制创建的HTTP线程数,而不是整体线程数。
如果我的线程在作为提交后操作的一部分访问Jenkins的HTTP API时挂起,那将是一个解决方案。但是,使用我的问题中提到的非常方便的监控插件,我检查了卡住的线程。
线程卡在com.trilead.ssh2.channel
包中的某些内容上。 getChannelData
方法有一个while(true)
循环,用于在ssh流的stderr
或stdout
上查找输出。线程在那个循环中变得很糟糕,因为没有任何东西通过。我在GrepCode上学到了这一点。
这是因为构建后的操作是通过SSH执行命令到服务器上并执行一个bash脚本来检查git repo。但是,git repo配置错误并且git命令会出错,但exit 1
状态没有通过bash脚本冒泡(部分原因是if-elif-else语句错误)。
脚本已经完成,构建被认为是成功的,但是由于这个git错误,处理Jenkins的SSH连接的线程被搁置了。
但是,谢谢你对这个问题的帮助!
答案 1 :(得分:2)
如果您“开箱即用”运行Jenkins,它将使用Winstone servlet容器。您可以将命令行参数作为described here传递给它。其中一些参数可以限制线程数:
--handlerCountStartup = set the no of worker threads to spawn at startup. Default is 5
--handlerCountMax = set the max no of worker threads to allow. Default is 300
--handlerCountMaxIdle = set the max no of idle worker threads to allow. Default is 50
现在,我在前一段时间尝试过,并不是100%确信它有效,所以没有保证,但值得一试。