OpenResty XRay を使用した Go コードにおけるディスク I/O 高負荷のオンラインでの迅速な特定方法
本チュートリアルでは、OpenResty XRay を使用してオンライン Go アプリケーションのディスク I/O 高負荷問題を定量的に分析する方法をご紹介いたします。OpenResty XRay が生成する Go レベルのディスク読み書き回数、遅延、およびスループットのフレームグラフを通じて、ディスク読み書きの遅延が最も長く、データ量が最も多い Go コードパスを特定することができます。さらに、具体的な Go コードの行まで特定することで、問題の所在を迅速に特定し、最適化の指針を得ることができます。
問題:ディスク I/O の高負荷
OpenResty XRay の Dashboard 上で、chat-service
という名前の Go アプリケーションがディスクに頻繁な読み書きを行っていることが確認されました。
まず、ps
コマンドを実行してこのアプリケーションを確認します。
完全なコマンドラインを確認することができます。
問題のある Rust コードパスの特定
OpenResty XRay を使用して、こプロセスを検査することができます。システムはリアルタイムで分析を行い、具体的な原因を特定します。
OpenResty XRay の Web コンソールに移動します。
現在分析中のマシンが正しいことをご確認ください。
正しくない場合は、リストから再選択することができます。
「Guided Analysis」ページに進みます。
ここでは、システムが分析可能な様々な種類の問題を閲覧できます。
「High disk IO」を選択します。
「Next」をクリックします。
chat-service
という名前の Go アプリケーションを選択します。
これは先ほど ps
で確認したものです。
正しいアプリケーションのタイプを確認してください。通常、デフォルト値が適切です。
ここでの言語レベルは 「Go」 のみとなっています。
最長分析時間を設定することも可能です。ここではデフォルトの 300 秒のままにします。
分析を開始します。
システムの分析は継続的に複数回実行します。現在、初回の分析を実行中です。
初回の分析が完了し、現在 2 回目のラウンドに入っております。この例では、1 回の分析で十分です。
分析を停止します。
これは、システムがこの分析のためのレポートを生成していることを示しています。
自動生成された分析レポートをご確認しましょう。
これが分析対象の問題タイプ、「Disk I/O」です。
これはディスク書き込み操作回数の分析結果です。
このコードパスがディスク書き込み操作を最も多く行っています。
syscall.read
関数はファイルディスクリプタからデータを読み取ります。
http.serveFile
関数はファイルを HTTP レスポンスとして送信します。
クリックしてさらに詳細を確認します。
download.Handler
はファイルのダウンロードを処理します。これはビジネスロジック関数です。
handleHTTPRequest
は gin
フレームワークの中核となる関数で、主に HTTP リクエストを処理します。gin
は Go 言語で書かれた高性能な HTTP Web フレームワークです。
このホットコードパスは、Go レベルのディスク読み取り回数フレームグラフから自動的に導き出されたものです。
以下は問題に関するより詳細な説明と提案です。
download.Handler
関数について言及しています。
これは HTTP リクエストとレスポンスを処理しています。
また、http.serveFile
関数についても言及しています。
これはファイルを HTTP レスポンスとして送信します。
元のコードパスに戻りましょう。この関数の緑色の枠にマウスを合わせてください。
ツールチップにこの関数のソースファイル名とフルパスが表示されます。
このソースコードの行番号は 25 です。
このアイコンをクリックして、この関数のソースファイルパスをコピーします。
vim エディタでソースファイルを開きます。先ほどコピーしたファイルパスを貼り付けてください。お好みのエディタをご使用いただいて構いません。
OpenResty XRay が提案したように、25 行目を確認します。
この関数はファイルの内容を HTTP レスポンスとしてクライアントに返します。これらの静的ファイルを提供するために、Go アプリケーションの代わりに nginx のような Web サーバーを使用することをお勧めします。
先ほどレポートで確認したように、このコード行は Handler
関数内部にあります。
これはディスク読み取り遅延の分析です。
このコードパスが先ほど分析したコードパスと同じであり、ファイルのダウンロードを処理していることがわかります。
これがディスク読み取り遅延の全ての原因となっています。
これはディスク読み取りスループットの分析です。
これもファイルのダウンロードを処理するパスです。
このパスの読み取り速度は約 3 MB/秒に近いです。
これは最も読み取りの多いファイルの分析です。
最も読み取りの多いファイルは 188.jpg
です。
その読み取り速度は 417 KB/秒に達しています。
これらは累積読み取り遅延が最も長いファイルです。
遅延が最も長いファイルは 188.jpg
です。
遅延の割合は 36% です。
これはディスク書き込み操作回数の分析です。
ディスクの書き込み操作は全てこのコードパスに由来しています。
これは gin
パッケージ内のリクエストアクセスログを記録するための関数です。
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(マイクロサービスおよび分散トラフィックに最適化された多機能
翻訳
英語版の原文と日本語訳版(本文)をご用意しております。読者の皆様による他の言語への翻訳版も歓迎いたします。全文翻訳で省略がなければ、採用を検討させていただきます。心より感謝申し上げます!