OpenResty XRay による Core Dump の自動分析技術
このチュートリアルでは、OpenResty XRay を使用して、クラッシュした OpenResty/Nginx アプリケーションの core dump ファイルを自動的かつ包括的に分析する方法をご紹介いたします。OpenResty XRay は、C と Lua のコールスタックトレース、Lua の GC オブジェクト参照グラフ、Lua コルーチン、並行 HTTP リクエスト、libc のメモリ割り当てを網羅した詳細な分析レポートを生成いたします。動的トレースとフレームグラフの強力な機能を活用し、死亡プロセス(core dump ファイル)を分析することで、本番環境のアプリケーションクラッシュの根本原因を迅速に特定するお手伝いをいたします。
core dump ファイルの確認
ls
コマンドを実行し、現在のディレクトリ内のすべてのファイルを一覧表示いたします。
ここで新しい core dump ファイルが見つかりました。新しい core ファイルが必ずしもこのディレクトリに保存されるわけではありませんが、私どものアプリケーションではこのディレクトリに保存するよう事前に設定しております。
readlink
コマンドを実行して、そのファイルの絶対パスを確認いたします。
次に、OpenResty XRay を使用して、このコアファイルをリアルタイムで分析し、プロセスクラッシュの原因とコンテキスト情報を特定します。 この core ファイルのパスをコピーします。
core dump ファイルを分析
ブラウザで OpenResty XRay の Web コンソールを開きます。
現在分析中のマシンが正しいことを確認してください。
正しくない場合は、リストから再選択することができます。
「Guided Analysis」ページに移動します。
ここでは、システムが分析可能な様々な種類の問題を確認できます。
「Core dumps or process crashes」を選択します。
「Next」をクリックします。
把我们刚刚复制的 core 文件路径名粘贴到这里。
OpenResty XRay は、この core ファイルから実行可能ファイルのパスを自動的に抽出し、このテキストボックスに表示します。
アプリケーションのタイプが正しいことを確認します。通常、デフォルト値が正しいです。
分析を開始します。システムは分析を実行します。
初回の分析が完了し、レポートを生成しています。
自動生成された分析レポートが表示されます。
レポートの右上に core ファイルのパスと生成時刻が表示しています。
まず、実行コンテキストを確認しましょう。
マシンコードレベルの情報を見てみましょう。
プロセスが SEGV
シグナルによって中断されたことが分かります。
以下は、このシグナルの詳細な説明です。SEGV は「セグメンテーション違反」を意味し、プログラムがアクセス権限のないメモリ領域にアクセスしようとしたか、存在しないメモリ領域にアクセスしようとした際に発生いたします。
ここには、現在実行中の命令の周辺の逆アセンブリコードが表示されています。
この行が現在実行中の命令で、行の前にある赤い矢印で識別できます。まさにこの命令を実行中にセグメンテーション違反が発生しました。
このディレクティブはメモリアドレスを読み取っています。
これは core dump 発生時の CPU レジスタの値です。
これは GNU C ライブラリの関数です。
メモリの一部分を別の場所にコピーする機能があります。
この関数は LuaJIT の一部です。FFI の cdata
型に対する __index
メタメソッドを処理します。
ngx_http_lua_run_thread
は Nginx ウェブサーバーの関数で、Lua ルーチンを実行します。
ngx_http_core_content_phase
は HTTP リクエスト処理サイクルのコンテンツフェーズを処理する役割を担っています。
これは Lua のバックトレースが実行されています。
この C 関数はメモリコピーを行っています。C のコールスタックトレースでもこの関数を確認しました。
これら 2 つのメタメソッドは、cdata
内部のフィールドメンバーにアクセスする際に呼び出されます。
decode_order_data
はビジネスロジック内の Lua 関数です。
「More」をクリックすると、さらに詳細を確認できます。
上記のコールスタックトレースは、この Lua CPU フレームグラフから自動的に導出されたものです。
以下は完全なコールスタックトレースで、各 Lua 関数フレーム内のすべての引数とローカル変数の値が含まれています。
ここをクリックすると、decode_order_data
関数のすべてのローカル変数と引数変数を確認できます。
ビジネスレベルの関数 decode_order_data
に戻りましょう。マウスを関数の緑色のボックスに置いてください。
この関数のソースファイル名が表示されます。ツールチップにはファイルの完全なパスも表示されております。
ソースコードの行番号は 79 です。
このアイコンをクリックすると、この関数の完全なソースファイルパスがコピーされます。
vim エディタを使用してソースファイルを開き、このファイル内の Lua コードを確認します。お好みのエディタをご使用いただいて構いません。
OpenResty XRay が提案したとおり、79 行目に移動します。
order_cdata
が NULL ポインタである可能性があるため、その user_id
フィールドにアクセスする際にセグメンテーション違反が発生し、クラッシュいたしました。したがって、アクセスする前に order_cdata
が NULL ポインタでないかを確認する必要があります。
ここから、このコード行が実際に decode_order_data
関数内にあることが確認できます。これは先ほどのレポートで言及されていた通りです。
これは、まだ生存している LuaJIT コルーチンの中で最も一般的なコールスタックトレースです。
sleep
は C 言語の関数で、現在のスレッドの実行を一定時間停止するために使用されます。
ここには、クラッシュ発生時に処理中のすべての HTTP リクエストが表示されています。
これは、クラッシュ発生時に Nginx プロセスが処理していた HTTP リクエストの情報です。
ここには、リクエストを発信したクライアントの IP アドレスが表示されています。
リクエストメソッドは POST です。
これはリクエストの URI です。
他のすべての並行 HTTP リクエストをさらに確認することができます。
レポートにはメモリ分析も含めます。
これは Lua GC オブジェクトメモリ分布の最もホットなデータ参照パスです。
このパスの意味は以下の通りです:registry
レジストリに移動し、
_LOADED
テーブルを見つけ、
その中で engines.sre.sre_lib
モジュールを見つけ、
そのモジュール内で、run_rules
関数またはデータにアクセスします。
このパスは、この Lua GC オブジェクトメモリ分布フレームグラフから自動的に導出されたものです。
完全自動化された分析とレポート
OpenResty XRayは、オンラインアプリケーションによって生成された新しいコアダンプを監視し、これらのファイルを分析してレポートを生成することもできます。「Insights」ページに切り替えます。
「Insights」ページでは、日次および週次のレポートを確認することができます。
したがって、「Guided Analysis」機能を必ずしも使用する必要はありません。もちろん、「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 XRay(マイクロサービスおよび分散トラフィックに最適化された多機能
翻訳
英語版の原文と日本語訳版(本文)をご用意しております。読者の皆様による他の言語への翻訳版も歓迎いたします。全文翻訳で省略がなければ、採用を検討させていただきます。心より感謝申し上げます!