効率的な開発と設計: Spring アプリケーションの運用効率と生産性の向上 | JD Cloud テクニカル チーム

導入

現状と背景

Spring フレームワークは広く使用されている Java 開発フレームワークの 1 つで、強力な機能と柔軟性を備えていますが、大規模なアプリケーションでは、Spring フレームワークの複雑さと依存関係により、アプリケーションの起動時間とパフォーマンスに影響が出る可能性があります。これは、開発プロセスの遅延や開発の非効率につながる可能性があります。Springアプリケーションの起動速度やパフォーマンスの最適化は重要な課題であり、アプリケーションの初期化処理を分析・最適化し、不要な依存関係やコンポーネントの読み込みを削減し、非同期初期化や遅延読み込みなどの技術を活用することで、アプリケーションの起動を高速化することができます。パフォーマンスが大幅に向上しました。これにより、開発者は開発効率を向上させ、デバッグ時間を短縮し、より良いユーザー エクスペリエンスを提供できるようになります。

オンラインビジネスのjarパッケージは一般的に比較的大きく、jarパッケージの重さは数百メガバイトあり、起動時間は10分程度であり、障害時の急速な拡張への対応やローカル開発の効率が低下します。デバッグ中。そこで Spring プログラムの起動が遅い原因とその最適化方法を分析したところ、現在の効果としては、ほとんどの大規模アプリケーションの起動時間が 70% ~ 80% 短縮されることがわかりました。

主に以下の内容が含まれます

  • SpringBean のロードに時間がかかるタイムラインの視覚的分析(✅)
  • SpringBeanの視覚的な依存関係解析(✅)
  • アンロードされた JAR パッケージを適用 (JAR スリム化) (✅)
  • アプリケーション起動プロセススレッドウォールクロックフレームグラフ(✅)

重要性と影響

開発効率の向上: アプリケーションの起動速度が速くなったことで、開発とデバッグの時間を大幅に短縮できます。開発者はアプリケーションをより速く起動し、機能テストとデバッグを実行できるため、開発効率と反復速度が向上します。
導入と拡張の効率の向上: 起動速度を最適化することで、アプリケーションの導入と拡張にかかる時間とコストを削減できます。高速起動アプリケーションは、負荷の変化により迅速に応答し、システムのスケーラビリティと回復力を向上させます。
リソース使用率の最適化: 初期化時間を短縮し、リソースの読み込みを最適化することで、アプリケーションのメモリと CPU の使用率を削減できます。これにより、サーバーの使用率が向上し、アプリケーションの実行コストが削減されます。

分析ツール

  •  Arthas : Arthas は、Java アプリケーションをリアルタイムで監視および診断できるオープンソースの Java 診断ツールです。起動時のリソース消費や読み込み時間など、アプリケーションのパフォーマンスの問題を分析するための豊富なコマンドと関数のセットが提供されます。
  •  JVM サンドボックス: JVM サンドボックスは、Java アプリケーションへのアクセスを分離および制限するために使用される Java Security Manager ベースのテクノロジです。起動時のリソース消費と読み込み時間を削減し、アプリケーションの起動速度を向上させることができます。
  •  Async Profiler : Async Profiler は、アプリケーション パフォーマンス データを収集および分析するための、オーバーヘッドの低い非同期 Java パフォーマンス プロファイリング ツールです。これは、起動時のパフォーマンスのボトルネックや、起動速度に影響を与えるその他の問題を特定するのに役立ちます。
  •  起動高速化 - 非同期初期化方式: 非同期初期化方式は、一部の初期化タスクを非同期で実行することで起動時間を短縮し、アプリケーションの応答性を向上させる起動高速化テクノロジです。これは、スレッド プール、非同期フレームワーク、または非同期アノテーションを使用して実現できます。
  •  Spring Boot Startup Report : Spring Boot Startup Report は、Spring Boot アプリケーションの起動レポートを生成するツールです。各 Bean のロード時間、自動構成にかかる時間など、起動プロセスの分析と最適化に役立つ詳細な起動プロセス情報を提供できます。
  • Yeter UI : Jaeger UI は、分散トレース データを視覚化および分析するためのツールです。Yeter UI を使用すると、アプリケーションの起動プロセスを監視および分析し、潜在的なパフォーマンスの問題やボトルネックを特定できます。
  •  Spring Startup Analyzer : Spring Startup Analyzer は、Spring アプリケーションの起動プロセスからデータを収集し、インタラクティブな分析レポートを生成するために使用されるツールです。その目的は、Spring アプリケーションの起動の滞り点を分析し、Spring Bean の非同期初期化をサポートして Spring アプリケーションの起動時間を短縮および最適化することです。このツールは、Linux、Mac、および Windows オペレーティング システムでの実行をサポートし、spring-boot-startup-report を参照してユーザー インターフェイスを実装します。Spring Startup Analyzer を使用すると、アプリケーションの起動プロセス データを収集し、視覚的な HTML レポートを生成できます。このレポートは、Spring アプリケーションの起動パフォーマンスを分析し、潜在的な最適化の機会を特定するのに役立ちます。

