OpenShiftクラスターのDockerコンテナー内で実行しているSpringBootアプリケーションがあります。定常状態では、アプリケーションのインスタンスがN個(たとえばN = 5)あり、要求はこれらのN個のインスタンスに負荷分散されます。すべてが正常に実行され、応答時間は短くなります(〜5ms、合計スループットは〜60k)。
新しいインスタンスを追加するたびに、応答時間は一時的に増加し(最大70ミリ秒)、その後通常に戻ります。
このタイプのコールドスタートを回避するために私にできることはありますか?トラフィックを送信する前に、連続して最大100のcurl呼び出しを行うことでアプリを事前にウォームアップしようとしましたが、それは役に立ちませんでしたか?
同時実行性の高い、より優れたウォームアップスクリプトが必要ですか?これを処理するためのより良い方法はありますか?
ありがとう
マイクロサービスでも同様の問題に直面しました。ウォームアップのためにコンポーネントを追加しました
ApplicationStartup implements ApplicationListener<ApplicationReadyEvent>
アプリケーション内で、アプリケーションの起動直後にサービスを呼び出すために、これは私たちのために働きました。このソリューションでは、ペイロードで使用されるすべてのクラスが、起動するすべてのインスタンスでインスタンスの起動直後にロードされることが保証されており、呼び出しを行うために外部スクリプトは必要ありません。また、外部スクリプトの問題は、呼び出しが新しいインスタンスによって処理されるかどうかを確実に言うことはできません。
@Component
public class ApplicationStartup implements ApplicationListener<ApplicationReadyEvent> {
@Autowired
YourService yourService;
@Override
public void onApplicationEvent(final ApplicationReadyEvent event) {
System.out.println("ApplicationReadyEvent: application is up");
try {
// some code to call yourservice with property driven or constant inputs
} catch (Exception e) {
e.printStackTrace();
}
}
}
まず、 JITコンパイル を有効にして結果を比較してみます。 Baeldungの良い記事 GraalのパフォーマンスをデフォルトのC1およびC2JITコンパイラと比較しています-ワークロードに対していくつかのテストを実行することをお勧めします。基本的に、Javaアプリケーションを実行するときは、次のオプションを設定する必要があります。
-XX:+ UnlockExperimentalVMOptions -XX:+ EnableJVMCI -XX:+ UseJVMCICompiler
また、Spring BootのアクチュエーターヘルスチェックURL(/アクチュエーター/ヘルス)を使用して OpenShiftで設定済みレディネスプローブ であることを確認してください。そうしないと、コンテナはサービスを提供する準備ができる前にトラフィックを受信する可能性があります。
準備プローブは、コンテナーが要求を処理する準備ができているかどうかを判別します。準備プローブがコンテナーに失敗した場合、エンドポイントコントローラーは、コンテナーのIPアドレスがすべてのサービスのエンドポイントから削除されていることを確認します。レディネスプローブを使用して、コンテナが実行されていても、プロキシからトラフィックを受信してはならないことをエンドポイントコントローラに通知できます。ポッド構成のtemplate.spec.containers.readinessprobeスタンザを構成して、準備チェックを設定します。
最後に、応答をNGINXまたはその他のリバースプロキシによってキャッシュすることも役立ちます。
リクエストを処理するときにアプリケーションが正常であるにもかかわらず、応答が遅いという問題がある場合は、有効にすることを試みる必要があります階層型コンパイル
-XX:CompileThreshold -XX:TieredCompilation
通常、VMは、インタープリターを使用して、コンパイラーに供給されるメソッドに関するプロファイリング情報を収集します。階層型スキームでは、インタープリターに加えて、クライアントコンパイラーを使用して、のコンパイル済みバージョンを生成します。自分自身に関するプロファイリング情報を収集するメソッド。
コンパイルされたコードはインタープリターコードよりも大幅に高速であるため、プログラムはプロファイリングフェーズでより優れたパフォーマンスで実行されます。