OpenResty XRay は、JVM エージェントの代わりに動的トレーシングを使用して、本番環境の CPU ホットスポット、Off-CPU ブロッキング、ディスク I/O をプロファイリングする Java アプリケーションプロファイリングツールです。JVM の safepoint メカニズムに依存しないため、XRay は従来の Java サンプリングプロファイラが抱える safepoint バイアスを回避し、より正確で包括的なパフォーマンスデータを提供します。変更を加えていない OpenJDK 8/11/17/21 上で動作し、最新の Linux ディストリビューションから RHEL/CentOS 7(3.10 カーネル)のような古いシステムまでカバーします。

内部的には、XRay は当社が改良した eBPF+ や Stap+ などの動的トレーシングランタイムによって駆動されています。エージェント方式の Java プロファイラと比較して、以下の利点があります:

  1. ゼロ侵襲:コード変更、設定変更、エージェント JAR、-javaagent フラグのいずれも不要です。
  2. Safepoint バイアスなし:XRay は JVM の safepoint メカニズムに依存しないため、CPU フレームグラフはエージェント方式のサンプリングプロファイラよりも正確です。
  3. 幅広い互換性:OpenJDK 8、11、17、21 に対応し、最新の Linux から CentOS 7 世代の 3.10 カーネルまでカバーします。
  4. ほぼゼロのオーバーヘッド:サンプリング中のコストはごくわずかで、アイドル時のコストはゼロです。

この記事では、OpenResty XRay を使った 3 つの Java アプリケーションプロファイリングのシナリオ——CPU ホットスポット分析、Off-CPU/ロック競合分析、ディスク I/O プロファイリング——を順に見ていきます。メモリ問題については、姉妹記事ヒープダンプなしで本番環境の Java メモリリークを診断するも参考にしてください。

フレームグラフで Java CPU ホットスポットをプロファイリングする

Java アプリケーションの CPU 使用率が異常に高い場合、通常、特定のコードパスが過剰な計算リソースを消費していることを意味します。OpenResty XRayguided-analysis を使用することで、これらのホットスポットを迅速に特定することができます。

例えば、以下は OpenResty XRay が負荷テスト状態の Java アプリケーション(この例では Tomcat HTTP アプリケーションですが、修正されていない任意の Java アプリケーションにも同様に適用されます)から生成した CPU フレームグラフです:

このフレームグラフでは、各バーが関数呼び出しを表し、バーの幅はその関数が占める CPU 時間の割合を示しています。バーが広いほど、その関数が消費する CPU 時間が多いことを意味します。

この図を深掘りすると、Java 関数 sun.nio.ch.FileDispatcherImpl:write0 が最大の CPU 時間シェアを占めていることが明確に分かります。これは Java 仮想マシン内部で使用されるネイティブメソッドで、主にファイルやソケットにデータを書き込むために使用されます。この発見は負荷テストシナリオと高度に一致しています。なぜなら、負荷テスト中、大量の CPU リソースがレスポンスデータの返送に使用されるからです。注目すべきは、OpenResty XRay が具体的な .java ソースファイルと行番号まで正確に特定できることです。これにより、パフォーマンスホットスポットの正確な位置を直接見つけることができ、問題の特定と最適化の効率を大幅に向上させます。

OpenResty XRay は JVM の safepoint メカニズムに依存しないため、この CPU フレームグラフには従来の Java サンプリングプロファイラを悩ませる safepoint バイアス がありません。

Java CPU プロファイラのドリルダウン——フレームグラフ内でハイライトされた .java ソースファイルと行番号

これらの詳細な分析結果に基づいて、これらのパフォーマンスホットスポットを的確に最適化することができます。可能な最適化戦略には、アルゴリズムの効率改善、不要な計算の削減、適切なキャッシュメカニズムの導入、I/O 操作の最適化などが含まれますが、これらに限定されません。これらの的を絞った最適化を通じて、アプリケーションの CPU 使用率を効果的に低減し、全体的なパフォーマンスを向上させることができます。