Spring Startup Analyzer最適化ソリューション

Spring スタートアップ アナライザーの機能を利用して、ビジネス ラインの ARK プロジェクトを例として、Spring プロジェクトのスタートアップ プロセスの最適化と効率向上の方法について徹底的な調査を実施します。まず、ARK の基本的な起動状況を観察してみましょう。

スタートアップの概要

  •  起動時間: 起動時間
  •  Num of Bean: 初期化されたBeanの数
  •  使用済み/合計ジャー: 使用されたジャーの数/合計量
  •  未使用/合計 Jar: 未使用の Jar の数/合計量
  •  ClassLoader Count: クラスローダーの数

Spring Beanの初期化の詳細

  •  名前: 第 1 レベルの名前は Bean の名前に対応します。
  •  子を含む継続時間 (ms): Bean リファレンスのロード時間
  •  継続時間 (ms): Bean 自体のロード時間
  •  詳細: Bean をロードするためのクラスローダーとスレッド情報が含まれます (非同期でロードされる場合は複数の異なる情報が存在します)。



SpringBean のロードに時間がかかるタイムラインの視覚的分析

この観察項目は、Bean リファレンスの最後のレベルまでドリルダウンでき、各レベルのロード時間を確認できます。



アプリケーション起動処理スレッドウォールクロックフレームグラフ

フレームグラフを理解する方法

 

Y 軸は呼び出しスタックを表し、各レベルが関数になります。呼び出しスタックが深くなるほど、炎は高くなります。実行中の関数が一番上にあり、その親関数がその下にあります。

X 軸はサンプル数を表します。関数が X 軸上でより広い幅を占める場合は、より多くの回数サンプリングされたこと、つまり実行に時間がかかったことを意味します。X 軸は時間を表しているのではなく、すべての呼び出しスタックがマージされ、アルファベット順に並べられていることに注意してください。

フレーム グラフは、どのトップレベル関数が最大の幅を占めるかを確認するものです。「プラトー」がある場合は、関数にパフォーマンスの問題がある可能性があることを意味します。

色には特別な意味はなく、フレームグラフは CPU の忙しさを表すため、一般的には暖色が選択されます。

フレームグラフの概要

概要図からもわかるように、エントリー機能の占める割合が大きくなるのが3つありますので、以下それぞれを見ていきましょう。



炎部分画像1

フレーム グラフのこの部分から、 springfox は起動プロセス中に多くの初期化を実行し、多くの時間がかかることがわかります。この関数が必要ないプロジェクトの場合は、直接削除できます。



炎部分画像2

Spring Bean の初期化プロセスを理解する

この図からわかるように、Bean の作成プロセスにも多くの時間がかかります。



炎部分画像3

この図からもわかるように、BeanPostProcessor の登録にも時間がかかります。



アンロードされたjarパッケージの適用(Jarスリム化)

この観測項目では、プロジェクト開始後に使用されていないJarパッケージを収集できます。



導入と最適化の効果

操作手順と設定項目

Spring Startup Analyzer をインストールする

手動インストール

1. [realease] をクリックして、tar.gz パッケージの最新バージョンをダウンロードします。
2. 新しいフォルダーを作成して解凍します。

Linux/Macシステムの場合は、次のコマンドの使用を検討できます。

mkdir -p ${HOME}/spring-startup-analyzercd 下载路径
tar -zxvf spring-startup-analyzer.tar.gz -C 安装路径/spring-startup-analyzer

スクリプトのインストール (Linux/Mac)

curl -sS https://raw.githubusercontent.com/linyimin0812/spring-startup-analyzer/main/bin/install.sh | sh

