2012-07-02 81 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

相關問題