オンラインで Go コードの CPU 使用率が最も高いパスを素早く特定する方法(OpenResty XRay を使用)
本日は、OpenResty XRayを使用して Go アプリケーションを分析する例を段階的にご紹介します。既に実行中の golang プロセスにおいて、最も CPU 使用率の高い Go コードパスを迅速に特定します。これらのコードパスは最も多くの CPU 時間を消費し、アプリケーションのパフォーマンスに影響を与えます。
問題: 高 CPU 使用率
まず、top
コマンドを実行して CPU 使用状況を確認します。chat-service
という名前のプロセスが CPU コアの 100% 以上のリソースを消費していることがわかります。このプロセスは Go 言語で実装されていることが事前にわかっています。
最も CPU 使用率の高い Go コードパスを特定
OpenResty XRayを使用して、この未修正のプロセスを検査してみましょう。対象の Go アプリケーションに特別なモジュールやコードを追加する必要はありません。
ブラウザで OpenResty XRayの Web コンソールを開きます。ここでは、すべてのマシン上のすべてのアプリケーションのリアルタイムの状況を確認できます。
現在分析中のマシンが正しいことを確認してください。
「Guided Analysis」ページに移動します。
ここでは、システムが分析可能な様々な種類の問題を確認できます。
「High CPU Usage」を選択します。
「Next」をクリックします。
先ほどの Go アプリケーションを選択します。
CPU 使用率が高いプロセス、つまり先ほど top
で確認したプロセスを選択します。
アプリケーションのタイプが正しいことを確認します。通常、デフォルト値が正しいです。
ここでの言語レベルは「Go」のみです。
最長分析時間を設定することもできます。ここではデフォルトの 300 秒のままにします。
分析を開始します。
システムは複回数の分析を継続的に実行します。現在、初回の分析を実行中です。
初回の分析が完了し、現在 2 回目のラウンドに入っております。この例では、1 回の分析で十分です。
分析を停止します。
自動生成された分析レポートが表示されます。
レポートには、最も多くの CPU 時間を消費している Go レベルのコードパスが表示されます。その中で最も高いのは正規表現のコンパイルで、CPU 時間の 36.8% を占めています。
これは Go ランタイムの標準 regexp
ライブラリにある 2 つの関数です。これらは正規表現のコンパイルを担当しています。
この checkMessage
関数は、ビジネスロジックの一部です。この関数が、先ほど見た正規表現コンパイル関数を呼び出しています。
このコードパスをさらに知りたい場合は、「More」リンクをクリックします。
クリックすると、そのコードパスの詳細が表示されます。これらは Go レベルの CPU フレームグラフから導き出されたものです。
レポートには、これらのコードパスのパフォーマンスに関する説明と提案も含まれています。
例えば、正規表現コンパイル関数の呼び出しを減らしべきだと述べています。これは CPU を多く消費するためです。
レポートは続いて、正規表現を使用およびコンパイルする CheckMessage
というビジネス関連の関数について説明しています。
正規表現のコンパイルについても言及しています。
先ほど言及したコードパスをもう一度見てみましょう。CheckMessage
という名前の Go 関数の緑色のボックスにマウスを置きます。CheckMessage
関数の Go ソースファイルが表示されます。ツールチップには prev_processor.go
ファイルの完全なパスも表示されています。
この Go ソースコードの行番号は 17 です。
このアイコンをクリックして、関数の完全な Go ソースファイルパスをコピーします。
ターミナルに、先ほどコピーしたコードパスを貼り付けます。vim エディタを使用して対応する Go ビジネスコードを表示します。お好みのエディタを自由に使用できます。
17 行目に移動します。これは元のレポートで表示されていた行番号です。
このコードが実際に正規表現をコンパイルしており、MustCompile
関数を呼び出していることがわかります。
これはまた、レポートに表示されていた CheckMessage
関数内にあることも確認できます。これで、この Go コードを最適化するのは簡単になりました!
自動生成レポート
OpenResty XRay はオンラインプロセスを自動的に監視し、分析レポートを生成することができます。「Insights」ページに切り替えてください。
「Insights」ページでは、日次および週次のレポートを確認することができます。
したがって、「Guided Analysis」機能を必ずしも使用する必要はありません。もちろん、「Guided Analysis」はアプリケーションの開発やデモンストレーションに非常に有用です。
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(マイクロサービスおよび分散トラフィックに最適化された多機能
翻訳
英語版の原文と日本語訳版(本文)をご用意しております。読者の皆様による他の言語への翻訳版も歓迎いたします。全文翻訳で省略がなければ、採用を検討させていただきます。心より感謝申し上げます!