2011-09-07 83 views
0

我有一個處理SOAP請求的J2EE Java應用程序。在我們的生產環境(HPUX,OC4J,Java 5)中,我們有大約20個線程正在運行,我們有時會看到1個線程暫停約15秒。到目前爲止,我還沒有成功地在預生產環境中複製這個問題,如果我在生產服務器上使用jconsole和相關工具,我很害怕破壞內容並違反SLA。java一線程慢

誰有什麼靈感?我知道http://java.sun.com/j2se/1.5/pdf/jdk50_ts_guide.pdf,但我錯過了體驗用它直接在生產中要敢於(另外,HPUX傢伙扔了其中的一些工具,在工具箱中,與HPJMeter代替)

此外,雖然這表明一個GC問題我還沒有足夠的證據來證明或反駁這個理論,我願意接受其他建議。

+1

GC不應該成爲一個問題,因爲如果它掛起一個線程(一個停止世界的gc),所有其他線程也應該受到影響。 – Thomas

+0

除了我不一定會看到與jconsole連接的問題,您是否分析了線程轉儲?當他暫停時,線程正在做什麼?在unix機器上,當在JVM進程中運行'kill -3'時可以獲得線程轉儲 –

回答

1

我們將jconsole(和其他工具)定期直接連接到生產環境。對我們來說沒有任何重大的開銷,工具已經在JVM中進行了,所以你只需要連接一個遠程進程來讀取已發佈的值。我說去吧!

無論哪種方式,你真的需要看看盒子上發生了什麼。線程轉儲可能會或做一些內部的儀器。通過內部儀器,我的意思是在代碼中記錄關鍵措施並以某種方式暴露這些措施。它基本上是JVM所做的(通過JMX公開它們),但是滾動你自己會給你更多的特殊性。例如,我經常在內部記錄請求/響應或其他關鍵路徑性能時序。哦,還有一件事。您可以將您的應用程序設置爲使用代理提供更多信息。通常情況下,這將是插入一個探查器(如jprofiler或yourkit),但這確實通常會增加更多的開銷,不建議用於生產。

同樣值得考慮的是不從虛擬機獲取所需信息的成本。例如,在監控時,沒有解決問題的成本是多少少於降低性能百分比的成本?

更科學地說,這article有一些意見。這意味着高達7%的開銷(與我之前的觀點相矛盾),2006年以前的一篇文章顯示3-4%,但都是高度背景的結果。例如,CPU密集型應用程序可能會或可能不會受IO綁定應用程序的影響。

所以我的一個更合適的答案(而不僅僅是「去爲它」)將通過測量來了解它對您的應用在您的環境中的影響。在jconsole連接和斷開連接的情況下,在類似的生產環境上運行代表性測試,並查看您的自己。請參考stackoverflow question

+0

如果你們中的一些人可以重複'去爭取它,沒有真正的風險',我會嘗試。 *我們做了一些線程轉儲,但它們並沒有真正顯示任何意想不到的情況。此外,問題是間歇性的,當問題實際發生時,我們沒有線程轉儲。 *您的「內部儀器」是什麼意思?如果這就是你的意思,我現在不能更改生產代碼。如果你們中的一些人 – hyperman

+0

dynaTrace是另一個非常好的產品。它有一些開銷,但是通過直接使用字節碼來避免它。 –

1

您可以在HP-UX上執行以下幾項操作,以從運行中的Java進程獲取更多信息。如果您將PROF信號發送到JVM,它將切換GC日誌的生成(就像您使用了-Xverbosegc命令行選項一樣)。生成GC日誌非常便宜,因此您應該可以在生產中將其打開,而不會影響性能。

如果將USR2信號發送到JVM,它將啓動分析(與-Xeprof相同)。如果您再次發送信號,則會關閉分析。這會對性能產生顯着影響,儘管從外部第三方分析器中可以看到的結果會更小。

您可以使用HPJmeter分析結果數據文件。 HPjmeter還可以連接到正在運行的JVM以進行實時監控。對於Java 5,您需要使用-agentlib選項啓動JVM。如果您使用的是Java 6,則可以連接到正在運行的JVM而不需要任何額外的命令行選項。