本日は、OpenResty XRayを使用して Go アプリケーションを分析する例を段階的にご紹介します。既に実行中の golang プロセスにおいて、最も CPU 使用率の高い Go コードパスを迅速に特定します。これらのコードパスは最も多くの CPU 時間を消費し、アプリケーションのパフォーマンスに影響を与えます。

問題: 高 CPU 使用率

まず、top コマンドを実行して CPU 使用状況を確認します。chat-service という名前のプロセスが CPU コアの 100% 以上のリソースを消費していることがわかります。このプロセスは Go 言語で実装されていることが事前にわかっています。

Screenshot

最も CPU 使用率の高い Go コードパスを特定

OpenResty XRayを使用して、この未修正のプロセスを検査してみましょう。対象の Go アプリケーションに特別なモジュールやコードを追加する必要はありません。

ブラウザで OpenResty XRayの Web コンソールを開きます。ここでは、すべてのマシン上のすべてのアプリケーションのリアルタイムの状況を確認できます。

Screenshot

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

Screenshot

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

Screenshot

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

Screenshot

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

Screenshot

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

Screenshot

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

Screenshot

CPU 使用率が高いプロセス、つまり先ほど top で確認したプロセスを選択します。

Screenshot

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

Screenshot

ここでの言語レベルは「Go」のみです。

Screenshot

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

Screenshot

分析を開始します。

Screenshot

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

Screenshot

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

Screenshot

分析を停止します。

Screenshot

自動生成された分析レポートが表示されます。

Screenshot

レポートには、最も多くの CPU 時間を消費している Go レベルのコードパスが表示されます。その中で最も高いのは正規表現のコンパイルで、CPU 時間の 36.8% を占めています。

Screenshot

これは Go ランタイムの標準 regexp ライブラリにある 2 つの関数です。これらは正規表現のコンパイルを担当しています。

スクリーンショット

この checkMessage 関数は、ビジネスロジックの一部です。この関数が、先ほど見た正規表現コンパイル関数を呼び出しています。

スクリーンショット

このコードパスをさらに知りたい場合は、「More」リンクをクリックします。

Screenshot

クリックすると、そのコードパスの詳細が表示されます。これらは Go レベルの CPU フレームグラフから導き出されたものです。

スクリーンショット

レポートには、これらのコードパスのパフォーマンスに関する説明と提案も含まれています。

スクリーンショット

例えば、正規表現コンパイル関数の呼び出しを減らしべきだと述べています。これは CPU を多く消費するためです。

Screenshot

レポートは続いて、正規表現を使用およびコンパイルする CheckMessage というビジネス関連の関数について説明しています。

スクリーンショット

正規表現のコンパイルについても言及しています。

Screenshot

先ほど言及したコードパスをもう一度見てみましょう。CheckMessage という名前の Go 関数の緑色のボックスにマウスを置きます。CheckMessage 関数の Go ソースファイルが表示されます。ツールチップには prev_processor.go ファイルの完全なパスも表示されています。

スクリーンショット

この Go ソースコードの行番号は 17 です。

スクリーンショット

このアイコンをクリックして、関数の完全な Go ソースファイルパスをコピーします。

スクリーンショット

ターミナルに、先ほどコピーしたコードパスを貼り付けます。vim エディタを使用して対応する Go ビジネスコードを表示します。お好みのエディタを自由に使用できます。

Screenshot

17 行目に移動します。これは元のレポートで表示されていた行番号です。

スクリーンショット

このコードが実際に正規表現をコンパイルしており、MustCompile 関数を呼び出していることがわかります。

スクリーンショット

これはまた、レポートに表示されていた CheckMessage 関数内にあることも確認できます。これで、この Go コードを最適化するのは簡単になりました!

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

翻訳

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