CPU/JVM/JBoss 7 隨著時間的推移變慢
我在 JBoss 7.1.1 Final 上遇到性能下降的問題。我編寫了簡單的程序來展示這種行為。我生成了一個包含 100,000 個隨機整數的數組並對其執行冒泡排序。
@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,掛起=n
我在 Java 版本為“1.7.0_07”的 Linux 2.6.32-279.11.1.el6.x86_64 上執行它。
它在 J2EE 應用程序中。我使用 CDI,所以我在 JSF 頁面上有一個按鈕,它將在 @RequestScoped 組件 PerformanceTest 上呼叫方法“proceed”。我將其部署為單獨的 war 文件,即使我取消部署其他應用程序,它也不會改變性能。
它是一個與另一台機器共享 CPU 但不消耗任何東西的虛擬機。
這是另一個觀察結果:當伺服器重新啟動並且我執行冒泡排序時,它使用了 100% 的一個處理器核心。它永遠不會切換到另一個核心或將使用率降至 95% 以下。然而,在伺服器執行一段時間後,我遇到了性能問題,上面的方法通常是 100% 使用 CPU 核心,但是我剛剛從 htop 發現這個任務經常被切換到其他核心。也就是說,一開始它在核心 #1 上執行,2 秒後它在 #5 上執行,然後在 2 秒後 #8 等等。此外,核心使用率不會保持在 100%,但有時會下降到 80%甚至更低。
對於重新啟動後的伺服器,即使我模擬負載,它也不會將任務切換到另一個核心。
升級到 JBoss 7.1.4-SNAPSHOT 解決了這個問題。看看這個執行緒:https ://community.jboss.org/thread/213546?start=0&tstart=0
它可能與以下 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 使用率。