すべてのプロダクト
Search
ドキュメントセンター

Container Compute Service:Java アプリケーションの起動を高速化するための JVM パラメータの設定

最終更新日:Dec 27, 2024

Java アプリケーションの起動中に、Java 仮想マシン (JVM) のガベージコレクションメカニズムと Just-In-Time (JIT) パラメータを設定することで、ACS のインプレーススケーリング機能をより有効に活用できます。このトピックでは、ParallelGCThreadsConcGCThreadsCICompilerCount パラメータなど、Java アプリケーションの起動を高速化するための推奨 JVM 設定について説明します。

背景情報

Java アプリケーションの起動中は、クラスのロード、バイトコードのコンパイル、バイトコードの最適化など、複雑な処理が行われます。起動プロセスには数十分かかることもあります。Java アプリケーションは通常、起動時にリソースの半分以上をアプリケーション以外のコードのロードとコンパイルに使用します。アプリケーションが安定して動作した後、これらのリソースはアイドル状態になります。ACS のインプレーススケーリング機能を使用して、Java アプリケーションの起動時により多くの計算能力を割り当て、起動を高速化できます。

コンパイルスレッド、ユーザースレッド、ガベージコレクションスレッドは JVM 上で実行されます。これらのスレッドが占有するリソースの割合は、Java アプリケーションの動作ステージによって異なります。Java アプリケーションの起動をより効果的に高速化し、安定した動作を確保するために、JVM パラメータを変更して、これらのスレッドに適切にリソースを割り当てることができます。

推奨される JVM 設定

次のセクションでは、Java アプリケーションの起動に関連するパラメータと推奨設定について説明します。これには、ParallelGCThreadsConcGCThreadsCICompilerCount が含まれます。

ユーザーアプリケーションに割り当てられた vCPU の数を とします。CPU インプレーススケーリングが有効になっている場合、アプリケーションには起動プロセス中に () 個の vCPU が割り当てられます。上記の JVM パラメータを大きな値に設定すると、vCPU の数 () が増加します。起動プロセスが終了した後、vCPU の数 に減少することを考慮して、過度に大きな値を設定せず、スケーリングが起動終了まで持続するようにしてください。そうしないと、CPU リソースが不足し、スレッドのパフォーマンスが低下します。

JVM パラメータ

説明

推奨設定

ParallelGCThreads

並列ガベージコレクションスレッドの数。

vCPU の場合、-XX:ParallelGCThreads=Y を設定します。

の場合、-XX:ParallelGCThreads= を設定します。

ConcGCThreads

同時ガベージコレクションスレッドの数。これらのスレッドはアプリケーションスレッドと同時に実行され、ダウンタイムを短縮します。そのため、これらのスレッド用に十分な CPU リソースを予約する必要があります。

-XX:ConcGCThreads= を設定します。これは、並列ガベージコレクションスレッドの 4 分の 1 に相当します。

CICompilerCount

JIT コンパイルスレッドの数。この値はアプリケーションの効率に影響します。頻繁な JIT コンパイルは、パフォーマンスのボトルネックを引き起こす可能性があります。JIT スレッドの数が少なすぎると、メソッドの実行効率が低下し、過剰な CPU リソースが占有される可能性があります。

スケーリング後の vCPU ()

CICompilerCount

1

2

2

2

4

3

8

3

16

8

32

10

64

12

ユースケース

オーケストレーション設定

システムが Java アプリケーションのインスタンスを作成するときに、インプレーススケーリングを使用して、アプリケーションに割り当てられた CPU リソースを 2 倍にし、スケーリングがアプリケーションが Ready 状態になるまでのみ持続するようにすることができます。これにより、アプリケーションの起動を効率的に高速化できます。アプリケーションが多くのライブラリをロードする必要がある場合、または JVM のコンパイルとウォームアップに加えて他の初期化操作を実行する必要がある場合は、スケーリングを長くすることができます。

重要

スケールダウン後にアプリケーションがウォームアップを実行する場合、CPU 使用率が高いときに、ガベージコレクションスレッドと JIT スレッドが CPU リソースをめぐってアプリケーションと競合する可能性があります。これは、スケールアップ中にガベージコレクションスレッドと JIT スレッドにより多くの vCPU が割り当てられるためです。この問題を解決するには、スケールアップ中にアプリケーションがウォームアップを完了するようにしてください。

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: spring-with-burst
  name: spring-with-burst
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      app: spring-with-burst
  minReadySeconds: 400 # CPU バースト期間よりも大きい値を設定します。これにより、CPU バースト終了後のインスタンスの状態を確認できます。
  template:
    metadata:
      annotations:
        alibabacloud.com/startup-cpu-burst-factor: '2' # CPU バースト係数を 2 に設定します。起動中は、元の 1 vCPU が 2 vCPU にスケーリングされます。
        alibabacloud.com/startup-cpu-burst-duration-seconds: "300" # デフォルト値 (30 秒) は短すぎます。ほとんどの Java アプリケーションは、起動に 10 分以内、ウォームアップにさらに 5 分かかります。より大きな値を設定することをお勧めします。
        scaling.alibabacloud.com/enable-inplace-resource-resize: 'true' # インプレーススケーリングを有効にします。
      labels:
        alibabacloud.com/compute-class: general-purpose
        alibabacloud.com/compute-qos: default
        app: spring-with-burst
    spec:
      containers:
        - image: 'registry.cn-hangzhou.aliyuncs.com/acs-demo-ns/demo-java:java-with-metrics-v1'
          imagePullPolicy: IfNotPresent
          name: spring
          ports:
            - containerPort: 8080
              protocol: TCP
          resources:
            limits:
              cpu: 1
              memory: 4Gi
            requests:
              cpu: 1
              memory: 4Gi

JVM 設定

vCPU の数を 2 倍にするには、次の設定を使用します。

元の vCPU

CPU バースト後の vCPU

ParallelGCThreads

ConcGCThreads

CICompilerCount

0.5

1

1

1

2

1

2

2

1

2

2

4

4

1

3

4

8

8

2

3

8

16

13

3

8

コンテナ内で次の Java コマンドを実行して、現在の Java バージョンで使用されているデフォルトのスレッド設定 (ParallelGCThreads など) を確認できます。

java -XX:+PrintFlagsFinal -version | grep ParallelGCThreads

たとえば、元の 1 vCPU が 2 vCPU にスケーリングされます。デフォルトのスレッド設定が推奨設定と大きく異なる場合は、Java アプリケーションの起動コマンドを次のように変更できます。

java -XX:ParallelGCThreads=2 -XX:ConcGCThreads=1 -XX:CICompilerCount=2 -jar app.jar