このチュートリアルでは、OpenResty XRay を使用して Envoy サーバーでの CPU 時間の消費状況を定量的に分析する方法を段階的に説明します。CPU を最も消費している C++ コードパスを示します。これらのホットコードパスは、OpenResty XRay が C++ 言語レベルの CPU フレームグラフを自動的に分析・解釈して得られたものです。パフォーマンスオーバーヘッドが非常に小さいため、パフォーマンスとレイテンシーに高い要求がある本番環境に適しています。少なくとも比較的単純なアプリケーションシナリオでは、Envoy が OpenResty や Nginx よりも明らかに非効率的であることがわかります。

問題:高 CPU 使用率

cat コマンドを使用して Envoy サーバーの設定ファイルを確認します。

Screenshot

ポート 1088 でリッスンしていることがわかります。

Screenshot

“Hello world” というレスポンスボディを返しています。

Screenshot

/hello インターフェースのレスポンスをテストします。確かに “Hello World” というレスポンスが返ってきます。

Screenshot

top コマンドを実行して CPU 使用状況を確認します。envoy という名前のプロセスを見てみましょう。

Screenshot

CPU コアリソースの 90% 以上を消費していることがわかります。

Screenshot

ps コマンドを実行してこのプロセスの完全なコマンドラインを確認します。これは Envoy の公式バイナリパッケージリポジトリからダウンロードしてインストールされたものです。

Screenshot

Envoy サーバーでの CPU 時間の消費状況を分析

OpenResty XRay を使用して、この未修正のプロセスを検査することができます。システムはリアルタイムで分析を行い、原因を特定します。

Screenshot

現在分析中のマシンが正しいことを確認してください。

Screenshot

正しくない場合は、リストから再選択することができます。

Screenshot

「Guided Analysis」ページに移動します。

Screenshot

ここでは、システムが分析可能な様々な種類の問題を確認できます。

Screenshot

「High CPU usage」を選択します。

Screenshot

「Next」をクリックします。

Screenshot

先ほどの Envoy アプリケーションを選択します。

Screenshot

CPU リソースの 90% 以上を消費しているプロセスを選択します。これは先ほど top で確認したものです。

Screenshot

アプリケーションのタイプが正しいことを確認します。通常、デフォルト値が正しいです。

Screenshot

ここでの言語レベルは「C/C++」のみとなっています。

Screenshot

最長分析時間を設定することも可能です。ここではデフォルトの 300 秒のままにします。

Screenshot

分析を開始します。

Screenshot

システムの分析は継続的に複数回実行します。現在、初回の分析を実行中です。

Screenshot

初回の分析が完了し、現在 2 回目のラウンドに入っております。この例では、1 回の分析で十分です。

Screenshot

分析を停止します。

Screenshot

自動生成された分析レポートをご確認しましょう。

Screenshot

これが分析対象の問題タイプ、「CPU」です。

Screenshot

これは CPU 時間を最も消費している C++ コードパスです。

Screenshot

これは SchedulableCallbackImpl クラスのオーバーロードされた演算子です。

Screenshot

「More」をクリックして詳細を表示します。

Screenshot

上記のホットコードパスは、この C++ 言語レベルの CPU フレームグラフから自動的に導き出されたものです。

Screenshot

アイコンをクリックしてフレームグラフを拡大します。

Screenshot

この invoke_impl 関数を拡大します。

Screenshot

Envoy のネットワーク socket クラスの write メソッドは、socket 書き込み操作を実行します。これは HTTP レスポンスデータを送信します。

Screenshot

Envoy バッファクラスの drain メソッドは、書き込みバッファ内の未使用メモリを解放し、その他のクリーンアップ作業を実行します。

Screenshot

Envoy スケジューラクラスの clearDeferredDeletedList メソッドは、現在のリクエストに関連するすべてのリソースを解放し、すべてのクリーンアップ作業を実行します。

Screenshot

CPU 時間消費量が 2 番目に多い C++ ホットコードパスを見てみましょう。

Screenshot

Envoy プロキシの emitLog 関数は、アクセスログをファイルに書き込むために使用されます。

Screenshot

フレームグラフを拡大します。

Screenshot

この emitLog 関数を拡大します。

Screenshot

emitLog の CPU 時間の大部分は、ファイル書き込み操作ではなく、ログメッセージ文字列のフォーマットに使用されています。

Screenshot

これは CPU 時間を 3 番目に多く消費しているホットコードパスです。

Screenshot

prepareLocalReplayViaFilterChain 関数は Envoy のレスポンス出力フィルターチェーンにあります。チェーン内の各フィルターがレスポンスを変更する可能性があります。

Screenshot

フレームグラフを拡大します。

Screenshot

prepareLocalReplayViaFilterChain 関数を拡大します。

Screenshot

createHeaderMap 関数が何度も呼び出されています。これは主に HTTP ヘッダー用の新しいハッシュテーブルを割り当てるために使用されます。

Screenshot

newUri 関数は主に URI 文字列の割り当てとフォーマットに使用されます。

Screenshot

setStatus 関数はレスポンスステータスコードを設定するために使用されます。

Screenshot

BodyFormatter クラスの format メソッドは、レスポンスボディデータをフォーマットするために使用されます。

Screenshot

setContentLength メソッドもレスポンス長ヘッダーを設定するために使用されます。

Screenshot

setReferenceContentType メソッドは Content-Type レスポンスヘッダーを設定するために使用されます。

Screenshot

これは Envoy サーバーと OpenResty のパフォーマンス比較チャートです。OpenResty のスループットが Envoy サーバーよりも 200% 以上高いことがわかります。

Screenshot

完全自動化された分析とレポート

OpenResty XRay は、オンラインプロセスを自動的に監視し、分析レポートを表示することもできます。「Insights」ページに切り替えます。

Screenshot

「Insights」ページでは、日次および週次のレポートを確認することができます。

Screenshot

したがって、「Guided Analysis」機能を必ずしも使用する必要はありません。もちろん、「Guided Analysis」はアプリケーションの開発やデモンストレーションに非常に有用です。

Screenshot

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 以上のオープンソースソフトウェアライブラリを執筆しております。

翻訳

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