← Back
Case-Study

OpenResty の隠れたメモリリークを無停止で特定する手法(Zero Downtime)

  • 本番環境におけるメモリリークの徹底解剖
  • なぜ、このような問題は解決が極めて困難なのか?
  • 「運任せ」から「予測可能」なシステムへ
  • パフォーマンス問題が「ツール」の域を超える時
  • 本番環境におけるメモリリークの徹底解剖
  • なぜ、このような問題は解決が極めて困難なのか?
  • 「運任せ」から「予測可能」なシステムへ
  • パフォーマンス問題が「ツール」の域を超える時

Nginx リバースプロキシの QPS が 15 分の 1 に低下:upstream keepalive の欠落と -O0 ビルドが原因だった

  • Nginx リバースプロキシが 15 分の 1 に低速化、それでもエラーログはゼロ
  • フレームグラフが暴いた接続ストーム:upstream keepalive の欠落
  • 残り 10% の差:ベースライン比較がコンパイラを指し示す
  • -O0 デバッグビルドが 10% の性能を奪っていた
  • Nginx リバースプロキシが 15 分の 1 に低速化、それでもエラーログはゼロ
  • フレームグラフが暴いた接続ストーム:upstream keepalive の欠落
  • 残り 10% の差:ベースライン比較がコンパイラを指し示す
  • -O0 デバッグビルドが 10% の性能を奪っていた

プラグインが CPU の 45% を食い潰した際、ソースコードなしで Lua の 93 行目を特定した方法?

  • perf が「ブラック ボックス」に直面したとき *「サンプリング」から「フルスタック動的トレーシング」へ
  • 証拠の連鎖を特定する
  • 「何が起こったか」から「なぜ」へ
  • perf が「ブラック ボックス」に直面したとき *「サンプリング」から「フルスタック動的トレーシング」へ
  • 証拠の連鎖を特定する
  • 「何が起こったか」から「なぜ」へ

Gzip CPU 使用率が高い原因:圧縮レベル 6 が CPU の 54% を消費した実例

  • 本番環境で Gzip 圧縮が CPU の 54% を消費していた経緯
  • Gzip の CPU 使用率が高かった原因:設定パラメータレベルの診断
  • Gzip と Brotli の CPU オーバーヘッドを定量化する
  • 勘に頼る調整からデータ駆動の圧縮チューニングへ
  • 本番環境で Gzip 圧縮が CPU の 54% を消費していた経緯
  • Gzip の CPU 使用率が高かった原因:設定パラメータレベルの診断
  • Gzip と Brotli の CPU オーバーヘッドを定量化する
  • 勘に頼る調整からデータ駆動の圧縮チューニングへ

Nginx C++ モジュールのメモリリーク:本番環境で再起動なしに根本原因を特定

  • 本番環境の難題:GDB でデバッグできない C++ モジュールのメモリリーク
  • フレームグラフで ngx_dubbo_module 内のリーク関数を特定する方法
  • 受動的な対応から能動的な支援へ:XRay が実現するトラブルシューティングの新たなサイクル
  • まとめ
Photo by 章亦春
  • 本番環境の難題:GDB でデバッグできない C++ モジュールのメモリリーク
  • フレームグラフで ngx_dubbo_module 内のリーク関数を特定する方法
  • 受動的な対応から能動的な支援へ:XRay が実現するトラブルシューティングの新たなサイクル
  • まとめ

300 RPS で頭打ちの Nginx Worker プロセス:原因は 75 ミリ秒のイベントループ・ブロッキング

  • 負荷は高いのに仕事が進まない:worker_cpu_affinity 欠落による CPU リソース競合
  • ブロッキング Lua I/O 呼び出しが Nginx イベントループを停止させた仕組み
  • ファイル I/O レイテンシーの測定:1 回あたり最大 1.5 ミリ秒
  • Nginx イベントループのブロッキングはどれほど深刻だったか:43,952 サンプル、最大 75 ミリ秒
  • よくある質問
  • 負荷は高いのに仕事が進まない:worker_cpu_affinity 欠落による CPU リソース競合
  • ブロッキング Lua I/O 呼び出しが Nginx イベントループを停止させた仕組み
  • ファイル I/O レイテンシーの測定:1 回あたり最大 1.5 ミリ秒
  • Nginx イベントループのブロッキングはどれほど深刻だったか:43,952 サンプル、最大 75 ミリ秒
  • よくある質問

