2012-07-02 56 views
4

我有一个Jenkins服务器,一直运行内存不足,无法创建本机线程。我已经提高了内存并安装了Monitoring pluginJenkins应该运行多少个线程?

服务器上有大约150个项目,我一直在观察线程数量整天蔓延。现在是990左右。我期望它达到1024时,这是线程的用户限制,Jenkins将再次耗尽内存。

[edit]: I have hit 1016 threads and am now getting the out of memory error

这是线程的詹金斯在运行合适的号码?我怎么能告诉詹金斯在完成它们之后销毁线程?

+0

@ruffin,LOL,但请保留您的意见专业 –

+0

当您的线程用完时,您可以从Jenkins日志中发布错误消息吗? –

+0

另外,请说明您正在使用的詹金斯版本。 –

回答

2

TL;博士:

有运行bash脚本,并没有通过stderr返回任何标准输出或詹金斯一个生成后的行动。因此,每次构建运行时,都会创建线程并卡住wait。我通过让bash脚本返回exit状态来解决此问题。

长的答案

我运行詹金斯在CentOS,并通过RPM安装英寸在修改Winstone servlet容器方面,您可以在Jenkin的初始化脚本/etc/sysctrl/jenkins中更改它。但是,上面的选项只控制所创建的HTTP线程的数量,而不是整个线程的数量。

这将是一个解决方案,如果我的线程挂在访问Jenkins的HTTP API作为后提交操作的一部分。但是,使用我的问题中提到的方便的Monitoring插件,我检查了卡住的线程。

线程卡在com.trilead.ssh2.channel软件包中。 getChannelData方法有一个while(true)循环,该循环在ssh流的stderrstdout上查找输出。线程在这个循环中变得越来越糟,因为没有任何东西可以通过。我在GrepCode上了解到这一点。

这是因为构建后的操作是通过SSH在服务器上执行一个命令并执行一个bash脚本来检查git仓库。但是,git repo配置错误,git命令会出错,但exit 1状态没有通过bash脚本冒泡(部分原因是由于if-elif-else语句不正确)。

该脚本完成,构建被认为是成功的,但不知何故处理来自Jenkins的SSH连接的线程由于这个git错误而被挂起。

但是,谢谢你对这个问题的帮助!

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%确信它的工作,所以没有保证,但它是值得一试。

+0

我可以证实这不起作用。但谢谢你的建议。 – CamelBlues

+0

来验证这不起作用,您可以添加https://wiki.jenkins-ci.org/display/JENKINS/Monitoring Jenkins插件,并显示第6个块中配置的线程数。使用上述选项不起作用。 – simpleuser

相关问题