OpenResty XRay がどのようにしてアプリケーションの問題特定と効率化を支援するかをご覧ください。

詳細はこちら LIVE DEMO

要約: OpenResty Inc. のチームは、商用製品 OpenResty XRay動的トレーシング技術を活用し、B 站(ビリビリ動画)の「2021.07.13 我々はこのように崩壊した」という記事で説明された重大なオンライン障害に介入した後、短時間で B 站のオンラインサービスが利用不可能になった根本原因を特定し、重大なオンライン障害の解決を支援しました。

OpenResty XRay Robots

B 站(Bilibili.com)は最近、昨年の大規模障害をまとめた記事「2021.07.13 我々はこのように崩壊した」を発表しました。この記事は公開後、広く注目を集め、議論を呼びました。OpenResty に関心を持つ多くの方々も、より詳細な情報を知りたいと私たちに連絡してきました。そこで、この記事を通じて OpenResty の視点からこの事象の解決プロセスを再現し、私たちが使用した技術的手段とツールについて、興味を持つより多くの技術者の皆様にご紹介したいと思います。

これまで私たちは製品と技術開発に専念し、外部に技術や製品を紹介する機会が比較的少なかったです。この記事は、私たちの一連の共有の始まりでもあり、より多くの企業に OpenResty XRay 製品とサービスを知っていただき、それによってより多くの企業がさまざまなオンライン問題を発見し、迅速に解決できるようにすることを目的としています。

障害の説明

背景:B 站はオープンソースの OpenResty を基に、独自の内部ゲートウェイシステムを開発しました。

障害現場:B 站のすべてのオンラインサーバーの OpenResty プロセスが常に CPU 使用率 100% を示していましたが、リクエストを処理できない状態でした。再起動しても回復せず、最近のビジネスコードの変更をロールバックしても回復しませんでした。すべてのサーバーでこの問題が発生していました。

CPU All 100%

B 站は私たちの OpenResty XRay 製品の商用顧客です。OpenResty XRay は、動的トレーシング技術に基づくシステム障害診断とパフォーマンス最適化ソフトウェアです。障害発生からしばらくして、B 站の運用チームが私たちに連絡し、オンラインの深刻な問題の分析を支援してほしいと要請しました。

事故分析プロセス

まず、OpenResty XRay 製品によってオンラインで自動サンプリングされた C 言語レベルの CPU フレームグラフを通じて、OpenResty の nginx プロセスのほぼすべての CPU 時間が Lua コードの実行に費やされていることを確認しました。

C-Land CPU Flame Grahp for Bilibili

顧客のプライバシー保護とデータセキュリティの観点から、この図では OpenResty オープンソースソフトウェアの関数フレームのみを表示し、Bilibili 社独自の Lua コードに関連する情報は隠されています。

次に、OpenResty XRay によって自動サンプリングされた Lua 言語レベルの CPU フレームグラフを通じて、ほぼすべての CPU 時間が単一の Lua コードパスに費やされていることを確認しました。そのLua コードパスで無限ループが発生しているように見えました。Lua CPU フレームグラフは、Lua コードパスをコード行レベルまで正確に特定することができます。

Lua-Land CPU Flame Graph for Bilibili

同様に、機密性の低いオープンソースコードの関数フレームのみを保持しています。

Bilibili 社の原文で言及されている Lua フレームグラフは、OpenResty XRay が Bilibili 社の本番サーバー上で問題のある OpenResty サービスプロセスをサンプリングして得たものです。

OpenResty XRay が Bilibili 社のオンライン環境でフレームグラフを生成するのに要した時間は数十秒から数分程度でした。100% 非侵襲的な動的トレース技術を使用しているため、Bilibili 社のプロセスやアプリケーションに一切の変更を加える必要がありませんでした。

Lua フレームグラフに基づき、根本的な問題は Bilibili 社のビジネスロジックが設定メタデータに文字列型の重み値 0(つまり “0”)という不適切なデータを書き込んでいたことであると最終的に確認されました。一方、OpenResty の lua-resty-balancer ライブラリの Lua API は数値型の重み値を期待していたため、無限再帰と無限ループが発生しました。

LuaJIT のジャストインタイム(JIT)コンパイラにはバグはありませんでした。当初 JIT コンパイラの問題が疑われたのは、対応する Lua コードパスに一見問題がなく、同時に Bilibili 社の別のビジネスチームが報告していなかった操作がオンラインサービスに影響を与えていたためです。文字列の「0」と数値の 0 の違いは非常に微妙です。最終的に、JIT コンパイラのバグの可能性を排除し、文字列「0」が根本原因であると特定しました。

事故後の修正と強化

Bilibili 社はビジネスレベルで、文字列型のアップストリームサーバーの重み値が設定データに書き込まれないよう確保しました。

OpenResty XRay の新バージョンでは、Lua 呼び出しスタック上のすべてのローカル変数の値を出力する新機能も提供されており、同様の問題をより迅速かつ直接的に特定することができます。

事後に、我々はオープンソースの OpenResty の lua-resty-balancer ライブラリに対して、このような API の誤用に対する特別な強化を行い、誤って渡された文字列型の重み値が常に数値型に強制変換されるようにしました。

OpenResty XRay 製品とサービス

OpenResty XRay は、OpenResty Inc. 社が提供する非侵襲型のオンラインソフトウェア分析システムで、OpenResty Inc. チームが大幅に強化した動的トレース技術に基づいています。現在、OpenResty、Nginx、LuaJIT、PHP、Python、Perl、Go、PostgreSQL、Redis などの様々なオープンソースソフトウェア、およびこれらのオープンソースソフトウェア上で動作する顧客のビジネスコードに対して、自動的に深い分析と監視を行うことができます。将来的には、Java や Ruby などを含む、さらに多くの技術スタックのサポートを順次追加していく予定です。ユーザーは OpenResty XRay を使用することで、様々なパフォーマンス問題、機能的問題、セキュリティ問題を迅速に発見し、正確に特定することができ、アプリケーションの安定性を確保することができます。

OpenResty XRay の正確な問題特定とトラブルシューティングは、顧客のアプリケーションに一切の変更を加えることなく、特別なプラグインやモジュール、コンパイルオプションを追加する必要もなく、顧客のプロセス空間にコードを注入することもありません。同時に、顧客の既存の未修正の Docker や Kubernetes(K8s)コンテナを透過的に分析し、コンテナ内の様々なアプリケーションを分析することもできます。

Bilibili 社以外にも、OpenResty XRay は Zoom、Microsoft、Qunar.com など多くの企業のオンライン環境で、高 CPU 使用率のスパイクから高メモリ使用率、メモリリーク、異常なリクエスト遅延、高ディスク IO など、様々な実際のオンライン問題の特定と最適化に成功してきました。

OpenResty XRay は、多くの問題を自動的に追跡し、分析・推論して、問題の根本原因を特定することもサポートしています。

OpenResty Console Screenshot

結び

事故は最終的に完璧に解決され、Bilibili.com 社が当社の製品と技術を信頼し、支援してくださったことに感謝申し上げます。OpenResty XRay についてさらに詳しく知りたい方、また試用版をお申し込みいただける方は、OpenResty XRay の製品ページをご覧ください。

OpenResty XRay で使用されている Lua 言語レベルの CPU フレームグラフツールについては、こちらの日本語チュートリアルでご紹介しています。OpenResty XRay では、拡張された独自の動的トレース技術を使用しています。ご興味のある方は、年初に執筆した以下のシリーズ記事をご参照ください:Y 言語

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

翻訳

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