どの Kong プラグインが最もメモリや CPU を消費しているかを特定するには、OpenResty XRay が稼働中の Kong ゲートウェイプロセスをサンプリングし、リソース使用量をプラグイン単位で分解します。再起動不要・コード変更不要で、Kong の特別なビルドも必要ありません。以下の事例では、bot-detection プラグインがメモリを最も多く占有し、prometheus プラグインが CPU を最も多く消費していました。

Kong は、オープンソースの OpenResty フレームワークを基に構築された人気の API ゲートウェイソフトウェアで、柔軟なプラグイン機構を備えています。これにはコミュニティ製のプラグインも、ご自身で書いたプラグインも含まれます。しかし、これらのプラグインは CPU のボトルネック、高メモリ使用量、メモリリークを引き起こすことがあり、どれが原因かを見分けるのは容易ではありません。OpenResty XRay動的トレーシング製品であり、稼働中のプロセス上でその問いに直接答えます。効率的かつ安全で、ソフトウェアに X 線検査を行うようなものです。Kong プロセスを指定するだけでよく、特別なプラグインのインストールや Kong の再ビルドは不要です。

この記事では、OpenResty XRay を使用してサーバープロセス内の Kong プラグインの CPU とメモリ使用状況を分析する方法を、実際の結果例とその意味とともにご紹介します。

サーバープロセス内のすべての Kong プラグインの CPU 使用状況

OpenResty XRay は、Kong プロセスを数秒から数分間サンプリングすることができます。その期間はプロセスの負荷状況によって異なります。その後、現在ロードされているすべてのプラグイン間で CPU 時間がどのように分配されているかを示します。

例えば、以下は OpenResty XRay が Kong プロセスのために生成した円グラフです:

CPU 时间在所有加载的插件中的使用分布情况

ご覧のように、この場合、prometheus プラグインが CPU 時間の大部分を占めており、次いで ip-restriction プラグインが続いています。他のプラグインの CPU 使用量は無視できるレベルです。これは、Kong サーバーの CPU パフォーマンスを最適化したい場合、これら 2 つのプラグインに焦点を当て、改善や代替案を検討すべきであることを意味します。

もちろん、これは一例に過ぎません。より複雑な Kong サーバーでは、より多くのプラグインがここに表示され、トラフィックと設定に応じて分布が異なる可能性があります。

Kong プラグイン内の CPU 使用状況

OpenResty XRay は、すべての Kong プラグインの詳細を深く掘り下げ、どの Lua または C コードパスがより多くの CPU 時間を消費しているかを確認するのにも役立ちます。その簡単な方法の一つは、以下のような Lua-land CPU フレームグラフを見ることです:

このグラフは、サンプリング期間中に CPU 上で実行された Lua コードのコールスタックを示しています。バーが広いほど、より多くの CPU 時間を占有しています。バーにマウスを合わせると、関数名、ファイル名、行番号、CPU 時間の割合などの詳細情報を見ることができます。

このグラフを見ることで、Lua コード内のホットスポットやパフォーマンスの問題を素早く発見し、それに応じて最適化することができます。また、異なるプラグインや同じプラグインの異なるバージョンを比較して、CPU 使用量にどのような違いがあるかを確認することもできます。

プラグインが単に「重い」だけでなく異常に「熱い(CPU を食っている)」場合、同じフレームグラフがその理由を明らかにします。実例として、Kong の CPU ボトルネックをカスタムプラグイン内に潜む Lua 例外まで突き止めた事例をご覧ください。問題の string.lower 呼び出しまで追跡しています。

サーバープロセス内のすべての Kong プラグインのメモリ使用状況

同様に、OpenResty XRay は Kong サーバープロセス内のメモリ使用状況を簡単にサンプリングすることができます。

以下は、OpenResty XRay が同じ Kong プロセスのために生成した別の円グラフです:

所有加载的 Kong 插件的内存使用分布

この場合、bot-detection プラグインがメモリの大部分を占めており、prometheus プラグインが二番目であることがわかります。他のプラグインのメモリ使用量はかなり少なくなっています。これは、Kong サーバーのメモリ使用量を減らしたい場合、これら 2 つのプラグインを調査し、最適化や置き換えが可能かどうかを検討すべきであることを意味します。

同様に、これは一例に過ぎません。異なる Kong サーバーでは、設定されているプラグインやその他の設定に応じて、異なる結果が見られる可能性があります。

Kong プラグイン内のメモリ使用状況

OpenResty XRay は、Kong プラグイン内の Lua GC オブジェクトのメモリ使用状況を分析するのにも役立ちます。簡単な方法の一つは、GC オブジェクト参照フレームグラフを見ることです。これは、すべての GC オブジェクト参照パス上のメモリ使用分布を示しています。

このグラフは、サンプリング期間中にメモリを占有している Lua GC オブジェクトの参照パスを示しています。バーが広いほど、より多くのメモリを占有しています。バーにマウスを合わせると、オブジェクトタイプ、サイズ、メモリの割合などの詳細情報を見ることができます。

このグラフを見ることで、Lua コード内のメモリリークや非効率な問題を素早く発見し、それに応じて最適化することができます。また、異なるプラグインや同じプラグインの異なるバージョンを比較して、メモリ使用量にどのような違いがあるかを確認することもできます。

