OpenResty XRay による Erlang コードの最も CPU 高負荷の部分のオンライン特定方法
本日は、OpenResty XRay を使用して Erlang/OTP アプリケーションを分析する例を段階的にご紹介します。既に実行中の Erlang プロセスにおいて、CPU 使用率が最も高いコードパスを迅速に特定します。これらのコードパスは最も多くの CPU 時間を消費し、アプリケーションのパフォーマンスに影響を与えます。OpenResty XRay は、Erlang 言語レベルと、より低レベルの Beam 仮想マシンの C 言語レベルの両方を同時に分析できます。OpenResty XRay は真の非侵襲的な動的分析ツールであり、対象アプリケーションに特別なモジュールやプラグインをインストールする必要がなく、対象アプリケーションを再コンパイルする必要もなく、さらには既に実行中のプロセスを再起動する必要もありません。
問題:CPU の高負荷
まず、top
コマンドを実行して、対象プロセスの CPU 使用率を確認します。
このプロセスが 200% 以上の CPU リソースを消費していることがわかります。
このプロセスは rebar3
という名前で、Erlang プロジェクトを管理およびビルドするためのツールです。ここではプロジェクトを起動するために使用しています。
ps
コマンドを実行して、このプロセスの詳細を確認します。
この rebar3
バイナリ実行ファイルは Linux ディストリビューションに付属しているものです。このプログラムは当然、標準のディストリビューションに付属の Erlang でコンパイルされています。
Erlang の CPU ホットスポットを特定
OpenResty XRay を使用して、システムはリアルタイムで分析を行い、CPU が具体的にどこで消費されているかを特定します。
OpenResty XRay の Web コンソールに移動します。
現在分析中のマシンが正しいことをご確認ください。
正しくない場合は、リストから再選択することができます。
「Guided Analysis」ページに進みます。
ここでは、システムが分析可能な様々な種類の問題を閲覧できます。
「High CPU Usage」を選択します。
「Next」をクリックします。
Erlang アプリケーションを選択します。
CPU リソースを 200% 近く消費しているプロセスを選択します。これは先ほど top
で確認したものです。
アプリケーションのタイプが正しいことを確認します。通常、デフォルト値が正しいです。
OpenResty XRay は、様々な言語レベルで分析を行うことができます。ここでは Erlang と C/C++ の両方を選択したままにします。
最長分析時間を設定することもできます。ここではデフォルトの 300 秒のままにします。
分析を開始します。
システムは複回数の分析を継続的に実行します。現在、初回の分析を実行中です。
初回の分析が完了し、現在 2 回目のラウンドに入っております。この例では、1 回の分析で十分です。
分析を停止します。
自動生成された分析レポートが表示されます。
これは分析対象の問題タイプである CPU です。
これは CPU 時間を最も多く消費している Erlang コードパスです。
check_resp_content
関数は、コンテンツをチェックするためのビジネスロジック関数です。
この関数は lists
モジュールの filter
関数を呼び出してリストをフィルタリングしています。
フィルタリング条件は無名関数で、この無名関数内で正規表現マッチングを使用しています。これらの呼び出しはすべて check_resp_content
関数内で発生しています。
詳細を表示するにはクリックしてください。
このホットコードパスは、Erlang 言語レベルの CPU フレームグラフから自動的に導き出されたものです。
これは問題に関するより詳細な説明と提案です。
先ほどのホットコードパスに戻ります。この関数の緑枠にマウスを合わせてください。ツールチップにソースファイルのパスが表示されます。
Erlang ソースコードの行番号は 15 です。
ソースファイルのパスをコピーするにはクリックしてください。
Vim エディタを使用して Erlang ソースファイルを開きます。お好みのエディタを使用していただいて構いません。
OpenResty XRayの提案に従って、15 行目に移動します。
これは re
モジュールの run
関数です。
これは先ほど見た lists:filter
関数呼び出しです。
このコードは確かに check_resp_content
関数内にあります。ここで正規表現を最適化して、正規表現エンジンが高コストのバックトラッキング操作を行うのを避けることができます。または、バックトラッキングを行わない正規表現エンジンを使用することもできます。
これら 2 つのコードパスは似ており、どちらも正規表現マッチングを実行しています。
3 番目のパスは文字列の長さを計算しています。
iolist
はマッチングする入力文字列で、erts_iolist_size
はマッチング対象の文字列の長さを計算しています。
ここでの Content
がマッチング対象の入力文字列です。
Web コンソールに戻ります。CPU 時間を最も多く消費している C++ コードパスを見てみましょう。C++ 言語レベルの分析は、Erlang の Beam 仮想マシンレベルのパフォーマンスホットスポットを示しています。
match
という名前のこの C 関数は、PCRE ライブラリ内で正規表現マッチングを実行する関数です。
erts_pcre_exec
関数は、Erlang ランタイムによる PCRE ライブラリの pcre_exec
関数のラッパーです。
re_run
は Erlang の re
モジュールで正規表現マッチングを実行するための関数です。
この 16 進数アドレスは、このコードパスが JIT コンパイルされた Erlang コード内で実行されていることを示しています。
自動生成レポート
OpenResty XRay はオンラインプロセスを自動的に監視し、分析レポートを生成することができます。「Insights」ページに切り替えてください。
「Insights」ページでは、日次および週次の自動レポートをご確認できます。そのため、「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 Edge(マイクロサービスおよび分散トラフィックに最適化された多機能
翻訳
英語版の原文と日本語訳版(本文)をご用意しております。読者の皆様による他の言語への翻訳版も歓迎いたします。全文翻訳で省略がなければ、採用を検討させていただきます。心より感謝申し上げます!