Linux

CPU/JVM/JBoss 7 隨著時間的推移變慢

  • April 9, 2014

我在 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 使用率。

引用自:https://serverfault.com/questions/454427