Java アプリケーションの起動中に、Java 仮想マシン (JVM) のガベージコレクションメカニズムと Just-In-Time (JIT) パラメータを設定することで、ACS のインプレーススケーリング機能をより有効に活用できます。このトピックでは、ParallelGCThreads、ConcGCThreads、CICompilerCount パラメータなど、Java アプリケーションの起動を高速化するための推奨 JVM 設定について説明します。
背景情報
Java アプリケーションの起動中は、クラスのロード、バイトコードのコンパイル、バイトコードの最適化など、複雑な処理が行われます。起動プロセスには数十分かかることもあります。Java アプリケーションは通常、起動時にリソースの半分以上をアプリケーション以外のコードのロードとコンパイルに使用します。アプリケーションが安定して動作した後、これらのリソースはアイドル状態になります。ACS のインプレーススケーリング機能を使用して、Java アプリケーションの起動時により多くの計算能力を割り当て、起動を高速化できます。
コンパイルスレッド、ユーザースレッド、ガベージコレクションスレッドは JVM 上で実行されます。これらのスレッドが占有するリソースの割合は、Java アプリケーションの動作ステージによって異なります。Java アプリケーションの起動をより効果的に高速化し、安定した動作を確保するために、JVM パラメータを変更して、これらのスレッドに適切にリソースを割り当てることができます。
推奨される JVM 設定
次のセクションでは、Java アプリケーションの起動に関連するパラメータと推奨設定について説明します。これには、ParallelGCThreads、ConcGCThreads、CICompilerCount が含まれます。
ユーザーアプリケーションに割り当てられた vCPU の数を
JVM パラメータ | 説明 | 推奨設定 | |
| 並列ガベージコレクションスレッドの数。 |
| |
| 同時ガベージコレクションスレッドの数。これらのスレッドはアプリケーションスレッドと同時に実行され、ダウンタイムを短縮します。そのため、これらのスレッド用に十分な CPU リソースを予約する必要があります。 |
| |
| JIT コンパイルスレッドの数。この値はアプリケーションの効率に影響します。頻繁な JIT コンパイルは、パフォーマンスのボトルネックを引き起こす可能性があります。JIT スレッドの数が少なすぎると、メソッドの実行効率が低下し、過剰な CPU リソースが占有される可能性があります。 | スケーリング後の vCPU ( |
|
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: 4GiJVM 設定
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