0

我使用 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 确实解决了我的问题。(正如预期的那样)是的。

4

3 回答 3

1

我猜你遇到了“交换”。

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

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

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

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

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


检查:

free -m您可以使用..检查是否属于这种情况。此页面显示了如何读取输出:

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

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

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


定影:

如果它是使用 RAM 的 Java ..这个链接可能会有所帮助。

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

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

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

于 2012-01-05T11:05:18.777 回答
0

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

至于内存,除非您有证据表明您没有足够的内存,否则我不会升级。60%用完小于100%用完...

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

于 2012-01-05T07:17:06.217 回答
0

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

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

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

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

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

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

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

于 2012-01-05T07:23:08.503 回答