フレームグラフでホットメソッドを特定したら、非侵襲的な Java 関数プローブでそのメソッドの実行時引数をキャプチャすることもできます——エージェント不要、バイトコード計装不要、再起動も不要です。

Off-CPU Java プロファイリング:ロック競合とブロッキング分析

時として、Java アプリケーションの CPU 使用率が上がらないことも問題となる場合があります。これは通常、IO ブロッキング、ロック待ち、またはその他のリソース競合によって引き起こされます。OpenResty XRay はこれらのボトルネックを見つけるのに役立ちます。

例えば、以下は OpenResty XRay が低 CPU 使用率の Java アプリケーションのために生成した off-CPU フレームグラフです:

このフレームグラフでは、各バーが関数呼び出しを表し、バーの幅はその関数が CPU をブロックしている時間を示しています。バーが広いほど、その関数が CPU をブロックしている時間が長いことを意味します。

フレームグラフの最も幅の広い部分を注意深く観察すると、BankSystem.java の 76 行目で java.util.concurrent.locks.ReentrantLock:lock 関数を呼び出してロックを取得していることがわかります。ここの幅広い長方形は、複数のスレッドがこのロックを待っていることを示しており、これが CPU 使用率を上げられない原因となっています。

Off-CPU フレームグラフのドリルダウン——BankSystem.java 76 行目の ReentrantLock:lock 競合

これらの詳細情報を分析することで、CPU 利用率が低い根本原因を迅速に特定することができます。具体的な状況に応じて、ロック戦略の改善、IO 操作の最適化、非同期プログラミング技術の導入など、適切な最適化措置を講じることで、アプリケーションの全体的なパフォーマンスを向上させることができます。

同じブロッキング挙動をリクエスト単位で確認したい場合は、リクエストごとの PCAP で遅い Tomcat リクエストを正確に特定する方法も参考にしてください。

Java ディスク I/O プロファイリング:システムコールから Java ソース行まで

ディスク IO が過剰に高いと、アプリケーションのパフォーマンスに著しい影響を与えるだけでなく、システム全体の動作を遅くする可能性があります。OpenResty XRay は、Java アプリケーションで高ディスク IO を引き起こすコードパスを正確に特定するための強力なツールです。

以下の図は、高ディスク IO シナリオにおける Java アプリケーションのフレームグラフを示しています:

フレームグラフの最も幅の広い部分を注意深く分析すると、SaveCache.java ファイルの 103 行目で呼び出されている書き込み関数 java.io.Writer:write がディスク IO 圧力の主な原因であることが明確に分かります。

ディスク I/O フレームグラフのドリルダウン——SaveCache.java 103 行目の java.io.Writer:write

これらの正確な情報に基づいて、ディスク IO のコードを的確に最適化することができます。例えば、バッファリング技術の使用、非同期 IO 操作の実装、バッチ処理の採用などの戦略を検討し、ディスク IO 圧力を効果的に低減し、システム全体のパフォーマンスを向上させることができます。

write() システムコールから呼び出し元のビジネスメソッドまで完全なコールスタックを復元したい場合は、タイムトラベルコールスタックで Java のファイル I/O をデバッグする方法をご覧ください。

OpenResty XRay の深い分析を通じて、パフォーマンスのボトルネックをより効率的に特定し解決することができ、Java アプリケーションがあらゆる負荷条件下で卓越したパフォーマンスを維持できるようになります。

OpenJDK 8/11/17/21 アプリケーションプロファイリング対応

OpenResty XRay は主要な OpenJDK リリースすべてで Java アプリケーションプロファイリングをサポートしています:

  • OpenJDK 8
  • OpenJDK 11
  • OpenJDK 17
  • OpenJDK 21

Oracle JDK も同じバージョン範囲で対応しており、これは当社のデバッグシンボル再構築技術によって実現されています。

