このチュートリアルでは、OpenResty XRay の強力な機能を活用して、アプリケーション内の最大の Perl メモリオブジェクトや値を素早く特定する方法について説明します。データ参照パスを使用して、これらの Perl メモリオブジェクトを正確に特定することができます。また、独自に開発した Perl オブジェクトメモリ分布のフレームグラフについても紹介します。これにより、Perl コード内のメモリリークや大量メモリ使用の問題を簡単に解決することができます。

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

まず、top コマンドを実行します。

Screenshot

ご覧のように、この Perl プロセスが最も多くのメモリを消費しています。

Screenshot

180MB を超えています。

Screenshot

ps コマンドを実行して、このプロセスの詳細を確認しましょう。このプロセスが使用している Perl バイナリ実行ファイルは、Linux ディストリビューションに付属のものです。

Screenshot

Perl プロセス内の大きなメモリオブジェクトまたは値を特定

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

Screenshot

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

Screenshot

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

Screenshot

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

Screenshot

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

Screenshot

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

Screenshot

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

Screenshot

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

Screenshot

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

Screenshot

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

Screenshot

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

Screenshot

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

Screenshot

分析を開始します。

Screenshot

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

Screenshot

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

Screenshot

分析を停止します。

Screenshot

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

Screenshot

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

Screenshot

Libc アロケータによって割り当てられたメモリが大部分を占めており、160 MB を超えていることがわかります。

Screenshot

これは最も多くのメモリを使用している Perl メモリオブジェクトの参照パスです。明らかに、この Perl 仮想マシンは Libc によって割り当てられたメモリの大部分を使用しています。

Screenshot

最大の使用量は Services::Preprocessor モジュール内にあります。

Screenshot

モジュールのシンボルテーブルには、order_name_cache という名前の変数があります。

Screenshot

この変数は Perl ハッシュテーブルです。

Screenshot

クリックして詳細を確認してください。

Screenshot

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

Screenshot

以下は問題についてのより詳細な説明と提案です。データ参照パス内のオブジェクトについて、一つずつ説明しています。

Screenshot

モジュール名 Services::PreProcessor は Perl ソースファイルのパスに対応しています。したがって、これらを使用してソースファイルを見つけることができます。

Screenshot

ターミナルで、カレントワーキングディレクトリを Perl アプリケーションのソースツリーに切り替えます。

Screenshot

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

Screenshot

完全なファイルパスをコピーし、vim エディタでソースファイルを開きます。お好みのエディタを使用することができます。

Screenshot

データ参照パスに戻ります。アイコンをクリックして、この Perl ハッシュテーブルの変数名をコピーします。

Screenshot

貼り付けます。ハッシュテーブルがここで定義されていることがわかります。

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

翻訳

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