OpenResty XRay 対応テクノロジースタック:LuaJIT、C/C++、Rust、Java、Go、Python、Node.js、PHP、Erlang、Perl、Ruby と Linux カーネルの CPU フレームグラフとメモリ分析

対応テクノロジースタック

従来のプロファイラはスタック境界で止まります。OpenResty XRay は止まりません。

OpenResty XRay は、同一のコールスタック上でアプリケーション言語・システムライブラリ・カーネルをプロファイリングします。以下は対応テクノロジースタックの完全なサポートマトリクスです。各スタックの分析深度を個別に記載しています。

デモのご予約
デモのご予約

サポートマトリクス

テクノロジースタックCPU フレームグラフメモリ分析詳細
LuaJIT / Lua
(OpenResty, Nginx, Kong)
対応Lua↔C 混合スタック対応参照チェーンレベル — GC オブジェクト参照・割り当てパスの追跡関連記事 →
C / C++対応ソースコード行レベルの精度アロケータレベル — リーク検出・メモリフラグメンテーション関連記事 →
Rust対応アロケータレベル関連記事 →
Java対応参照チェーンレベル — GC 参照分析、Stop-the-World 停止なし関連記事 →
Go対応参照チェーンレベル関連記事 →
Python対応インタプリタ内部まで解析参照チェーンレベル関連記事 →
Node.js対応参照チェーンレベル関連記事 →
PHP対応参照チェーンレベル関連記事 →
Erlang対応ワークロードに依存 †関連記事 →
Perl対応参照チェーンレベル関連記事 →
Ruby対応ワークロードに依存 †—
OS カーネル対応カーネル専用フレームグラフネットワークプロトコルスタック・プロセススケジューラ・システムコール分析関連記事 →

参照チェーンレベル = OpenResty XRay が GC オブジェクトの参照関係をトラバースし、リークしたメモリを保持しているオブジェクトを特定した上で、割り当てコードパスを提示します。 アロケータレベル = リーク検出・メモリフラグメンテーション・アロケータ動作の分析(オブジェクト参照チェーンは含みません)。前者は「どのオブジェクトが解放されるべきメモリを保持しているか」を特定し、後者は「メモリ総量が増加し続けている」ことを検出します。

† メモリ分析の深度はワークロードに依存

Erlang と Ruby は CPU プロファイリングを完全にサポートしています。メモリ分析の深度は、具体的なワークロードおよびランタイムバージョンに依存します。お客様のテクノロジースタックをお知らせいただければ、デプロイ前にお客様の環境で到達可能な分析深度を正確にご説明いたします。

1つのエージェント、3つのレイヤー、1本のコールスタック

OpenResty XRay は、実行中のプロセスに外部からアタッチします。コード変更・再起動・ライブラリのプリロードは一切不要です。サンプリングのたびに 3 つのレイヤーを横断してスタックアンワインドとシンボル解決を行い、1 本の連続したコールスタックを生成します。

レイヤー 1 · アプリケーション層

インタプリタと JIT の内部まで解析

OpenResty XRay は、LuaJIT・CPython・JVM・Go・PHP・Node.js・Erlang・Perl・Ruby といったランタイム自体の内部データ構造を直接解析し、お客様のソースファイルとコード行を復元します。インタプリタの C 関数フレームだけではありません。

レイヤー 2 · システム層

システムライブラリの解析

Nginx、OpenSSL、glibc、お客様独自のモジュールなど、C・C++・Rust のフレームは、シンボルが除去された本番バイナリであっても、中央シンボルリポジトリを利用してシンボル解決を行います。

レイヤー 3 · カーネル層

カーネルまで到達

スケジューラ、ネットワークプロトコルスタック、メモリ管理、システムコールが同一のコールスタック上に表示されるため、カーネル内でブロックされている off-CPU 時間を、待機の原因となったアプリケーションコードに帰属させることができます。

本番環境の実例

言語境界を越えた実際の診断事例

44.8% CPU

libcrypto 内の pkey_rsa_decrypt が CPU のほぼ半コア分を消費していました。OpenResty XRay は JWT ライブラリを経由して、ある Lua プラグインの 93 行目まで遡りました。この言語横断のコールチェーンは perf では可視化できません。

診断プロセスを読む →
STW 停止なし

複数回の Full GC の後も JVM ヒープが増加し続けていました。OpenResty XRay は実行中の JVM 上で GC オブジェクト参照チェーンをトラバースし、メモリを保持しているデータ構造を特定しました。ヒープダンプ不要、Stop-the-World なし。

診断プロセスを読む →
CPU 100%、ライブ分析

Bilibili 社の本番障害において、全ワーカープロセスの CPU が 100% に達しました。分析は障害発生中に実行中のプロセスに対して直接行われ、事後に再現環境を構築したものではありません。

インシデントレビューを読む →
“OpenResty XRay のトラブルシューティングとパフォーマンス最適化機能により、生産性が大幅に向上し、本番環境のさまざまな難問や謎を、正確に特定できるようになりました。 ”
— Jun Xiao | 子会社マネージャー
よくある質問

よくあるご質問

デバッグシンボルやアプリケーションの再コンパイルは必要ですか?

いいえ。主要ディストリビューションのパッケージについては、OpenResty XRay が中央パッケージデータベースからシンボルを解決します。自前でビルドしたオープンソースソフトウェアやお客様独自のプライベートバイナリについては、デバッグシンボルがインストールされている任意のマシン上でエージェントがそれらを自動的にインデックス化するため、本番サーバーにデバッグシンボルを置いておく必要はありません。本番ビルドはそのままで構いません。

はい。サンプリングで得られるコールスタックは 3 つのレイヤーを横断してスタックアンワインドとシンボル解決が行われるため、1 枚のフレームグラフにアプリケーションフレーム、その下の C フレーム、さらにその下のカーネルフレームが同時に含まれます。これにより、CPU を大量に消費する C 関数を、それを呼び出したアプリケーションコードの行に帰属させることができます。

OpenResty XRay エージェントは、ホストマシン上で root 権限を持つ独立したデーモンとして動作します。お客様のアプリケーションプロセスは一切変更されません。コードのインジェクション、ライブラリのプリロード、再起動は行いません。分析タスクが実行されていない間は、アプリケーションプロセスとの接触は一切ありません。対応環境は Linux サーバーのみです。コンテナ環境では、ホスト上のエージェントがそのホスト上の全コンテナ内のプロセスを分析できます。

お客様のテクノロジースタックはマトリクスに掲載されています。XRay による全体像をご確認ください。

お客様のテクノロジースタックをお知らせいただければ、デプロイ前にお客様の環境で到達可能な分析深度を正確にご説明いたします。

デモのご予約