Java Web应用程序真的很慢

时间:2012-01-05 07:06:43

标签: java performance hosting rackspace-cloud geronimo

我使用Rackspace作为托管服务提供商,使用他们的云服务器托管,使用256mb计划。

我正在使用Geronimo 2.2来运行我的java应用程序。

服务器启动没问题,加载Geronimo的速度非常快,但是,当我开始部署我的Web应用程序时,它会花费很长时间,一旦部署完毕,就需要永远浏览页面。

我一直在监视服务器活动,CPU不是那么忙,但是,60%的内存正在用完。这可能是问题吗?

如果是这样,我的选择是什么?我是否应该考虑将此云服务器升级到具有更多RAM的内容,或者更改主机提供商以更好地满足我的需求?

<小时/>

编辑: 我应该注意,即使我没有部署我的应用程序,只是加载了Geronimo,有时我会在尝试关闭Geronimo时获得连接时间。

此外,数据库与应用程序位于同一服务器上。 (但我不会说它的查询密集)

<小时/>

更新
在@matiu建议之后,我尝试运行free -m,这是我得到的输出:

             total       used       free     shared    buffers     cached
Mem:           239        232          6          0          0          2
-/+ buffers/cache:        229          9
Swap:          509        403        106

这与运行 ps ux 完全不同,这就是我之前的60%。

我做了iostat检查,大约25%的爱情时间,设备不断写作和阅读。

<小时/> 的更新
我的主机升级到512MB,现在速度很快!我应该注意的是,我忘记了Java的永久代内存,它也被Geronimo使用。事实证明,我确实需要更多的RAM,更多的RAM确实解决了我的问题。 (正如所料)耶。

3 个答案:

答案 0 :(得分:1)

我猜你正在遇到'交换'。

正如您所知,Linux将一些内存交换到磁盘。这对于无法访问的内存非常有用。

当Java开始吃堆和堆时,linux启动:

  1. 将内存块A交换到磁盘以在块B中读取空间
  2. 读/写块B
  3. 将块B交换到磁盘以为其他块提供空间。
  4. 由于磁盘比RAM慢1000倍,随着内存使用量的增加,您的机器研磨越来越接近停止。

    使用256 MB云服务器,您可以获得512 MB的交换空间。


    <强>检查:

    您可以检查free -m是否属于这种情况。this page显示如何阅读输出:

    接下来我将检查'iostat 5'以查看交换分区上的磁盘IO速率。我会说300或更高的写入率意味着你几乎死在水中。我想你要保持交换分区的写入速率低于每秒​​50个块,并且读取速率低于每秒​​500个块...如果可能的话,大多数时候都应该为零。记住磁盘比RAM慢1000倍。

    您可以通过运行top并按shift+m按内存消耗顺序来检查是否是Java吃了ram。

    如果你想...你可以用swapoff -a禁用交换分区..然后打开网络控制台,然后点击网站...你很快就会在控制台中看到错误消息,如'OOM杀死进程xxx'(我认为OOM用于内存不足)。如果你看到那些linux试图通过杀死进程来满足内存请求。一旦发生这种情况,最好硬重启。


    <强>定影

    如果是使用RAM的Java .. this link可能有帮助。

    我认为简单的解决方法就是升级云服务器的大小。

    您可能会发现不同的Java RTE可能更好。

    如果您在a 32 bit chroot中运行它,则可能会占用更少的内存。

答案 1 :(得分:0)

您应该考虑运行虚拟专用Linux服务器,例如linode。 您必须担心如何启动Java服务以及防火墙等等,但是一旦您做对了,您实际上是自己的托管服务提供商,允许您执行独立的实际Linux机箱可以执行的操作

至于记忆,在你有证据表明你没有足够的证据之前我不会升级。 60%用完了不到100%用完......

Java通常假定它可以接受分配给它的任何内容。这意味着,如果你给它最多200MB,它就可以拿200MB,即使它使用的更少。 通过使用-Xincgc增量垃圾收集器,有一种方法可以使Java使用更少的内存。它实际上最终会在不再需要时将大块内存返回给系统。这真的有点保密。你不会看到有人指出这一点......

答案 2 :(得分:0)

根据我的经验,VPS上的内存和CPU负载非常相关。这意味着,当应用程序服务器占用所有可用内存时,CPU使用率开始飙升,最终导致应用程序无法访问。

这只是一个副作用 - 你真的需要调查问题的来源!

如果内存消耗非常高,那么可能有多种原因:

  1. 这是正常的 - 也许你已经到了一个点,所有进程(应用程序服务器,其中的应用程序,后台进程,守护进程,操作系统等)放在一起需要大量的内存。 这是最不可能的情况
  2. 内存泄漏 - 可能由于框架或某些库(不太可能)或您自己的代码(可能)中的错误而发生。 可以监控并解决
  3. 大量请求 - 每个请求都将处理CPU和内存。您可以查看每秒请求数与内存消耗之间的相关性,这意味着可以对其进行监控和解决。
  4. 如果您对CPU使用感兴趣:

    1. 再次,监控对您的应用程序的请求。对于不断计算的请求 - 没有什么特别的事情可以发生。
    2. 一个组件耗尽了大部分资源(也许您的数据库安装在同一台服务器上,并且由于查询效率低而使用所有CPU功能?慢速日志会有所帮助。)
    3. 正如您所看到的,这不是一项微不足道的任务,但您可以获得可以帮助您的工具支持。我个人使用java melodyprobe