随着时间的推移,CPU / JVM / JBoss 7变慢

我在JBoss 7.1.1 Final上遇到了性能下降的问题。 我写了一个简单的程序来展示这种行为。 我生成了一个10万个随机整数的数组,并对其执行冒泡sorting。

@Model public class PerformanceTest { public void proceed() { long now = System.currentTimeMillis(); int[] arr = new int[100000]; for(int i = 0; i < arr.length; i++) { arr[i] = (int) (Math.random() * 200000); } long now2 = System.currentTimeMillis(); System.out.println((now2 - now) + "ms took to generate array"); now = System.currentTimeMillis(); bubbleSort(arr); now2 = System.currentTimeMillis(); System.out.println((now2 - now) + "ms took to bubblesort array"); } public void bubbleSort(int[] arr) { boolean swapped = true; int j = 0; int tmp; while (swapped) { swapped = false; j++; for (int i = 0; i < arr.length - j; i++) { if (arr[i] > arr[i + 1]) { tmp = arr[i]; arr[i] = arr[i + 1]; arr[i + 1] = tmp; swapped = true; } } } } 

}

在启动服务器之后,运行此代码大约需要22秒。 几天后的JBoss 7.1.1。 运行这个代码需要330秒 。 在这两种情况下,当CPU利用率非常低(比如1%)时,我都会启动代码。 任何想法为什么? 我使用以下参数运行服务器:

-Xms1280m -Xmx2048m -XX:MaxPermSize = 2048m -Djava.net.preferIPv4Stack = true -Dorg.jboss.resolver.warning = true -Dsun.rmi.dgc.client.gcInterval = 3600000 -Dsun.rmi.dgc.server.gcInterval = 3600000 -Djboss.modules.system.pkgs = org.jboss.byteman -Djava.awt.headless = true -Duser.timezone = UTC -Djboss.server.default.config = standalone-full.xml -Xrunjdwp:transport = dt_socket ,地址= 8787,服务器= Y,暂停=正

我正在Linux 2.6.32-279.11.1.el6.x86_64上使用java版本“1.7.0_07”运行它。

它在J2EE应用程序中。 我使用CDI,所以我在JSF页面上有一个button,它将在@RequestScoped组件PerformanceTest上调用方法“proceed”。 我将其作为单独的war文件进行部署,即使取消部署其他应用程序,也不会改变性能。

这是一个与另一台机器共享CPU的虚拟机,但不会消耗任何东西。

这里还有一个观察:当服务器重新启动后,我运行冒泡sorting,它利用了100%的一个处理器核心。 它永远不会切换到另一个核心或降低95%以下的利用率。 然而,经过一段时间的服务器运行,我遇到了性能问题,上面的方法是利用CPU核心通常100%,但是我刚刚从htop发现,这个任务是经常切换到其他核心。 也就是说,开始的时候它运行在核心#1上,在2秒钟之后它在#5上运行,然后在2秒钟8之后运行。此外,核心上的利用率不是保持在100%,而是有时下降到80%甚至更低。

对于重新启动后的服务器,即使如果我模拟一个负载,它也不会将任务切换到另一个内核。

它可能与以下Java 7 CodeCache错误有关: http ://bugs.java.com/view_bug.do?bug_id=8023191。

在运行了几天之后,我们遇到了类似的JBoss 7.1.1和Java 7的“放缓”问题。 将ReservedCodeCacheSize增加到256m并将UseCodeCacheFlushing设置为true解决问题。

您可以使用JConsole来监视CodeCache利用率。

升级到JBoss 7.1.4-SNAPSHOT解决了这个问题。 看看这个主题: https : //community.jboss.org/thread/213546?start=0&tstart=0

我相信一次testing使用100000次的方法(Math.random())不会在不同的testing中产生相同的一组数字,因此重新sorting需要不同的时间。 你应该使用java.util.Random在每个testing的开始(它将以相同的种子开始)创build一个新的伪随机生成器,并使用nextDouble()来获得一个新的数字。 你可以尝试不同的种子(setSeed(…))。