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