弊社のビジネスでは OpenResty 関連のエコシステムを大規模に活用しており、時折メモリや CPU ホットスポットなど、特定が困難な奇妙な問題が発生することがございました。 OpenResty XRay の支援により、これらの問題の根本原因を迅速に特定し、速やかに解決することができました。
OpenResty XRay は導入が簡単で、ビジネスに対して非侵襲的であり、インターフェースは直感的かつ明瞭です。多くの最適化の方向性をご提示いただき、すでに弊社の強力なツールとなっております。
OpenResty XRay の更なるご発展を心より祈念申し上げます。

胡氏, YUNDUN CTO

OpenResty XRay は OpenResty Inc. が開発した高度なアプリケーションパフォーマンス管理(APM)製品であり、非侵襲的な方法でアプリケーションシステムにリアルタイムの X 線診断と最適化を提供いたします。今年上半期に試用申請の受付を開始して以来、多くのお客様を成功裏にサポートし、広くご好評をいただいております。

上海云盾信息技术有限公司(YUNDUN)は、次世代のセキュリティ製品とサービスの提供に特化した革新的な企業でございます。 云盾の製品ラインにおいても、オープンソースの OpenResty を大規模に採用しており、その高性能と柔軟なカスタマイズ性が云盾の製品に強力なサポートを提供しております。同時に、オープンソースの OpenResty をご利用いただく過程で、いくつかの難解な課題にも直面いたしました。

worker プロセスのメモリ使用量が高い問題について

こちらは云盾(クラウドシールド)が初めて XRay を使用した事例でございます。当時、本番環境の OpenResty worker プロセスが想定以上のメモリを消費しており、トラフィックを切り替えた後もメモリ使用量が減少いたしませんでした。長時間の調査を経て、LuaJIT のメモリ消費量が多いことが原因であると初期診断されましたが、より具体的な問題点を特定することができませんでした。XRay がこの問題の分析と診断にお役立ていただけることを期待しております。

分析プロセス

まず、本番環境に直接 OpenResty XRay を導入いたしました。XRay はアプリケーションの改変を必要とせず、非侵入的な方法でアプリケーションを分析できるため、本番環境に直接適用することが可能でございます。

メモリ関連の問題に対して、XRay には一連の分析ソリューションが統合されております。具体的な背景知識については、以下のブログ記事をご参照ください:

  1. OpenResty と Nginx のメモリ割り当てと管理方法
  2. OpenResty と Nginx の共有メモリ領域が物理メモリをどのように消費するか

まず、OpenResty worker プロセスのアプリケーションレベルでのメモリ使用状況に着目いたしました。

Application-level memory usage distribution

Stream LuaJIT が大部分のメモリを占有していることが確認できます。このブロックをクリックして詳細を確認いたしました。

LuaJIT memory allocator

メモリの大部分が stream サブシステムの LuaJIT GC によって管理されていることが判明いたしました。このブロックをさらにクリックして分析を続けました。

Memory distribution of different types of LuaJIT GC objects

Size distribution statistics of LuaJIT String objects

100万以上の table オブジェクトが存在し、メモリの大部分を占有していることが確認できました。さらに GC オブジェクト参照関係のフレームグラフを確認いたしました。

LuaJIT GC オブジェクト参照関係フレームグラフ

Lua の世界では、Lua GC オブジェクトが GC ルートから参照されている場合、それは「生存」状態であり、そうでなければ「死滅」状態となります。GC の動作により、死滅状態のオブジェクトは最終的にクリーンアップされ解放されます。

GC オブジェクト参照関係フレームグラフは、参照関係チェーンをフレームグラフの形式で表示するもので、下から上へ参照関係を示し、幅はメモリ使用量の大きさを表しております。

具体的に得られたフレームグラフでは、ngx.ctx から参照されているオブジェクトが多くのメモリを占有しており、また非常に分散していることが確認できました。フレームグラフ内の一つの柱を選択して詳細を確認いたしました:

LuaJIT GC オブジェクト参照関係フレームグラフ-局所

この時点で ngx.ctx.game_conf.tcp が 66 個の table を参照しており、1MB 以上のメモリを占有していることが確認できました。 他の柱を選択して確認しても、同様の参照パターンが見られました。 この重要な情報を得て、雲盾(Yundun)のエンジニアチームは迅速に最適化改善を完了することができました。

OpenResty XRay のご利用開始から、問題の分析・特定、最適化改善、そして本番環境での検証確認まで、わずか半日の時間しか要しませんでした。XRay のような問題を正確に特定する能力がなければ、このような短期間での解決は不可能だったでしょう。

XRay を使用して最適化後の実際の状況を確認してみましょう。全体のメモリ使用量は 60%以上削減されました。

Application-level memory usage distribution

この時点で Stream LuaJIT の使用量も大幅に減少し、最適化前と比較して 80%以上削減されたことが確認できます。最適化作業は無事に完了いたしました。

worker プロセスのメモリが解放されない疑問について

しかしながら、ここでまだ疑問が残ります。なぜ以前トラフィックが切り替わった後も、 メモリ使用量が顕著に減少しなかったのでしょうか。 トラフィック切り替え後の分析を見てみましょう。以下の図の通りです。

LuaJIT メモリアロケータが管理するメモリの大部分は、空きメモリプールに存在しており、オペレーティングシステムに解放されていないことがわかります。 これは LuaJIT のメモリアロケータが空きメモリプールの仕組みを持っており、連続した完全な空きメモリセグメントが発生した場合にのみ、メモリをオペレーティングシステムに返却するためです。

また、トレンドグラフを通じて、メモリ使用の変化プロセスを完全に確認することができます。例えば以下の図をご覧ください:

LuaJIT メモリアロケータトレンド

メモリトレンドグラフから、トラフィック切り替え中に使用中のメモリが徐々に減少し、空きメモリが徐々に減少していることがわかります。 トラフィックが戻ってきた際に、空きメモリが再び使用され始めました。これにより謎が解明されました。

著者について

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

翻訳

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