2010-08-18 98 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