現代のインターネットアプリケーションにおいて、メモリリークは頻繁に発生する頭の痛い問題の一つです。トラフィック量が少ないアプリケーションであっても、不適切なメモリ管理が原因でリソースの浪費やシステムの不安定化を招く可能性があります。本稿では、実際の事例をご紹介し、OpenResty XRay ツールを用いて、メモリリーク問題をいかに正確に診断し、解決するかを解説します。

見えざる脅威:メモリリークはビジネスの安定性をいかに脅かすか

あるお客様の OpenResty アプリケーションでは、ビジネスのトラフィック量は少ないにもかかわらず、その worker プロセスのメモリ使用量が時間の経過とともに増加し続け、想定をはるかに上回っていました。この典型的なメモリリーク現象は、深刻なリソースの浪費を引き起こしただけでなく、本番業務の安定性に対しても重大なリスクをもたらしていました。有効な分析ツールがなかったため、お客様はリークの根本原因を特定できずにいました。そこで https://openresty.com/jp/xray/ チームが介入し、その強力な動的追跡および分析能力を活用して、オンラインで稼働中の OpenResty プロセスに対し、非侵襲的な診断を実施しました。

メモリリークの完全な調査プロセスを解明

ステップ 1:リークの「タイムライン」を捕捉

まず、https://openresty.com/jp/xray/ のプロセスメモリ傾向グラフを通じて、お客様からのご報告を視覚的に検証いたしました。

Screenshot

監視データによると、OpenResty プロセスの RSS (Resident Set Size) メモリが明確な線形増加を示しており、これはメモリリークの典型的な特徴です。

ステップ 2:メモリ消費の「主な要因」を追跡

どの部分のメモリに問題があるかを特定するため、https://openresty.com/jp/xray/ のメモリ分析機能を使用しました。自動分析レポートでは、以下の点が示されました:

  • Glibc のメモリ割り当て が総メモリの約 93% を占めており、これがメモリ消費の主な原因でした。
  • LuaJIT のメモリ割り当て は約 2.4% に過ぎませんでした。

Screenshot

resty-memory のメモリ内訳グラフを用いて Glibc のメモリ使用状況をさらに詳しく分析したところ、その増加が完全に Glibc Arena に起因していることが判明しました。

Screenshot

通常、Nginx 自身のメモリプールである Nginx memory pool は Arena 領域を通じて割り当てられますが、弊社が観測したところ、Nginx memory pool の使用量は非常に小さく、かつ安定していました。

Screenshot

Glibc によって割り当てられたメモリが時間とともに線形的に増加しているのに対し、Nginx memory pool のメモリ使用量は非常に小さいままであることがわかります。

Screenshot

このことから、リークの原因は通常のリクエスト処理に起因するものではなく、他のモジュールが Glibc を通じて直接確保したメモリにあることが示唆されました。

ステップ 3:フレームグラフから根本原因の特定へ

では、どのコードが継続的に Arena メモリを確保し、決して解放していなかったのでしょうか?その答えは、https://openresty.com/jp/xray/ のメモリリークフレームグラフが示してくれました。

Screenshot

メモリリークフレームグラフは、メモリリークが SSL/TLS 証明書と秘密鍵を解析する段階で発生していることを示しています。

しかし、なぜリークが発生したのでしょうか?そこで、Lua GC オブジェクトフレームグラフ を使用し、Lua レベルでのオブジェクト参照関係を分析することにしました。

Screenshot

フレームグラフが示すところによれば、_LOADED.dynamic_cert.cert_cache という名前の Lua table がメモリの大部分を占有していることが判明しました。

その内部構造に .free_queu.hashht.key2node.node2key といったフィールドが含まれていることから、これが lua-resty-lrucache オブジェクトであると判断しました。

cert_cache というテーブル名とメモリリークフレームグラフを組み合わせることで、お客様が ssl.parse_pem_certssl.parse_pem_priv_key によって解析した結果を lru cache にキャッシュしていたと推測できます。

これにより、問題の全容が完全に明らかになりました。

  1. お客様はパフォーマンスを最適化するため、動的に読み込まれる SSL 証明書と秘密鍵の解析結果を LRU キャッシュである cert_cache にキャッシュしていました。
  2. 問題は、この LRU キャッシュが作成時に設定された容量が大きすぎたため、キャッシュ項目がほとんど、あるいは全く破棄されない状態になっていた点にあります。
  3. その結果、新しいドメインの証明書が解析されるたびに、その結果オブジェクトが LRU キャッシュ内に「永久に」保存されてしまいました。これらのオブジェクトはキャッシュによって参照され続けるため、Lua の GC (ガベージコレクタ) はそれらを回収できず、その下層にある OpenSSL 証明書構造体が占有するメモリも連鎖的にリークしていました。
  4. 時間の経過とともに、解析される証明書の数が増え続け、メモリ使用量もそれに伴い線形的に増加していきました。

窮地から飛躍へ:一回の的確な診断がもたらした変革

多くの企業が、システムのメモリ使用量が継続的に急増するものの、その根本原因をなかなか特定できない、という同様の状況に直面しています。問題自体は些細に見えても、一歩間違えればオンラインサービスのダウンタイムに繋がりかねません。

OpenResty XRay は、わずか一回の分析で、お客様が長年抱えていたこのメモリリークの難問を解決いたしました。

  1. 的確な特定、一撃で核心へOpenResty XRay は、メモリトレンドグラフ、メモリ分解分析、そして独自のメモリリークフレームグラフを通じて、段階的に問題の本質を明らかにしました。現象から根本原因に至るまで、分析プロセス全体が明確に可視化されるため、従来の手法にありがちな当て推量や試行錯誤を回避できます。

  2. 非侵襲的な診断、本番環境での安全性:分析の全工程において、コードの変更やサービスの再起動は一切不要であり、システムへの負荷も増加させません。高負荷な本番環境であっても、安全かつ安定したリアルタイム分析が可能です。

  3. お客様にもたらされたビジネス価値

    • メモリ使用率の大幅な削減:持続的な増加から、安定的かつ制御可能な状態へ
    • メモリ枯渇による潜在的なサービス停止リスクの排除
    • システム全体のパフォーマンスと応答速度の向上
    • 運用負荷とリソースの無駄を大幅に削減し、企業のコスト削減に直接貢献

この事例が示すように、一見単純に見えるメモリリークの問題であっても、専門的なツールの支援がなければ、技術チームにとって大きな障害となり得ます。OpenResty XRay は、その強力な可観測性 (observability) と分析能力により、迅速に問題の核心に迫り、お客様に明確な解決策を提示することで、技術的価値からビジネス価値への見事な転換を実現します。

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

翻訳

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