0

我们有一个 64 位 JBoss 实例,它部署了一个轴 Web 服务,它只是运行本机可执行命令的前端。当调用 Web 服务时,它会执行这个本机可执行命令。64 位实例使用 3gb 内存运行。

我们最近介绍了在同一台物理机上运行的第二个 JBoss 实例。它以 32 位模式运行,因为它必须运行一些 JNI 32 位代码。JBoss 的第二个实例绑定到 ports-01,因此它在 8180 上运行(基本上是默认 JBoss 端口的 +100)。此实例使用 512MB 内存运行。

自从引入第二个 JBoss 实例后,当 64 位实例在调用时尝试执行本机可执行命令时,我们会收到“空间不足”错误消息。这是来自 java 的 IOException,来自 unix forkAndExec 命令。我读到的所有内容都说这与交换文件大小有关。使用 unix, top 命令,看起来交换文件的大小永远不会改变,它是 3gb。当我们首先运行 64 位实例时,这似乎没有问题,但如果先启动 32 位实例,则会出现此错误。我想知道这两个实例是否在争夺资源,或者我们是否真的用完了来自 unix 的交换空间。我不确定 JBoss 是否使用交换空间以及它使用了多少,或者 Java 是否处理它?

我想我正在寻找有关此问题的解决方案的任何想法或建议。我似乎看到的主要模式是,如果 64 位实例首先启动,则本机可执行文件可以正常工作,但如果 32 位实例首先启动,则会出现问题。

4

2 回答 2

0

毕竟这是一个交换空间问题。我们有 8GB 的​​内存和 4GB 的交换空间。一台服务器使用 800MB 的交换空间,另一台使用 3.8GB 的​​交换空间,这几乎没有超过我们的限制。

我们不得不使用 swap -s 来查看可用的交换空间大小,而不是在 unix 中使用“top”命令,这样更准确。

我们使用 mkfile 10240M /opt/myswapfile 之类的命令创建了一个临时交换文件。然后我们使用命令 swap -a /opt/myswapfile 将它添加到服务器上的交换区域。

现在他们似乎合作得很好。

于 2013-01-05T18:26:21.833 回答
0

操作系统处理交换空间,Java 不知道这些东西。在任何情况下,在交换空间中运行 Java 的任何部分都是一个非常糟糕的主意。

我会确保这两个程序运行后有足够的主内存(不仅仅是堆,还有这些进程使用的总内存)

于 2012-12-29T16:48:28.070 回答