このチュートリアルでは、OpenResty XRay を使用して、Go の etcd サーバー内部での CPU 時間の消費状況を分析します。最も CPU を消費する Go コードパスを示します。OpenResty XRay は Go(golang)言語レベルの CPU フレームグラフを自動的に分析します。

問題: 高 CPU 使用率

まず、top コマンドを実行して CPU 使用状況を確認します。

Screenshot

この etcd プロセスが CPU コアリソースの 70% 以上を消費していることが分かります。リアルタイムで分析を行い、CPU 時間がどこで消費されているかを詳しく調査することができます。

Screenshot

ps コマンドを実行して、このプロセスの完全なコマンドラインを確認します。これは未修正の標準 etcd バイナリ実行ファイルであることが分かります。

Screenshot

最も CPU を消費する Go コードパスを特定

OpenResty XRay を使用して、この未修正のプロセスを検査してみましょう。

ブラウザで OpenResty XRay の Web コンソールを開きます。

Screenshot

現在分析対象としている機器が正しいことを確認します。

Screenshot

現在表示されている機器が正しくない場合は、下のリストから適切なものを選択することができます。

Screenshot

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

Screenshot

ここでは、システムが分析できる問題の種類を確認できます。

Screenshot

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

Screenshot

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

Screenshot

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

Screenshot

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

Screenshot

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

Screenshot

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

Screenshot

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

Screenshot

分析を開始します。

Screenshot

システムは複数のラウンドの分析を継続的に実行し、現在は第 1 ラウンドの分析を実行中です。

Screenshot

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

Screenshot

ここで分析を停止します。

Screenshot

システムが今回の分析のレポートを生成中であることが表示されています。

Screenshot

自動生成された分析レポートを確認できます。

Screenshot

これが現在分析している問題のタイプ:CPU です。

Screenshot

これは CPU 時間を最も消費している Go レベルのコードパスです。

Screenshot

この processUnaryRPC は Go の gRPC ライブラリの関数です。最もシンプルな gRPC メッセージの処理を担当します。

Screenshot

その上位の呼び出し関数は handleStream です。

Screenshot

詳細情報を確認するには「More」をクリックします。

Screenshot

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

Screenshot

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

Screenshot

さらに拡大します。

Screenshot

_KV_Range_Handler 関数は、キーバリューデータベース内の特定範囲の key を取得できます。

Screenshot

_KV_Put_Handler 関数は、指定された key をキーバリューデータベースに格納します。

Screenshot

Range 関数は、etcd に格納されているキーバリューデータを範囲指定して検索するために使用されます。

Screenshot

これは runtime.newobject を呼び出して、多数の golang GC オブジェクトを作成します。

Screenshot

runtime.newstack 関数は、etcd がデータを書き込む際に比較的高い CPU オーバーヘッドを示します。この関数は Go 言語ランタイムの内部関数で、新しい goroutine のためのランタイムスタックを作成します。

Screenshot

以下は、現在の問題についてのより詳細な説明と推奨事項です。

Screenshot

processUnaryRPC 関数について言及しています。

Screenshot

また、これがユニタリ RPC を処理することについても触れています。

Screenshot

先ほどのコードパスに戻りましょう。最初の関数の緑色のボックスにマウスを置きます。

Screenshot

この関数のソースファイル名が表示されます。ツールチップには server.go ファイルの完全なパスが表示されています。

Screenshot

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

Screenshot

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

Screenshot

find コマンドを使用してソースファイルを検索します。

Screenshot

先ほどコピーしたファイルパスを貼り付けます。

Screenshot

完全なファイルパスをコピーします。vim エディタを使用して、このファイル内の golang コードを確認します。お好みのエディタを使用することができます。

Screenshot

OpenResty XRay が提案したように、1024 行目にジャンプします。

Screenshot

md.Handler 関数は、gRPC メッセージの種類に応じて適切なメッセージハンドラを選択して呼び出します。先ほど確認した _KV_Range_Handler_KV_Put_Handler は、md.Handler コールバック関数の 2 つの実装例です。

Screenshot

ステータスバーでは、このコードが先ほどレポートで言及された processUnaryRPC 関数内にあることも確認できます。

Screenshot

CPU 使用率が2番目に高い Go コードパスは、約12%の CPU リソースを使用しています。

Screenshot

この関数の目的は、データをネットワークソケットに書き込むことです。

Screenshot

ここでは write システムコールを実行しています。

Screenshot

この関数は HTTP/2 プロトコルを通じてレスポンスデータをネットワークソケットに送信します。

Screenshot

3番目に CPU を消費する Go コードパスは、約11%の CPU 時間を使用しています。

Screenshot

ここでの runtime.mcall 関数は、主に goroutine のスケジューリングを担当します。

Screenshot

これは CPU 使用率が4番目に高い Go コードパスです。

Screenshot

この関数の機能は、各ユニタリ gRPC リクエストの呼び出しを記録することです。CPU リソースを節約するために、このようなログ記録を無効にすることも検討できます。

Screenshot

全自动分析与报告

OpenResty XRay はオンラインプロセスを自動的に監視し、分析レポートを生成することができます。

Screenshot

「Insights」ページに切り替えてください。「Insights」ページでは、日次および週次の自動レポートをご確認できます。

Screenshot

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

翻訳

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