このチュートリアルでは、アプリケーション内の最大の Python メモリオブジェクトまたは値を迅速に特定する方法を学びます。これは OpenResty XRay の強力な機能によって可能になります。データ参照パスを通じて、これらのガベージコレクション可能なオブジェクトを正確に特定できます。また、独自に開発した Python GC オブジェクトメモリ分布フレームグラフもご紹介します。これにより、Python コード内のメモリリークや大規模なメモリ使用の問題を簡単に解決できるようになります!

問題:メモリ使用率が高すぎる

まず、top コマンドを実行して各プロセスのメモリ使用状況を確認します。gunicorn という名前の Python プロセスが 600MB 以上のメモリを消費していることがわかります。

Screenshot

ps コマンドを実行して、このプロセスの詳細を確認しましょう。

Screenshot

このプロセスが使用している Python3 バイナリ実行ファイルは、Linux ディストリビューションに付属のものであることがわかります。

Screenshot

Python プロセス内の大規模メモリオブジェクトまたは値を特定

OpenResty XRay を使用して、この未修正のプロセスを検査することができます。システムはリアルタイムで分析を行い、メモリが具体的にどこで消費されているかを特定します。ブラウザで OpenResty XRay の Web コンソールを開きます。

Screenshot

現在分析中のマシンが正しいことを確認してください。

Screenshot

正しくない場合は、リストから再選択することができます。

Screenshot

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

Screenshot

ここでは、システムが分析可能な様々な種類の問題を確認できます。

Screenshot

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

Screenshot

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

Screenshot

先ほどの Python アプリケーションを選択します。

Screenshot

約 600 MB のメモリを消費しているプロセスを選択します。これは先ほど top で確認したプロセスです。

Screenshot

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

Screenshot

OpenResty XRay は、様々な言語レベルで分析を行うことができます。ここでは Python と C/C++ の両方を選択したままにします。

Screenshot

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

Screenshot

分析を開始します。

Screenshot

システムは複回数の分析を継続的に実行します。現在、初回の分析を実行中です。

Screenshot

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

Screenshot

分析を停止します。

Screenshot

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

Screenshot

これは分析対象の問題タイプであるメモリです。

Screenshot

メモリの大部分が Libc アロケータによって割り当てられており、580 MB 以上に達していることがわかります。

Screenshot

これは最もメモリを占有している Python GC オブジェクトの参照パスです。この Python 仮想マシンが Libc アロケータを使用してメモリを要求していることが明確です。

スクリーンショット

この Python 辞書は、ロードされたすべての Python モジュールを保存するために使用されています。

Screenshot

これは order_service.service.order.prev_processor という名前の Python モジュールです。

スクリーンショット

このモジュール内に order_name_cache という名前のフィールドがあります。

スクリーンショット

このフィールドの値は Python 辞書です。

Screenshot

クリックして詳細を表示します。

Screenshot

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

スクリーンショット

以下は問題に関するより詳細な説明と提案です。先ほど確認した prev_processor モジュールについて言及しています。

スクリーンショット

また、order_name_cache 辞書についても言及しています。

スクリーンショット

データ参照パスに戻りましょう。このアイコンをクリックして、モジュール名をコピーします。

Screenshot

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

スクリーンショット

先ほどコピーしたモジュール名を貼り付けます。ここでは、モジュール名のドットを grep コマンドのワイルドカードとして利用しています。

スクリーンショット

完全なファイルパスをコピーします。vim エディタを使用してこのソースファイルを開きます。お好みのエディタを使用していただいて構いません。

スクリーンショット

先ほどのレポートで言及された order_name_cache 変数を見つけることができます。

スクリーンショット

この変数がどのように使用されているかを確認し、メモリリークの問題があるかどうかを判断することもできます。

Screenshot

全自动分析与报告

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

Screenshot

「Insights」ページに切り替えてください。

Screenshot

「Insights」ページでは、日次および週次の自動レポートをご確認できます。そのため、「Guided Analysis」機能を必ずしも使用する必要はないですが、

Screenshot

その機能はアプリケーションの開発やデモンストレーションに非常に有用です。

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

翻訳

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