本チュートリアルでは、OpenResty XRay を使用してオンライン Go アプリケーションのディスク I/O 高負荷問題を定量的に分析する方法をご紹介いたします。OpenResty XRay が生成する Go レベルのディスク読み書き回数、遅延、およびスループットのフレームグラフを通じて、ディスク読み書きの遅延が最も長く、データ量が最も多い Go コードパスを特定することができます。さらに、具体的な Go コードの行まで特定することで、問題の所在を迅速に特定し、最適化の指針を得ることができます。

問題:ディスク I/O の高負荷

OpenResty XRay の Dashboard 上で、chat-service という名前の Go アプリケーションがディスクに頻繁な読み書きを行っていることが確認されました。

go-high-disk-io.png

まず、ps コマンドを実行してこのアプリケーションを確認します。

Screenshot

完全なコマンドラインを確認することができます。

Screenshot

問題のある Rust コードパスの特定

OpenResty XRay を使用して、こプロセスを検査することができます。システムはリアルタイムで分析を行い、具体的な原因を特定します。

OpenResty XRay の Web コンソールに移動します。

Screenshot

現在分析中のマシンが正しいことをご確認ください。

Screenshot

正しくない場合は、リストから再選択することができます。

Screenshot

「Guided Analysis」ページに進みます。

Screenshot

ここでは、システムが分析可能な様々な種類の問題を閲覧できます。

Screenshot

「High disk IO」を選択します。

Screenshot

「Next」をクリックします。

Screenshot

chat-service という名前の Go アプリケーションを選択します。

Screenshot

これは先ほど ps で確認したものです。

Screenshot

正しいアプリケーションのタイプを確認してください。通常、デフォルト値が適切です。

Screenshot

ここでの言語レベルは 「Go」 のみとなっています。

Screenshot

最長分析時間を設定することも可能です。ここではデフォルトの 300 秒のままにします。

Screenshot

分析を開始します。

Screenshot

システムの分析は継続的に複数回実行します。現在、初回の分析を実行中です。

Screenshot

初回の分析が完了し、現在 2 回目のラウンドに入っております。この例では、1 回の分析で十分です。

Screenshot

分析を停止します。

Screenshot

これは、システムがこの分析のためのレポートを生成していることを示しています。

Screenshot

自動生成された分析レポートをご確認しましょう。

Screenshot

これが分析対象の問題タイプ、「Disk I/O」です。

Screenshot

これはディスク書き込み操作回数の分析結果です。

Screenshot

このコードパスがディスク書き込み操作を最も多く行っています。

Screenshot

syscall.read 関数はファイルディスクリプタからデータを読み取ります。

Screenshot

http.serveFile 関数はファイルを HTTP レスポンスとして送信します。

Screenshot

クリックしてさらに詳細を確認します。

Screenshot

download.Handler はファイルのダウンロードを処理します。これはビジネスロジック関数です。

Screenshot

handleHTTPRequestgin フレームワークの中核となる関数で、主に HTTP リクエストを処理します。gin は Go 言語で書かれた高性能な HTTP Web フレームワークです。

Screenshot

このホットコードパスは、Go レベルのディスク読み取り回数フレームグラフから自動的に導き出されたものです。

Screenshot

以下は問題に関するより詳細な説明と提案です。

Screenshot

download.Handler 関数について言及しています。

Screenshot

これは HTTP リクエストとレスポンスを処理しています。

Screenshot

また、http.serveFile 関数についても言及しています。

Screenshot

これはファイルを HTTP レスポンスとして送信します。

Screenshot

元のコードパスに戻りましょう。この関数の緑色の枠にマウスを合わせてください。

Screenshot

ツールチップにこの関数のソースファイル名とフルパスが表示されます。

Screenshot

このソースコードの行番号は 25 です。

Screenshot

このアイコンをクリックして、この関数のソースファイルパスをコピーします。

Screenshot

vim エディタでソースファイルを開きます。先ほどコピーしたファイルパスを貼り付けてください。お好みのエディタをご使用いただいて構いません。

Screenshot

OpenResty XRay が提案したように、25 行目を確認します。

Screenshot

この関数はファイルの内容を HTTP レスポンスとしてクライアントに返します。これらの静的ファイルを提供するために、Go アプリケーションの代わりに nginx のような Web サーバーを使用することをお勧めします。

Screenshot

先ほどレポートで確認したように、このコード行は Handler 関数内部にあります。

Screenshot

これはディスク読み取り遅延の分析です。

Screenshot

このコードパスが先ほど分析したコードパスと同じであり、ファイルのダウンロードを処理していることがわかります。

Screenshot

これがディスク読み取り遅延の全ての原因となっています。

Screenshot

これはディスク読み取りスループットの分析です。

Screenshot

これもファイルのダウンロードを処理するパスです。

Screenshot

このパスの読み取り速度は約 3 MB/秒に近いです。

Screenshot

これは最も読み取りの多いファイルの分析です。

Screenshot

最も読み取りの多いファイルは 188.jpg です。

Screenshot

その読み取り速度は 417 KB/秒に達しています。

Screenshot

これらは累積読み取り遅延が最も長いファイルです。

Screenshot

遅延が最も長いファイルは 188.jpg です。

Screenshot

遅延の割合は 36% です。

Screenshot

これはディスク書き込み操作回数の分析です。

Screenshot

ディスクの書き込み操作は全てこのコードパスに由来しています。

Screenshot

これは gin パッケージ内のリクエストアクセスログを記録するための関数です。

Screenshot

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

翻訳

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