Rust プロセスのディスク I/O が高い原因の特定方法
このチュートリアルでは、OpenResty XRay を使用して、sled-service(Sled 組み込み KV データベースベースの Rust アプリケーション)のディスク I/O 高負荷問題を診断します。Rust レベルのディスク書き込み回数、遅延、およびスループットのフレームグラフにより、ディスクアクティビティが最も集中しているコードパスを特定し、正確なソースファイルと行番号まで追跡します。
ディスク I/O が高い Rust プロセスの特定
まず、ps コマンドを実行してアプリケーションをチェックします。
sled-service という名前の Rust アプリケーションが確認できます。これは Sled という Rust で書かれた組み込み型 KV データベースをベースにしています。
OpenResty XRay を使用して、このアプリケーションのディスクの動作状況を確認しましょう。
フレームグラフで Rust のディスク書き込みホットコードパスを追跡
OpenResty XRay の Web コンソールに移動します。現在分析中のマシンが正しいことをご確認ください。
「Guided Analysis」ページに進みます。
ここでは、システムが分析可能な様々な種類の問題を閲覧できます。
「High disk IO」を選択します。
「Next」をクリックします。
sled-service という名前の Rust アプリケーションを選択します。
この rust プロセスを選択します。
正しいアプリケーションのタイプを確認してください。通常、デフォルト値が適切です。
ここでの言語レベルは 「Rust」 のみとなっています。
最大分析時間を設定することも可能です。ここではデフォルトの 300 秒のままにします。
分析を開始します。
システムの分析は継続的に複数回実行します。現在、初回の分析を実行中です。
初回の分析が完了し、現在 2 回目のラウンドに入っております。この例では、1 回の分析で十分です。
分析を停止します。
自動生成された分析レポートをご確認しましょう。
これが分析対象の問題タイプ、「Disk I/O」です。
これはディスク書き込み操作回数の分析結果です。
このコードパスがディスク書き込み操作を最も多く行っています。
これらの 2 つの __libc_pwrite64 関数は、ファイルの特定の位置にデータを書き込むための C 関数です。
Rust の標準ライブラリにおいて、write_at と write_at_all はどちらもファイルの特定の位置にデータを書き込む関数です。
pwrite_all 関数は、ページ全体のデータをファイルに並列で書き込むことをサポートしています。
write_to_log 関数は、永続的なストレージや他の操作のために、データをログファイルに書き込むために使用されます。
詳細を表示するにはクリックしてください。
このホットコードパスは、Rust レベルのディスク書き込み回数のフレームグラフから自動的に導き出されたものです。
以下は、問題に関するより詳細な説明と提案です。
pwrite64 関数について言及しています。
元のコードパスに戻りましょう。この関数の緑色のボックスにマウスを合わせてください。ツールチップにソースファイル名の完全なパスが表示されます。
このソースコードの行番号は 730 です。
このアイコンをクリックして、この関数のソースファイルパスをコピーしてください。
vim エディタでソースファイルを開きます。ファイル内の Rust コードをご確認ください。お好みのエディタをご使用いただいて構いません。
OpenResty XRay が提案したように、730 行目をチェックします。
pwrite_all 関数は、Sled ライブラリ内でデータをログファイルに書き込むために使用される関数です。その役割は、データブロックをファイルの特定のオフセットにアトミックに書き込むことです。
これはディスク書き込み遅延の分析結果です。
このコードパスはデータベースのデータファイルに書き込みを行っています。
これがディスク書き込み遅延のほぼ全ての原因となっています。
これはディスク書き込みスループットの分析結果です。
データベースのデータファイルに書き込むコードパスと同じです。
書き込み速度は約 12 メガバイト/秒です。
これらは最も頻繁に書き込まれているファイルです。
このファイルの書き込みデータ量が最大です。これは Sled アプリケーションのデータベースファイルです。
その読み取り速度は 6.4MB/秒に達しています。
これらは累積書き込み遅延が最も長いファイルです。
このファイルもまた、データ書き込みの遅延が最も高いファイルです。
遅延の割合は約 40% です。
自動ディスク I/O 分析レポート
OpenResty XRay はオンラインプロセスを自動的に監視し、分析レポートを生成することができます。「Insights」ページに切り替えてください。
「Insights」ページでは、日次および週次の自動レポートをご確認できます。そのため、「Guided Analysis」機能を必ずしも使用する必要はないですが、
その機能はアプリケーションの開発やデモンストレーションに非常に有用です。
OpenResty XRay について
OpenResty XRay は動的トレーシング製品であり、実行中のアプリケーションを自動的に分析して、パフォーマンスの問題、動作の問題、セキュリティの脆弱性を解決し、実行可能な提案を提供いたします。基盤となる実装において、OpenResty XRay は弊社の Y 言語によって駆動され、Stap+、eBPF+、GDB、ODB など、様々な環境下で複数の異なるランタイムをサポートしております。
よくある質問
Rust プロセスのディスク I/O が高いのはなぜですか?
この例では、Sled ベースの sled-service プロセスのディスクアクティビティのほぼすべてが、write_to_log から pwrite_all を呼び出してデータベースのデータファイルに書き込む単一のコードパスに集中しており、OpenResty XRay のフレームグラフがこのパスを直接特定しました。
過剰なディスク書き込みを引き起こしている Rust 関数を見つけるには?
OpenResty XRay のガイド付き分析を実行し、「High disk IO」を選択してターゲットプロセスを指定します。ディスク書き込み回数フレームグラフが生成され、どのコードパスが最も多く書き込んでいるかが表示されます。ホット関数にマウスを合わせると、正確なソースファイルと行番号が表示されます。
ディスク書き込み回数、遅延、スループット分析の違いは?
書き込み回数はコードパスが実行した書き込み操作の回数、遅延はそれらの書き込みがディスクでブロックされた時間、スループットは毎秒の書き込みデータ量を示します。この Sled の例では、3 つの分析すべてがデータベースのデータファイルに書き込む同じコードパスを指し、書き込み速度は約 12 MB/s でした。ファイルレベルでは、最も書き込みの多い単一ファイルが累積書き込み遅延の約 40% を占め、スループットは約 6.4 MB/s でした。
著者について
章亦春(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、LuaJIT、GDB、SystemTap、LLVM、Perl など、複数のオープンソースプロジェクトに累計 100 万行以上のコードを寄与し、60 以上のオープンソースソフトウェアライブラリを執筆しております。
翻訳
英語版の原文と日本語訳版(本文)をご用意しております。読者の皆様による他の言語への翻訳版も歓迎いたします。全文翻訳で省略がなければ、採用を検討させていただきます。心より感謝申し上げます!


































































