オンラインで Go コードパスのブロッキングスレッドを迅速に特定する方法(OpenResty XRay を使用)
本日は、OpenResty XRay を使用して、オペレーティングシステムのスレッドをブロックする Go コードパスを迅速に特定する方法をご紹介します。これらのコードは、プロセスを遅くし、CPU リソースを十分に活用できなくする可能性があります。
問題: CPU 使用率が上がらない
まず、top
コマンドを実行して CPU の使用状況を確認します。
chat-service
という名前のプロセスが見えます。このプロセスは Go 言語で実装されていることが事前にわかっています。CPU 使用率が非常に低く、わずか 2% です。多くのリクエストが入ってきても上昇しません。
この golang アプリケーションのアクセスログを見てみましょう。
多くのクライアントリクエストが流入しているにもかかわらず、CPU 使用率は依然として低いままです。これは、golang コードの効率的な実行を妨げる何かがあることを意味します。原因をどのように見つけることができるでしょうか?
off-CPU 時間を最も占有する Go コードパスを特定
OpenResty XRay を使用して、この未修正のプロセスを検査することができます。システムはリアルタイムで分析を行い、原因を特定します。
ブラウザで OpenResty XRay の Web コンソールを開きます。
現在分析中のマシンが正しいことを確認してください。
「Guided Analysis」ページに移動します。
ここでは、システムが分析可能な様々な種類の問題を確認できます。
「Low CPU usage and cannot go up」を選択します。
「Next」をクリックします。
先ほどの Go アプリケーションを選択します。
CPU リソースの 2% を消費しているプロセスを選択します。これは先ほど top
で見たものです。
アプリケーションのタイプが正しいことを確認します。通常、デフォルト値が正しいです。
ここでの言語レベルは「Go」のみです。
最長分析時間を設定することもできます。ここではデフォルトの 300 秒のままにします。
分析を開始します。
システムは複回数の分析を継続的に実行します。現在、初回の分析を実行中です。
初回の分析が完了し、現在 2 回目のラウンドに入っております。この例では、1 回の分析で十分です。
分析を停止します。
自動生成された分析レポートが表示されます。
これは分析対象の問題タイプである off-CPU です。
これが CPU の効率的な実行を妨げている Go コードパスです。
最初の関数は Syscall6
で、6 つの引数を持つシステムコールです。どのようなシステムコールなのかを確認するには、さらに多くのコンテキスト情報を見る必要があります。
Process.wait
という関数名から、基底のシステムコールは waitpid
であると推測されます。
標準 os
モジュールで定義されている golang 関数 exec.Cmd.run
をさらに見てみましょう。これは、golang プログラムがシステムシェルコマンドを実行し、その完了を待っていることを意味します。
chat.RateLimit
関数は、ビジネスレベルの golang コードにあります。
「More」をクリックして詳細情報を表示します。
最も顕著なブロッキングコードパスは、この Go レベルの off-CPU フレームグラフから導き出されています。
以下は、現在の問題についてのより詳細な説明と提案です。
先ほど見た chat.RateLimit
関数について言及しています。
また、この関数がシステムコマンドを実行し、その完了を待っていることも言及しています。
先ほどのホットコードパスに戻りましょう。
chat.RateLimit
という名前の Go 関数の緑色のボックスにマウスを置きます。
この関数の Go ソースファイル名が表示されます。ツールチップには processor.go
ファイルの完全なパスも表示されています。
ソースコードの行番号は 46 です。
このアイコンをクリックして、この関数の完全な Go ソースファイルパスをコピーします。
ターミナルで、現在の作業ディレクトリはすでにこの Go アプリケーションのソースコードディレクトリ内にあります。find
コマンドを使用してソースファイルを検索します。
先ほどコピーしたファイルパスを貼り付けます。
完全なファイルパスをコピーします。vim エディタを使用して、このファイル内のビジネス Go コードを表示します。お好みのエディタを使用していただいて構いません。
OpenResty XRay が提案したように、46 行目にジャンプします。
この Go コードが実際に cmd.Run
関数を呼び出していることがわかります。
このコードは、先ほどのレポートで言及された RateLimit
関数内にあります。これで、このボトルネックを最適化するのは簡単になりました!
完全自動化された分析とレポート
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(マイクロサービスおよび分散トラフィックに最適化された多機能
翻訳
英語版の原文と日本語訳版(本文)をご用意しております。読者の皆様による他の言語への翻訳版も歓迎いたします。全文翻訳で省略がなければ、採用を検討させていただきます。心より感謝申し上げます!