ある Kong プラグインのメモリが時間とともに増え続ける場合、同じ GC オブジェクト参照フレームグラフがリークしている参照パスを、メモリを保持しているオブジェクトまで追跡します。再起動もコード変更も不要です。ソース行までたどる詳しい手法は本番環境でのメモリリーク検出ワークフローを、実際の事例としてはLua GC のメモリリークをキャッシュされた SSL 証明書まで突き止めた例をご覧ください。

サーバーへの追加負荷

OpenResty XRay の使用が Kong サーバーのパフォーマンスに影響を与えるのではないかと心配されるかもしれません。答えは「影響しません」です。サンプリング時に Kong サーバープロセスに追加される負荷は通常非常に小さく、無視できるレベルです。サンプリングしていない時は、プロセスの実行速度は全く影響を受けません。

OpenResty XRay は非侵襲的で軽量であるように設計されています。通常の操作を妨げることはなく、コードや設定を変更する必要もありません。

よくある質問

どの Kong プラグインが最もメモリを消費しますか?

これはプラグインとトラフィックによって異なるため、唯一信頼できる答えはご自身のゲートウェイを実測することです。本記事でサンプリングしたプロセスでは、bot-detection プラグインが最も多くのメモリを占有し、次いで prometheus でした。OpenResty XRay は稼働中の Kong プロセス上でメモリをロード済みプラグイン単位に分解するため、特別なビルドなしで、ご自身の環境における本当の「メモリ消費の大口」を確認できます。

Kong プラグインのメモリリークを見つけるにはどうすればよいですか?

OpenResty XRay の GC オブジェクト参照フレームグラフは、メモリを保持している参照パスと、オブジェクト型やサイズを示します。あるプラグインのメモリが増え続けているとき、このグラフはリークしている参照パスを特定します。再起動もコード変更も不要です。RSS 曲線からソース行までをたどる詳しい手法は本番環境でのメモリリーク検出ワークフローをご覧ください。

どの Kong プラグインが最も CPU を消費しますか?

これも推測ではなく実測が肝心です。サンプリングしたプロセスでは、prometheus プラグインが最も多くの CPU 時間を占め、次いで ip-restriction でした。OpenResty XRay はサンプリングした CPU 時間をロード済みの全プラグインに配分し、その Lua-land CPU フレームグラフは個々のプラグイン内部の具体的なホットコードパスまで掘り下げます。

OpenResty XRay で Kong プラグインを分析すると追加負荷はかかりますか?

サンプリング時に Kong サーバープロセスに加わる追加負荷は通常、無視できるほど小さく、サンプリングしていないときはプロセスが完全なフルスピードで動作します。OpenResty XRay は非侵襲的で、Kong のコードや設定の変更も、特別なプラグインやビルドオプションも必要ありません。

今後の展開

私たちはここで立ち止まるつもりはありません。OpenResty XRay をさらに強力で有用なものにするための計画がまだまだあります。現在開発中の機能には以下のようなものがあります:

  • Kong の異なるプラグイン間のディスク I/O、ネットワーク I/O、その他のリソースメトリクスのリアルタイム分布を表示します。これにより、システム内のボトルネックやホットスポットを特定し、それに応じて最適化することができます。
  • 他の技術スタックやオープンソースソフトウェアのサポート。OpenResty XRay を、基盤となる技術に関係なく、あらゆるオンラインアプリケーションを分析できる汎用ツールにしたいと考えています。検討中の対象には、Nginx モジュール、Envoy 拡張機能、PostgreSQL 拡張機能、Perl/Python/Ruby モジュールやライブラリなどがあります。

追加のメトリクスや機能に関するご提案やご要望がありましたら、ぜひお聞かせください。私たちは常にお客様のフィードバックに耳を傾け、お客様のニーズに応えるために製品を継続的に改善しています。

結論

本記事では、OpenResty XRay を使用してサーバープロセス内の Kong プラグインの CPU とメモリ使用状況を分析する方法をご紹介しました。また、結果の例をお示しし、その意味を説明しました。

OpenResty XRay を使用することで、どのプラグインが他のプラグインよりも多くのリソースを消費しているか、そして全体的なパフォーマンスにどの程度影響を与えているかを簡単に見つけ出すことができます。そして、この情報を使用して Kong サーバーを最適化し、より高速かつスムーズに動作させることができます。

OpenResty XRay 製品についてさらに詳しく知りたい方、またはオンラインアプリケーションの他の側面でどのように役立つかについて知りたい方は、弊社のウェブサイトをご覧いただくか、お問い合わせください。詳細な情報をご提供いたします。

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(マイクロサービスおよび分散トラフィックに最適化された多機能ゲートウェイソフトウェア)は、世界中の多くの上場企業および大企業から高い評価を得ております。OpenResty 以外にも、章亦春は Linux カーネル、Nginx、LuaJITGDBSystemTapLLVM、Perl など、複数のオープンソースプロジェクトに累計 100 万行以上のコードを寄与し、60 以上のオープンソースソフトウェアライブラリを執筆しております。

翻訳

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