スクリプトのデフォルトのインストール パス:$HOME/spring-startup-analyzer

アプリケーションの起動

spring-startup-analyzer はエージェントとして起動されるので、起動コマンドにパラメータを追加するだけです-javaagent:安装路径/spring-startup-analyzer/lib/spring-profiler-agent.jar

  •  Java コマンド ラインを使用してアプリケーションを起動するには、コマンド ラインにパラメータを追加します。次に例を示します。
java -javaagent:/Users/runner/spring-startup-analyzer/lib/spring-profiler-agent.jar \
    -Dproject.name=mac-demo \
    -Dspring-startup-analyzer.admin.http.server.port=8066 \
    -jar /Users/runner/spring-startup-analyzer/ARK.jar

  •  IDEA で開始するには、以下を追加する必要があります。



ログファイルのパス:安装路径/spring-startup-analyzer/logs

  •  startup.log: 起動時のログ
  •  transform.log: 再変換されたクラス/メソッド情報

アプリケーションが開始されると、コンソールとstartup.logファイルに出力されます。この出力を使用して、収集が完了したかどうかを判断できます。======= spring-startup-analyzer finished, click http://localhost:xxxx to visit details. ======

起動時間とパフォーマンスの向上

最適化前

プレリリースの平均起動時間は 10 分で、ローカルで起動することはできません。各要件をプレリリース環境に送信して検証する必要があります。開発とリリースのサイクルは比較的長く、接続されている実稼働ライブラリの数は非常に多くなります。リリース前の環境に任意に増やすことはできません。プロジェクトは 585 個の jar を参照していますが、そのうち 337 個の jar は使用されていません。



遅い Bean 分析

分析の結果、時間のかかるランキングの上位にあるインターフェイスはすべて jsf 関連の読み込みであり、es 関連の Bean も存在することがわかります。

関数パス:メソッド呼び出しの詳細 --> AbstractAutowireCapableBeanFactory.createBean



jsf起動の最適化

注:index="登録センターのアドレス" の "登録センターのアドレス" は匿名化されています。特定のシナリオで独自のコードの構成を確認してください。

jsf プロデューサの登録センターが起動すると、IP のバッチが取得され、jsf の登録が常に試行されます。オフィス環境では、これらの IP にアクセスできないため、起動プロセスが再試行されます。

    <!-- 预发、生产的注册中心 -->
    <jsf:registry id="jsfRegistry" protocol="jsfRegistry" index="注册中心地址"/>

ローカルホストにjsf公開アドレスのホスト構成を追加します 下記の*.*.*.*を自分のものに置き換えて使用してください pingテストが可能です 登録センターのアドレスを取得します 「登録センターのアドレス」を上記のインデックスの後のアドレスに置き換えます。

*.*.*.* 注册中心地址 

プロジェクトを再度開始すると、期間は 185 秒に達します



Bean の遅延ロードを有効にする

遅延ロード用に ES Bean を初期化し、グローバル遅延ロードを有効にします。継続時間は 131 秒に達します。

グローバルな遅延読み込み:

1. Spring のバージョンによっては、グローバル遅延ロードを有効にする方法が異なる場合があります。

2.基本的にサービスは k8s 上にデプロイされるため、本番環境でグローバル遅延読み込みを有効にすることは推奨されません。サービスがスケーリングしていてトラフィックが大きい場合、遅延読み込みによりサービスが正常に開始される可能性があります。設定を変更すると、docker コンテナ サービスの準備完了ステータスに戻り、k8s がサービスにトラフィックを割り当て、予期しない問題が発生します。



スリム化された瓶

アプリケーションで使用されていない Jar パッケージは慎重に削除できます。それらを 1 つずつ削除する場合は、各パッケージをコンパイルし、繰り返し起動してプロジェクトに影響を与えるかどうかを確認する必要があります。これは継続的かつ長期的なプロセスです。起動時間が短縮されるだけでなく、コンパイル効率も明らかに向上し、大量の Jar コピー プロセスが削減されます。



最終効果

上記の最適化が完了したら、次のようにします。

  •  プロジェクトをローカルで開始してデバッグできるため、開発者の効率が大幅に向上します。
  •  このソリューションを使用してプレリリースが最適化されると、プロジェクトのコンパイルとリリースにかかる時間が短縮され、迅速な検証と反復の要件が大幅に改善されます。
  •  全体的な起動効率が 70% ~ 80% 向上します。
  •  Intel チップ コンピュータの場合、起動速度は 2 分 11 秒です。
  •  m1 チップを搭載したコンピューターでは速度が速くなり、起動時間は約 90 秒になります。
  •  このアイデアを使用すると、ほとんどの Spring および Spring Boot プロジェクトを最適化できるため、この種のトラブルシューティングと最適化を定期的に実行することをお勧めします。

