XRay で Python アプリケーションのディスク I/O 高負荷を診断
このチュートリアルでは、OpenResty XRay を使用して、order-service という Python アプリケーションのディスク I/O 高負荷問題を診断します。Python レベルのディスク読み書き回数、遅延、およびスループットのフレームグラフにより、ディスクアクティビティが最も集中しているコードパス——この例では download_file 関数と Python の logging モジュール——を特定し、正確なソースファイルと行番号まで追跡します。
ディスク I/O が高い Python プロセスの特定
OpenResty XRay の Dashboard 上で、order-service という名前の Python アプリケーションが発見されました。XRay によるサンプリングと分析の結果、このアプリケーションのディスク I/O に問題があることが判明しました。
まず、ps コマンドを実行してこのアプリケーションを確認します。
完全なコマンドラインを確認できます。
OpenResty XRay を使用して、この未修正のアプリケーションを検査します。リアルタイムで分析を行い、原因を特定することができます。
フレームグラフで Python のディスク読み書きコードパスを追跡
OpenResty XRay の Web コンソールに切り替えます。現在分析中のマシンが正しいことを確認します。
正しくない場合は、リストから再選択できます。
「Guided Analysis」ページに進みます。
ここでは、システムが分析できる様々な種類の問題を確認できます。
「High disk IO」を選択します。
「Next」をクリックします。
order-service という名前の Python アプリケーションを選択します。
先ほど ps コマンドで確認したプロセスを選びます。
アプリケーションのタイプが正しいことを確認します。通常、デフォルト値が正しいです。
OpenResty XRay は様々な言語レベルで分析を行うことができます。ここでは Python と C/C++ の両方を選択したままにします。
最長分析時間を設定することもできます。ここではデフォルトの 300 秒のままにします。
分析を開始します。
システムの分析は継続的に複数回実行します。現在、初回の分析を実行中です。
初回の分析が完了し、現在 2 回目に入っています。この例では、1 回の分析で十分です。
分析を停止します。
自動生成された分析レポートをご確認しましょう。
これが分析対象の問題タイプ、「Disk I/O」です。
これはディスク読み取り回数の分析です。
ディスク読み取りが最も頻繁に行われているのは、このコードパスです。
__read はファイルからデータを読み取るための関数です。
download_file はファイルをダウンロードするための業務レベルの関数です。
詳細を表示するにはクリックしてください。
このホットコードパスは、Python レベルのディスク読み取り回数のフレームグラフから自動的に導出されたものです。
以下は問題に関するより詳細な説明と提案です。先ほど確認した __read 関数について詳しい説明があります。
元のコードパスに戻りましょう。この関数の緑色のボックスにマウスを合わせます。ツールチップにこの関数のソースファイル名と完全なパスが表示されています。
このソースコードの行番号は 10 です。
アイコンをクリックして、この関数の Python ソースファイルのパスをコピーします。
vim エディタでソースファイルを開きます。ファイル内の Python ソースコードを確認しましょう。お好みのエディタをご使用いただいて構いません。
OpenResty XRay が提案したように、10 行目を注目しましょう。
このコード行はファイルからデータを読み取っています。
これはディスク読み取りスループットの分析です。
このコードパスも、ファイルのダウンロードを処理しています。
このパスのデータ読み取り速度は約 269 メガバイト/秒です。
これはディスク読み取りレイテンシーの分析です。
このコードパスは、先ほど分析したコードパスと同じで、ファイルのダウンロードを処理しています。
これがディスク読み取りレイテンシーの全ての原因となっています。
これは最も読み取られたファイルの分析です。
最も多くのデータが読み取られたファイルは pic-ocean-wave.jpg です。
そのデータの読み取り速度は 193 メガバイト/秒に達しています。
これらは累積読み取りレイテンシーが最も長いファイルです。
レイテンシーが最も長いファイルは pic-ocean-wave.jpg です。
レイテンシーの割合は 75% です。
これはディスク書き込み操作回数の分析です。
ディスクの書き込み操作は全てこのコードパスから発生しています。
write はファイルにデータを書き込む関数です。
flush は Python のログモジュールの関数で、全てのログ情報が完全に書き込まれたことを確認するために使用されます。
emit はログモジュールの関数で、ログ記録を処理するために使用されます。
自動ディスク I/O 分析レポート
OpenResty XRay はオンラインプロセスを自動的に監視し、分析レポートを生成することができます。「Insights」ページに切り替えてください。
「Insights」ページでは、日次および週次の自動レポートをご確認できます。そのため、「Guided Analysis」機能を必ずしも使用する必要はないですが、
その機能はアプリケーションの開発やデモンストレーションに非常に有用です。
OpenResty XRay について
OpenResty XRay は動的トレーシング製品であり、実行中のアプリケーションを自動的に分析して、パフォーマンスの問題、動作の問題、セキュリティの脆弱性を解決し、実行可能な提案を提供いたします。基盤となる実装において、OpenResty XRay は弊社の Y 言語によって駆動され、Stap+、eBPF+、GDB、ODB など、様々な環境下で複数の異なるランタイムをサポートしております。
よくある質問
Python アプリケーションのディスク I/O が高いのはなぜですか?
この例では、order-service のディスク読み取りは画像ファイル(pic-ocean-wave.jpg)を読み込む単一の download_file 関数に集中しており、ディスク書き込みはほぼすべて Python の logging モジュールがログレコードをディスクにフラッシュすることによるものでした。
ディスク読み書きが過剰な Python 関数を見つけるには?
OpenResty XRay のガイド付き分析を実行し、「High disk IO」を選択してターゲットプロセスを指定します。Python と C/C++ の両方の言語レベルを選択したまま実行すると、読み取りと書き込みそれぞれのフレームグラフが生成されます。ホット関数にマウスを合わせると、正確なソースファイルと行番号が表示されます。
ディスクの読み取りと書き込みのどちらがボトルネックかを判断するには?
XRay が生成する読み取りと書き込みのフレームグラフを比較します。この例では読み取りが支配的でした。download_file コードパスの全体スループットは約 269 MB/s に達し、単一ファイル(pic-ocean-wave.jpg)だけで累積読み取り遅延の約 75% を占め、スループットは約 193 MB/s でした。書き込みは通常のログフラッシュのみで、アプリケーションデータではありませんでした。
著者について
章亦春(Zhang Yichun)は、オープンソースの OpenResty® プロジェクトの創始者であり、OpenResty Inc. の CEO および創業者です。
章亦春(GitHub ID: agentzh)は中国江蘇省生まれで、現在は米国ベイエリアに在住しております。彼は中国における初期のオープンソース技術と文化の提唱者およびリーダーの一人であり、Cloudflare、Yahoo!、Alibaba など、国際的に有名なハイテク企業に勤務した経験があります。「エッジコンピューティング」、「動的トレーシング」、「機械プログラミング」 の先駆者であり、22 年以上のプログラミング経験と 16 年以上のオープンソース経験を持っております。世界中で 4000 万以上のドメイン名を持つユーザーを抱えるオープンソースプロジェクトのリーダーとして、彼は OpenResty® オープンソースプロジェクトをベースに、米国シリコンバレーの中心部にハイテク企業 OpenResty Inc. を設立いたしました。同社の主力製品である OpenResty XRay(動的トレーシング技術を利用した非侵襲的な障害分析および排除ツール)と OpenResty Edge(マイクロサービスおよび分散トラフィックに最適化された多機能ゲートウェイソフトウェア)は、世界中の多くの上場企業および大企業から高い評価を得ております。OpenResty 以外にも、章亦春は Linux カーネル、Nginx、LuaJIT、GDB、SystemTap、LLVM、Perl など、複数のオープンソースプロジェクトに累計 100 万行以上のコードを寄与し、60 以上のオープンソースソフトウェアライブラリを執筆しております。
翻訳
英語版の原文と日本語訳版(本文)をご用意しております。読者の皆様による他の言語への翻訳版も歓迎いたします。全文翻訳で省略がなければ、採用を検討させていただきます。心より感謝申し上げます!







































