クラッシュから根本原因まで:OpenResty XRay が Nginx メモリ破壊問題を明確に分析する方法

  • 事例の背景:ログでは説明できない Nginx ワーカープロセスの頻繁なクラッシュ
  • 記録ファイルの分析:クラッシュを「第一現場」まで巻き戻して再生する
  • 根本原因:Nginx 接続ライフサイクルにおける Use-After-Free
  • よくある質問(FAQ)
Photo by 章亦春
  • 事例の背景:ログでは説明できない Nginx ワーカープロセスの頻繁なクラッシュ
  • 記録ファイルの分析:クラッシュを「第一現場」まで巻き戻して再生する
  • 根本原因:Nginx 接続ライフサイクルにおける Use-After-Free
  • よくある質問(FAQ)

OpenResty の LRU キャッシュに起因するメモリリークを追跡する —— 根本原因はキャッシュされた SSL 証明書

  • なぜ低トラフィックの OpenResty アプリがメモリをリークし続けたのか
  • LRU キャッシュのメモリリークを一歩ずつ追跡する全過程
  • 最終結果:無限の増加から安定したメモリへ
Photo by 章亦春
  • なぜ低トラフィックの OpenResty アプリがメモリをリークし続けたのか
  • LRU キャッシュのメモリリークを一歩ずつ追跡する全過程
  • 最終結果:無限の増加から安定したメモリへ

Nginx Worker の CPU 使用率の偏り:reuseport 未設定と cjson ボトルネックを特定

  • 症状:一部の Nginx Worker プロセスだけ CPU が張り付き、他はアイドル状態
  • OpenResty XRay による根本原因の特定
  • 修正:3 つの最適化とそれぞれの実測効果
  • 要約:OpenResty XRay が数分で特定した内容
  • よくある質問
Photo by 章亦春
  • 症状:一部の Nginx Worker プロセスだけ CPU が張り付き、他はアイドル状態
  • OpenResty XRay による根本原因の特定
  • 修正:3 つの最適化とそれぞれの実測効果
  • 要約:OpenResty XRay が数分で特定した内容
  • よくある質問

リークした Lua テーブルを特定する:registry / _LOADED(package.loaded)参照パス · OpenResty XRay

  • LuaJIT のメモリ管理方法
  • OpenResty XRay のコマンドラインツール
  • Lua テーブルのリーク例
  • LuaJIT GC オブジェクト種別ごとのメモリ内訳
  • lj-gco-ref フレームグラフの読み方:registry、_LOADED、package.loaded
  • 完全自動の Lua メモリリーク分析
  • LuaJIT のメモリ管理方法
  • OpenResty XRay のコマンドラインツール
  • Lua テーブルのリーク例
  • LuaJIT GC オブジェクト種別ごとのメモリ内訳
  • lj-gco-ref フレームグラフの読み方:registry、_LOADED、package.loaded
  • 完全自動の Lua メモリリーク分析

メモリ使用量が 60% 削減、OpenResty XRay で問題コードを正確に特定し、迅速に修正・デプロイを実現

  • worker プロセスのメモリ使用量が高い問題について
  • OpenResty XRay による分析プロセス
  • worker プロセスのメモリが解放されない疑問について
Photo by 章亦春
  • worker プロセスのメモリ使用量が高い問題について
  • OpenResty XRay による分析プロセス
  • worker プロセスのメモリが解放されない疑問について
お問い合わせ

ご意見・ご感想をお待ちしております 👋

メッセージを送信しました!

専門家チームが24時間以内にご連絡いたします。
x