2010-08-18 97 views
8

我遇到間歇性碼頭碰撞問題,我使用的是Jetty 6.1.24。碼頭間歇性碰撞的問題

我正在運行neo4j Spring MVC webapp,Jetty將保持運行約1小時,然後我必須重新啓動Jetty。它運行在小型的amazon ec2實例上,內存爲1.7gb。

我使用java -Xmx900m -server -jar start.jar

我連接到使用膩子的服務器上,當碼頭崩潰膩子會話斷開連接,我看不出有什麼錯誤導致它崩潰開始碼頭。

我希望能夠看到它是否是Spring產生的錯誤,我不知道如何使用Jetty記錄spring應用程序的輸出。或者如果是Jetty或內存問題,監控Jetty的最佳方法是什麼?我無法在運行Windows的本地機器上重新創建它。你認爲什麼是解決這個問題的最好方法?謝謝

+0

你能澄清你的問題嗎? 「我的網絡應用程序的控制檯」是什麼意思? 您的Web應用程序是否將日誌記錄發送到標準輸出(System.out)? 你在運行什麼操作系統? – Tim 2010-08-20 03:54:05

+1

這個問題爲什麼標記爲CW? – BalusC 2010-08-21 00:32:41

+0

謝謝我已經開始了一個新的debian ec2實例,我將重新安裝碼頭,我會嘗試所有的建議,不確定使用哪個答案,因爲它們都是很好的答案 – patrickandroid 2010-08-26 20:06:39

回答

4

當你說崩潰時,你的意思是JVM段錯誤並消失?如果是這種情況,我會檢查並確保您沒有耗盡機器的可用內存。當系統內存太低時,Linux上的Java將崩潰,JVM無法分配最大內存。例如,您已將最大JVM內存設置爲500MB,其中目前使用250MB。但是,Linux操作系統只有128MB可用。這會產生不穩定的結果,並且JVM會發生段錯誤。

在Windows上,JVM在這種情況下運行得更好,並在系統內存不足時引發OutOfMemoryError。

  1. 驗證您的崩潰時間有多少系統內存可用。
  2. 驗證你的盒子上的其他進程是否吃掉了大量的內存。關閉任何可能與JVM競爭的東西。
  3. 運行jconsole並將其連接到您的JVM。這將告訴你如何在你的JVM進程中使用內存,並給你一個歷史,當它崩潰時回顧。
  4. 消除您在執行此類測試時可能加載到JVM中的任何本機代碼。

我相信Jetty有一些本地代碼來處理大量請求。確保沒有被使用。你想將崩潰隔離爲Java,而不是一些奇怪的本地lib。如果你拿出本地的東西,並找到它的作品,那麼你有什麼導致它的答案。如果它繼續崩潰,那麼它可能就是我所描述的。

您可以強制JVM在啓動時使用-Xms900m分配所有內存,以確保JVM不會與其他進程爭用內存。一旦分配完整的Xmx金額,它不會崩潰。不是一個解決方案,但你可以很容易地測試它。

+0

感謝您的幫助,我會嘗試所有的建議 – patrickandroid 2010-08-27 18:35:28

+0

啓動與-Xms900m的碼頭看起來已經修復它,謝謝 – patrickandroid 2010-08-28 23:55:03

5

這不是一個真正的程序員問題;也許它會被移到ServerFault。

您沒有具體說明您正在使用哪種操作系統,但我正在冒險猜測某些Linux發行版。您有兩種方法可以找出問題所在:

  1. 在屏幕上開始會話。 直到重新啓動操作系統(或退出屏幕),只要實際機器啓動,屏幕就會保持運行。

    你開始屏幕這樣

    screen 
    

    ,你會得到一個新的提示,你就可以開始你的程序(CD FOO,碼頭等)。當你感到高興並且你只需要去某個地方時,你可以按CTRL + A然後按CTRL + D來斷開屏幕。你會回到你調用screen之前的地方。

    要恢復查看screen,請鍵入screen -R這意味着要恢復現有屏幕。你應該再次看到碼頭。

    的好處是,如果你失去連接(或您意外或任何接近膩子),那麼你可以使用screen -list獲得運行屏幕列表,然後強行拆除他們-D,並將它們重新連接到當前膩子-R ,沒有傷害!

  2. 使用nohup。 Nohup或多或少地分離了你從控制檯運行的進程,因此它的輸出沒有任何一個輸出到達終端。你以正常的方式開始你的程序,但是你在命令中增加了nohup這個詞。

    例如:

    nohup ls -l & 
    

    ls -l完成後,你的輸出存儲在的nohup.out。

+0

感謝您的幫助,屏幕非常有用 – patrickandroid 2010-08-27 18:38:44

2

當您啓動Java,兩個輸出(stdout和stderr)重定向到文件:

使用bash:

java -Xmx900m -server -jar start.jar > stdout.txt 2> stderr.txt 

崩潰後,檢查這些文件。

如果崩潰是由於信號(如SEGV =分段錯誤)引起的,那麼JVM應在您啓動java的位置轉儲文件。對於Sun VM(熱點),它類似於hs_err_pid12121.log(這裏的12121是進程ID)。

+0

謝謝這是我的理想解決方案從碼頭輸出到一個文本文件 – patrickandroid 2010-08-27 18:33:38

1

膩子斷開強烈暗示服務器內存不足並開始關閉左右進程。這可能是你的碼頭實例變得太大了。

現在要做的最簡單的事情就是增加1-2 Gb 更多交換空間並重新執行。另請注意,您可以使用jvisualvm附加到jetty實例以直接獲取運行時信息。

+0

謝謝我添加更多的交換使用:http:// www.debian的管理。組織/用品/ 550 – patrickandroid 2010-08-30 05:24:57