また、最新のカーネルから RHEL/CentOS 7(Linux 3.10)まで、幅広い Linux ディストリビューションでも動作します。

自動サンプリングと専門家による分析

OpenResty XRay は強力な分析機能を提供するだけでなく、自動サンプリングとレポート生成機能も備えています。これにより、パフォーマンス最適化作業にさらなる利便性をもたらします:

  1. 自動オンラインオンデマンドサンプリング:XRay は事前設定された条件に基づいて自動的にサンプリングをトリガーし、人間の介入を必要としません。これは、特定の負荷やパフォーマンス指標が特定のしきい値に達したときに自動的にデータ収集を開始できることを意味し、最も重要なパフォーマンス問題を確実に捕捉します。

  2. 自動分析レポート生成:収集されたデータに基づいて、XRay は詳細な分析レポートを自動生成します。これらのレポートには、パフォーマンスホットスポット、リソース使用状況、潜在的な最適化提案などの重要な情報が含まれており、アプリケーションのパフォーマンス状況を迅速に理解することができます。

  3. 専門家チームのサポート:自動化機能に加えて、当社の専門家チームがより深いサポートを提供します:

    • お客様の具体的なニーズに応じて、特定のパフォーマンスモニタリング要件を満たすアナライザーをカスタムメイドすることができます。
    • 当社の専門家が自動生成されたレポートの解釈を支援し、専門的な洞察と最適化提案を提供します。
    • 複雑なパフォーマンス問題に遭遇した場合、当社のチームがより深い分析とソリューションを提供します。

以下は OpenResty XRay によって生成されたサンプルレポートです:

OpenResty XRay Java アプリケーションプロファイリングレポート——CPU、Off-CPU、ディスク I/O の概要

自動化ツールと専門家のサポートを組み合わせることで、OpenResty XRay は Java アプリケーションが常に最適なパフォーマンスを維持できる包括的な最適化ソリューションを提供します。

パフォーマンスへの影響とオーバーヘッド

OpenResty XRay の設計理念は非侵襲的で軽量です。サンプリング時に Java アプリケーションプロセスへのオーバーヘッドは通常非常に小さく、無視できるレベルです。サンプリングしていない時は、プロセスの実行速度に全く影響を与えません。

この低オーバーヘッドの特性により、OpenResty XRay は理想的な本番環境モニタリングツールとなり、アプリケーションに大きな影響を与えることなく、いつでもどこでもパフォーマンス分析を行うことができます。

今後の計画

私たちはここで立ち止まることはありません。将来的には、OpenResty XRay をさらに強力で有用なものにするための計画がさらにあります。現在開発中の機能の一部には以下が含まれます:

  • Java アプリケーションのネットワークリクエストのレイテンシー統計を取り、問題のあるリクエストのデータパケットをインテリジェントにキャプチャします。
  • 他の技術スタックとオープンソースソフトウェアをサポートすることです。私たちは OpenResty XRay を、基盤となる技術に関係なく、あらゆるオンラインアプリケーションを分析できる汎用ツールにしたいと考えています。検討中の対象には、Nginx モジュール、Envoy 拡張機能、PostgreSQL 拡張機能、Perl/Python/Ruby モジュールやライブラリなどが含まれますが、これらに限定されません。

ご提案や追加の指標または機能に対するニーズがありましたら、ぜひお聞かせください。当社は常にお客様のフィードバックに耳を傾け、お客様のニーズを満たすために製品を継続的に改善しています。

よくある質問

OpenResty XRay には JVM エージェントや safepoint が必要ですか?

いいえ。OpenResty XRay は従来の JVM エージェントの代わりに eBPF+ や Stap+ などの動的トレーシングランタイムを使用し、JVM の safepoint メカニズムにも依存しません。そのため、生成される CPU フレームグラフには従来の Java サンプリングプロファイラを悩ませる safepoint バイアスがなく、コード変更や特別な JVM 起動オプションも不要です。

