web-dev-qa-db-ja.com

CPU / JVM / JBoss7は時間の経過とともに遅くなります

JBoss 7.1.1Finalでパフォーマンスが低下します。この動作を実証する簡単なプログラムを作成しました。 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秒かかります。 JBoss7.1.1の数日後。実行中、このコードを実行するには0秒かかります。どちらの場合も、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 、address = 8787、server = y、suspend = n

Linux2.6.32-279.11.1.el6.x86_64でJavaバージョン "1.7.0_07"を使用して実行しています。

J2EEアプリケーション内にあります。私はCDIを使用しているので、JSFページに@RequestScopedコンポーネントPerformanceTestのメソッド「proceed」を呼び出すボタンがあります。これを個別のwarファイルとしてデプロイし、他のアプリケーションをデプロイ解除しても、パフォーマンスは変わりません。

これは、CPUを別のマシンと共有している仮想マシンですが、そのマシンは何も消費しません。

さらに別の観察結果があります。サーバーが新たに起動した後、バブルソートを実行すると、1つのプロセッサコアを100%使用します。別のコアに切り替えたり、使用率を95%未満に下げたりすることはありません。ただし、サーバーが実行されていてパフォーマンスの問題が発生した後、上記の方法では通常100%CPUコアを使用していますが、htopから、このタスクが他のコアに頻繁に切り替えられていることがわかりました。つまり、最初はコア#1で実行され、たとえば2秒後に#5で実行され、次にたとえば2秒#8で実行されます。さらに、使用率はコアで100%に保たれず、80%に低下することがあります。またはそれ以下。

新たに起動した後のサーバーの場合、負荷をシミュレートしても、タスクが別のコアに切り替わることはありません。

4
lukas

この問題は、JBoss7.1.4-SNAPSHOTにアップグレードすることで解決されました。このスレッドを見てください: https://community.jboss.org/thread/213546?start=0&tstart=

1
lukas

これは、次のJava 7 CodeCacheバグ: http://bugs.Java.com/view_bug.do?bug_id=8023191 に関連している可能性があります。

JBoss7.1.1およびJava 7を数日間実行した後、同様の「スローダウン」問題が発生しました。ReservedCodeCacheSizeを_256m_に増やし、UseCodeCacheFlushingtrueに設定すると問題が解決しました。

JConsoleを使用して、CodeCacheの使用率を監視できます。

2
Vojtěch Toman

1つのテストで100000回使用するメソッド(Math.random())は、異なるテストで同じ数値のセットを生成しないため、並べ替えにかかる時間は異なると思います。 Java.util.Randomを使用して、各テストの開始時に新しい疑似ランダムジェネレーターを作成し(同じシードで開始します)、nextDouble()を使用して新しい番号を取得する必要があります。異なるシードを使用して異なるテストを試すことができます(setSeed(...))。

0
Marc