重要なポイントと方法を最適化する

  •  未使用の jar パッケージを削除する: 未使用の jar パッケージを見つけます。プロジェクトの依存関係を分析して整理することで、これらの未使用の jar パッケージをアプリケーションから削除し、コンパイル、起動時間、リソースの消費を削減できます。
  •  遅い Bean の初期化を最適化する: 起動に時間がかかる Bean を見つけます。時間のかかる起動を減らすために、遅延ロードや非同期ロードを使用するなど、これらのインターフェイスと Bean を最適化することを検討できます。
  •  不要な公開をキャンセルする: ローカル開発環境の場合、jsf インターフェースを公開する必要がない場合は、この部分の公開をローカルでキャンセルして起動時間を節約できます。
  •  グローバル遅延ロードをオンにする: グローバル遅延ロードをオンにすることにより、一部の不要なコンポーネントとリソースのロードを遅らせることができ、それによって起動時間を短縮できます。必要な場合にのみロードするようにしてください。
  •  大きなコンポーネントを分割する: ロードに時間がかかるコンポーネントを見つけるには、コンポーネントを複数のコンポーネントに分割し、起動時に必要な部分のみをロードすることを検討してください。これにより、起動時のロード時間とリソース消費が削減されます。
  •  パフォーマンス分析ツールを使用する: Spring Startup Analyzer、Java Profiler、VisualVM など、前述のパフォーマンス分析ツールと組み合わせて、アプリケーションのパフォーマンス分析を実行します。アプリケーションのパフォーマンス データを監視および分析することで、パフォーマンスのボトルネックを見つけて、それに応じて最適化できます。
  •  定期的なコードの最適化とリファクタリング: コードを定期的にレビューして最適化し、潜在的なパフォーマンスの問題を特定して排除します。最適化されたアルゴリズムとデータ構造を使用して、不必要な計算やループを削減し、データベース クエリなどを最適化して、アプリケーションのパフォーマンスを向上します。
  •  キャッシュ メカニズムを使用する: キャッシュを合理的に使用して、データベースやその他のリソースへの頻繁なアクセスを減らします。頻繁に使用するデータや計算結果をキャッシュすることで、アプリケーションの応答速度やパフォーマンスが大幅に向上します。
  •  並列処理: 並列処理できる独立したタスクがいくつかある場合は、マルチスレッドまたは非同期メカニズムの使用を検討して、処理速度と効率を向上させることができます。

情報補足

oracle jdk8のダウンロードアドレス

https://www.oracle.com/java/technologies/downloads/#java8-mac

オラクルのログインアカウント

無料のアカウントを提供するには作者に連絡してください

ローカル Redis のインストール

https://redis.io/docs/install/install-redis/install-redis-on-windows/

spring-startup-analyzer 起動解析ツール

https://github.com/linyimin0812/spring-startup-analyzer/blob/main/README_ZH.md

著者: JD Health Liang Can

出典:JD Cloud Developer Community 転載の際は出典を明記してください

Microsoft、新しい「Windowsアプリ」 .NET 8を正式にGAリリース、最新LTSバージョン XiaomiはXiaomi Velaが完全にオープンソースであり、基盤となるカーネルはNuttXであることを正式に発表 Alibaba Cloud 11.12 障害の原因が明らかに:Access Key Service(アクセスKey) 例外 Vite 5 が正式にリリースされた GitHub レポート : TypeScript が Java に取って代わり、3 番目に人気のある言語になる Rust で Prettier を書き換えるために数十万ドルの報酬を提供 オープンソース作者に「プロジェクトはまだ生きていますか?」と尋ねる 非常に失礼で、失礼な バイトダンス: AI を使用して Linux カーネル パラメータ 演算子を自動的に調整する 魔法の操作: バックグラウンドでネットワークを切断し、ブロードバンド アカウントを無効化し、ユーザーに光モデムの変更を強制する
{{名前}}
{{名前}}

おすすめ

転載: my.oschina.net/u/4090830/blog/10148336