Java アプリケーションで Off-CPU フレームグラフが必要になるのはどんな場合ですか?

Java アプリケーションの CPU 使用率が予想外に低い場合、原因は通常 I/O ブロッキング、ロック待ち、またはその他のリソース競合です。OpenResty XRay はこうしたケース向けに Off-CPU フレームグラフを生成します——例えば、BankSystem.java の 76 行目にある ReentrantLock:lock 呼び出しを複数のスレッドが待っている様子を示します。

どの OpenJDK バージョンと Linux カーネルに対応していますか?

OpenJDK 8、11、17、21 に対応しています。同じバージョン範囲の Oracle JDK にも、当社のデバッグシンボル再構築技術によって対応しています。OS 側では、OpenResty XRay は最新の Linux ディストリビューションだけでなく、RHEL/CentOS 7(3.10 カーネル)のような古いシステムスタックでも動作します。

結論

本記事では、OpenResty XRay を使用して Java アプリケーションの CPU とディスク IO の使用状況を分析する方法をご紹介しました。また、いくつかの結果例を示し、その意味を説明しました。

OpenResty XRay を使用することで、CPU とディスクリソースを消費するコードパスを簡単に見つけ出し、それらが全体的なパフォーマンスにどの程度影響を与えているかを把握することができます。そして、これらの情報を使用して Java アプリケーションを最適化し、より高速かつスムーズに動作させることができます。

OpenResty XRay 製品とそれがオンラインアプリケーションの他の側面をどのように扱うことができるかについて、さらに詳しく知りたい場合は、当社のウェブサイト をご覧いただくか、お問い合わせ ください。

OpenResty XRay について

OpenResty XRay動的トレーシング製品であり、実行中のアプリケーションを自動的に分析して、パフォーマンスの問題、動作の問題、セキュリティの脆弱性を解決し、実行可能な提案を提供いたします。基盤となる実装において、OpenResty XRay は弊社の Y 言語によって駆動され、Stap+、eBPF+、GDB、ODB など、様々な環境下で複数の異なるランタイムをサポートしております。

著者について

章亦春(Zhang Yichun)は、オープンソースの OpenResty® プロジェクトの創始者であり、OpenResty Inc. の CEO および創業者です。

章亦春(GitHub ID: agentzh)は中国江蘇省生まれで、現在は米国ベイエリアに在住しております。彼は中国における初期のオープンソース技術と文化の提唱者およびリーダーの一人であり、Cloudflare、Yahoo!、Alibaba など、国際的に有名なハイテク企業に勤務した経験があります。「エッジコンピューティング」、「動的トレーシング」、「機械プログラミング」 の先駆者であり、22 年以上のプログラミング経験と 16 年以上のオープンソース経験を持っております。世界中で 4000 万以上のドメイン名を持つユーザーを抱えるオープンソースプロジェクトのリーダーとして、彼は OpenResty® オープンソースプロジェクトをベースに、米国シリコンバレーの中心部にハイテク企業 OpenResty Inc. を設立いたしました。同社の主力製品である OpenResty XRay動的トレーシング技術を利用した非侵襲的な障害分析および排除ツール)と OpenResty XRay(マイクロサービスおよび分散トラフィックに最適化された多機能ゲートウェイソフトウェア)は、世界中の多くの上場企業および大企業から高い評価を得ております。OpenResty 以外にも、章亦春は Linux カーネル、Nginx、LuaJITGDBSystemTapLLVM、Perl など、複数のオープンソースプロジェクトに累計 100 万行以上のコードを寄与し、60 以上のオープンソースソフトウェアライブラリを執筆しております。

翻訳

英語版の原文と日本語訳版(本文)をご用意しております。読者の皆様による他の言語への翻訳版も歓迎いたします。全文翻訳で省略がなければ、採用を検討させていただきます。心より感謝申し上げます!