このチュートリアルでは、Python Web アプリケーションの内部メモリ使用状況の詳細を分析する方法を紹介します。このアプリケーションは Python の Django フレームワークに基づいています。OpenResty XRay で見つけた詳細なデータ参照パスを使用して、最もメモリを消費している Python オブジェクトや値を特定できます。OpenResty XRay は Python GC オブジェクトのメモリ分布フレームグラフを自動生成し解釈します。これは私たちが独自に開発したフレームグラフの種類です。特定の Python オブジェクト、例えば特定の Python 文字列や辞書まで正確に特定できます。

django.png

問題: メモリ使用量が高い

ps コマンドを実行して、すべての Python3 プロセスを確認します。86MB のメモリを使用しているプロセスが 1 つあることがわかります。

Screenshot

この Python バイナリ実行ファイルは Linux ディストリビューションに付属しているものです。

Screenshot

Django アプリケーションを分析

OpenResty XRay を使用して、この未変更のプロセスを検査してみましょう。リアルタイムで分析を行い、メモリがどこで具体的に消費されているかを確認できます。

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

Screenshot

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

Screenshot

現在の機器が正しくない場合は、以下のリストから正しい機器を選択できます。

Screenshot

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

Screenshot

ここでは、システムがどのような種類の問題を分析できるかが表示されています。

Screenshot

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

Screenshot

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

Screenshot

Python Django アプリケーションを選択します。

Screenshot

84MB 以上のメモリを消費しているプロセスを選択します。これは先ほど ps コマンドの出力で確認したものです。

Screenshot

アプリケーションのタイプが正しいことを確認します。

Screenshot

通常、デフォルト値が正しいです。

Screenshot

OpenResty XRay は複数の言語レベルを同時に分析できます。ここでは Python と C/C++ の両方を選択したままにします。

Screenshot

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

Screenshot

分析を開始します。

Screenshot

システムは複数のラウンドの分析を継続的に実行し、現在は最初のラウンドの分析を実行しています。

Screenshot

最初のラウンドの分析が完了し、2 回目のラウンドの分析に入りました。この例では、1 回の分析で十分です。

Screenshot

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

Screenshot

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

Screenshot

自動生成された分析レポートが表示されています。

Screenshot

これが現在分析しようとしている問題のタイプ、Memory です。

Screenshot

このデータ参照パスは、インタープリターがロードした Python モジュールが合計で 38MB のメモリを使用していることを示しています。

Screenshot

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

Screenshot

このデータ参照パスは、この Python GC オブジェクトメモリ分布フレームグラフから自動的に導き出されたものです。

Screenshot

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

Screenshot

.modules について言及しています。

Screenshot

そして、これには Python モジュールに関連するすべてのものが含まれていると述べています。

Screenshot

次に、フレームグラフを拡大して、どの Python モジュールが比較的多くのメモリを占有しているかを見つけます。

Screenshot

ここでは 1521 個の Python モジュールがまとめられていることがわかります。各モジュールはメモリの 1% 未満しか使用していません。

Screenshot

このモジュールは比較的多くのメモリを使用しています。クリックして拡大し、より詳細を確認できます。

Screenshot

ここでは、openpyxl.utils.cell モジュールが 2.6MB 以上のメモリを使用していることがわかります。openpyxl は Excel ファイルを処理する Python ライブラリです。

Screenshot

モジュール名をコピーします。

Screenshot

ターミナルを開き、find コマンドを使用して、プロジェクトディレクトリ内でこのモジュールに対応するソースコードファイルを検索します。プロジェクトディレクトリは Python モジュールのインストールパスのルートディレクトリです。

Screenshot

先ほどコピーしたモジュール名を貼り付けます。

Screenshot

Screenshot

ここでは、モジュール名のドットを grep コマンドのワイルドカードとして使用しています。

Screenshot

このファイルパスをコピーします。

Screenshot

vim エディタを使用してソースファイルを開き、このファイル内の Python 実装コードを確認します。お好みのエディタを使用できます。

Screenshot

フレームグラフに戻ります。

openpyxl モジュールは _COL_STRING_CACHE_STRING_COL_CACHE という 2 つの辞書を定義しています。これらは Excel のセル座標と列名の間の変換に使用されます。これらの変数は比較的多くのメモリを使用しています。

Screenshot

最初の変数の名前をコピーします。

Screenshot

次に _COL_STRING_CACHE を検索すると、このオブジェクトを見つけることができます。このファイル内でこの変数を使用しているすべての場所も見つけることができます。

Screenshot

_STRING_COL_CACHE 変数も同様の方法で見つけることができます。

Screenshot

フレームグラフ上の他のメモリを多く使用しているモジュールも同様の方法で分析できます。

例えば、linecache モジュールです。これはファイルの内容をキャッシュする Python の標準モジュールです。648KB のメモリを使用しています。

Screenshot

cache という名前の変数があり、多くのメモリを使用しています。

Screenshot

Python は Libc アロケータと mmap システムコールを使用してメモリを割り当てています。レポートによると、Libc アロケータは 18.7MB のメモリを使用しています。

Screenshot

自動生成レポート

OpenResty XRay はオンラインプロセスを自動的に監視し、分析レポートを生成することができます。「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 以上のオープンソースソフトウェアライブラリを執筆しております。

翻訳

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