【问题标题】:Java web application really slowJava Web 应用程序真的很慢
【发布时间】:2012-02-03 01:26:50
【问题描述】:

我使用 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% 的 iowait 时间,并且设备在不断地读写。


更新:
已将我的主机升级到 512MB,现在它可以加快速度了!我应该注意的是,我忘记了 Java 的永久代内存,它也被 Geronimo 使用。事实证明,我确实需要更多的 RAM,而更多的 RAM 确实解决了我的问题。 (正如预期的那样)是的。

【问题讨论】:

  • 可能是您的应用程序有问题,或者是网络问题,或者...?应用程序服务器 150MB 的内存占用相当普遍(实际上它很低),所以我想这不是问题。
  • 应用程序在本地主机(我的本地计算机)上运行良好,网络也应该很好。问题不在于我的应用程序,因为我什至无法在 Web 客户端上导航 Geronimo 控制台。
  • Geronimo 和 WAS 消耗的资源是 Glassfish 的 3 倍。
  • 当您说“256MB 计划”时,您的意思是您的(虚拟)服务器有 256MB 内存吗?如果是这样,我肯定会尝试升级 RAM - 我会从你的 localhost 开始。

标签: java performance hosting rackspace-cloud geronimo


【解决方案1】:

我猜你遇到了“交换”。

如您所知,Linux 会将一些内存换出到磁盘。这对于不经常访问的内存非常有用。

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

  1. 将内存块 A 交换到磁盘以腾出空间来读取块 B
  2. 读/写块B
  3. 将块 B 交换到磁盘以为其他块腾出空间。

由于磁盘比 RAM 慢 1000 倍,随着内存使用量的增加,您的机器会越来越接近停机。

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


检查:

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

接下来,我将使用“iostat 5”检查交换分区上的磁盘 IO 速率。我会说 300 或更高的写入率意味着您几乎死在水中。我会说您希望将交换分区的写入速率保持在每秒 50 个块以下,而将读取速率保持在每秒 500 个块以下。如果可能的话,大多数情况下两者都应该为零。请记住,磁盘比 RAM 慢 1000 倍。

您可以通过运行top 并点击shift+m 来检查是否是Java 吃掉了内存,以按内存消耗对进程进行排序。

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


修复:

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

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

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

如果您在 a 32 bit chroot 中运行它,它可能会使用更少的 RAM。

【讨论】:

  • 嘿,谢谢!这是一个很好的回应。您能否澄清“300 或更多的写入速率”,我怎么知道哪个是交换分区?通过运行 iostat,输出显示我有 2 个设备,xvdc 和 xvda。 xvdc 正在做大部分工作,通常 tps 超过 1000,kB_read/s 超过 3000,kB_write/s 超过 1000。但总的来说,我想我知道我的问题出在哪里。今晚我会尝试升级我的服务器,如果它成功了会告诉你。
  • PermGen 也占用了内存,感谢您的帮助!
  • 我很确定 xvdc 将成为您的交换分区。运行可以看到:sudo grep xvd /etc/fstab;每秒 3000 次写入太高了.. 那真的会扼杀你的表现。绝对是内存使用过多。
【解决方案2】:

您应该考虑运行虚拟专用 Linux 服务器,例如 linode。 您必须担心如何启动 Java 服务以及诸如防火墙之类的东西,但是一旦您做对了,您实际上就是自己的托管服务提供商,允许您做任何独立的实际 Linux 机器可以做的事情.

至于内存,我不会升级,直到你有证据证明你没有足够的内存。 60% 用完小于 100% 用完...

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

【讨论】:

    【解决方案3】:

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

    不过,这只是一个副作用 - 您确实需要调查问题的根源!

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

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

    如果您对 CPU 使用率感兴趣:

    1. 再次,监控对您的应用程序的请求。对于不断计数的请求 - 不会发生任何异常情况。
    2. 一个组件正在耗尽大部分资源(可能您的数据库安装在同一台服务器上,并且由于查询效率低下而使用了所有 CPU 资源?慢日志会有所帮助。)

    如您所见,这不是一项简单的任务,但您拥有可以帮助您解决问题的工具支持。我个人使用java melodyprobe

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多