我使用 Rackspace 作为托管提供商,使用他们的云服务器托管,计划为 256mb。
我正在使用 Geronimo 2.2 来运行我的 java 应用程序。
服务器启动没有问题,加载 Geronimo 速度相当快,但是,当我开始部署 Web 应用程序时,它花了很长时间,而且一旦部署完毕,就需要很长时间才能浏览页面。
我一直在监视服务器 Activity ,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 也使用它。事实证明,我确实需要更多的内存,而更多的内存确实解决了我的问题。 (如预期)是的。
最佳答案
我猜你遇到了“交换”。
正如您所知,Linux 将一些内存交换到磁盘。这对于访问次数不多的内存来说非常有用。
当Java开始吃堆和堆时,linux启动:
- 将内存块 A 交换到磁盘,以便为 block B 中的读取腾出空间
- 读/写 block B
- 将 block B 交换到磁盘,为其他 block 腾出空间。
由于磁盘比 RAM 慢 1000 倍,随着内存使用量的增加,您的机器越来越接近停止。
使用 256 MB 云服务器,您可以获得 512 MB 交换空间。
<小时/>检查:
您可以使用free -m
检查是否属于这种情况.. this page显示如何读取输出:
接下来我将使用“iostat 5”检查交换分区上的磁盘 IO 速率是多少。我想说,写入速率为 300 或更高意味着您几乎已经死在水里了。我想说你希望将交换分区的写入速率保持在每秒 50 个 block 以下,读取速率保持在每秒 500 个 block 以下。如果可能的话,大多数情况下两者都应该为零。请记住,磁盘比 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 中运行它它可能使用更少的内存。
关于Java Web 应用程序真的很慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8738824/