オンラインでブロッキングスレッドの Perl コードパスを迅速に特定する(OpenResty XRay を使用)
今日は、OpenResty XRay を使用して、ブロッキングしているオペレーティングシステムスレッドの Perl コードパスを迅速に特定する方法をご紹介します。これらのコードは、プロセスを遅くし、CPU リソースを十分に活用できなくする原因となります。
問題:CPU 使用率が上昇しない
まず top
コマンドを実行して、CPU の使用状況を確認します。
ここで、Perl という名前のプロセスが見えます。CPU の使用率は約 13% です。多くのリクエストが入ってきても、CPU の使用量は上昇しません。
次に ps
コマンドを実行して、このプロセスの詳細を確認しましょう。
ここでは、Linux ディストリビューションに標準で付属している Perl のバイナリ実行ファイルであることがわかります。
次に、この Perl アプリケーションのアクセスログを見てみましょう。
多くのクライアントリクエストが押し寄せているのが見えますが、CPU 使用率は依然として低いです。これは、何かが Perl コードの効率的な実行をブロックしていることを意味します。原因をどうやって見つけることができるでしょうか?
off-CPU 時間を最も占有している Perl コードパスを特定
OpenResty XRay を使用して、この未修正のプロセスを検査することができます。システムはリアルタイムで分析を行い、原因を特定します。
ブラウザで OpenResty XRay の Web コンソールを開きます。
現在分析中のマシンが正しいことを確認してください。
正しくない場合は、リストから再選択することができます。
「Guided Analysis」ページに移動します。
ここでは、システムが分析可能な様々な種類の問題を確認できます。
「Low CPU usage and cannot go up」を選択します。
「Next」をクリックします。
先ほどの Perl アプリケーションを選択します。
14% の CPU を消費しているプロセスを選択します。これは先ほど top
で確認したものです。
アプリケーションのタイプが正しいことを確認します。通常、デフォルト値が正しいです。
OpenResty XRay は、様々な言語レベルで分析を行うことができます。ここでは Perl と C/C++ の両方を選択したままにします。
最長分析時間を設定することもできます。ここではデフォルトの 300 秒のままにします。
分析を開始します。
システムは複回数の分析を継続的に実行します。現在、初回の分析を実行中です。
初回の分析が完了し、現在 2 回目のラウンドに入っております。この例では、1 回の分析で十分です。
分析を停止します。
自動生成された分析レポートが表示されます。
これは分析対象の問題タイプである off-CPU です。
これは、ブロッキングしているオペレーティングシステムスレッドの最も深刻な C コードパスです。
最初の関数は select
というシステムコール関数です。
Perl_pp_select
は、Perl の select
関数を処理するための組み込み関数です。これは Perl 内部の一部で、 socket や他のファイル上の I/O イベントを監視し、待機するために使用されます。
この C 関数から、現在実行中の Perl コードがわかります。
次に、最も深刻なブロッキングの Perl コードパスを見てみましょう。
最上部の C 関数 select
は、先ほど見た C コードパスのブロッキングポイントです。
Net::HTTP::Methods
モジュールの can_read
Perl 関数は、ソケットが読み取り可能な新しいデータを受信するまで待機します。
呼び出しチェーンに沿って、read_response_headers
関数でレスポンスヘッダーを読み取っているときにブロッキングが発生していることがわかります。
remote_fetch
はビジネスレベルのコードにある関数で、私たち自身の Perl モジュール Service::Processor
に属しています。
最も顕著なブロッキングコードパスは、この Perl 言語レベルの off-CPU フレームグラフから自動的に導き出されています。
ここでは、現在の問題に関する詳細な説明と提案が示されています
前に見た select
関数が言及されています。
Net::HTTP::Methods::can_read
関数がデータに基づいて次のステップを選択するために select
を呼び出していることが述べられています。
これも、以前見た remote_fetch
関数の参照です。
前のホットコードパスに戻りましょう。
remote_fetch
という名前の Perl 関数の緑のボックスにマウスを置くと、
この関数の Perl ソースファイルの完全なパスが表示されます。
この関数の完全な Perl ソースファイルパスをコピーするためにクリックします。
ソースファイルの名前をコピーします。vim エディタを使用して Perl の業務コードを確認します。お好みのエディタを使用していただいて構いません。
OpenResty XRay が提案したように、66 行目をチェックします。
HTTP GET リクエストを送信し、その応答を待機していることがわかります。
Perl で HTTP リクエストがブロックされるのを避けるために、Coro のような非ブロッキングフレームワークの使用を薦めます。
自動生成レポート
OpenResty XRay はオンラインプロセスを自動的に監視し、分析レポートを生成することができます。「Insights」ページに切り替えてください。
「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(マイクロサービスおよび分散トラフィックに最適化された多機能
翻訳
英語版の原文と日本語訳版(本文)をご用意しております。読者の皆様による他の言語への翻訳版も歓迎いたします。全文翻訳で省略がなければ、採用を検討させていただきます。心より感謝申し上げます!