Rust の Sled ライブラリ内部で CPU 時間がどのように消費されているか(OpenResty XRay を使用)
このチュートリアルでは、OpenResty XRay を使用して Rust の Sled ライブラリ内の CPU 時間消費を定量的に分析する方法を段階的に示します。CPU を最も消費している Rust コードパスを紹介します。これらのホットコードパスは、OpenResty XRay が Rust 言語レベルの CPU フレームグラフを自動的に分析し解釈した結果です。
問題:高 CPU 使用率
Sled は Rust で書かれた組み込み型 KV データベースです。
私たちは Sled ベースの内部 cache サービスを持っています。
CPU 使用率が非常に高く、100% を超えていることがわかります。
Rust の Sled ライブラリ内の CPU 時間消費を分析
OpenResty XRay を使用して、この未修正のプロセスを検査することができます。システムはリアルタイムで分析を行い、原因を特定します。
現在分析中のマシンが正しいことを確認してください。
正しくない場合は、リストから再選択することができます。
「Guided Analysis」ページに移動します。
ここでは、システムが分析可能な様々な種類の問題を確認できます。
「High CPU Usage」を選択します。
「Next」をクリックします。
先ほどの sled アプリケーション、つまり Rust アプリケーションを選択します。
100% の CPU を消費しているプロセスを選択します。これは先ほど top
で確認したものです。
アプリケーションのタイプが正しいことを確認します。通常、デフォルト値が正しいです。
ここでの言語レベルは「Rust」のみです。
最長分析時間を設定することもできます。ここではデフォルトの 300 秒のままにします。
分析を開始します。
システムは複回数の分析を継続的に実行します。現在、初回の分析を実行中です。
初回の分析が完了し、現在 2 回目のラウンドに入っております。この例では、1 回の分析で十分です。
分析を停止します。
自動生成された分析レポートが表示されます。
これは分析対象の問題タイプである CPU です。
これは CPU 時間を最も消費している Rust コードパスです。
最初の関数 sled::tree::Tree::insert
は Sled でデータを挿入するために使用されます。
「More」をクリックして詳細を表示します。
上記のホットコードパスは、この Rust レベルの CPU フレームグラフから自動的に導き出されたものです。
以下は、現在の問題についてのより詳細な説明と提案です。先ほど見た insert
関数について言及しています。
このアイコンをクリックしてフレームグラフを拡大します。
insert
関数をクリックして詳細を表示します。
左側では、view_for_key
関数が大きな割合を占めていることがわかります。これは Sled ライブラリ内で指定されたキーのスナップショットビューを取得する関数です。
右側では、pagecache が Sled のコンポーネントであり、ページ単位でデータを管理していることがわかります。書き込まれたデータは最初に pagecache のメモリページに保存されます。その後、バッチが満杯になると、ディスクにフラッシュして永続化されます。
クリックして拡大します。
これは Glibc の realloc 関数で、メモリ割り当て関数です。libc のメモリ割り当て関数がホットであることがわかります。
ターミナルで、find
コマンドを使用して cargo キャッシュ内の Sled ライブラリのソースコードディレクトリを検索します。
見つかったディレクトリをコピーし、Sled のソースコードディレクトリに移動します。
元のホットコードパスに戻りましょう。insert
関数の緑色の枠にマウスを合わせます。ツールチップにこの関数のソースファイル名が表示されます。
このソースコードの行番号は 164 です。
このアイコンをクリックして、この関数のソースファイルパスをコピーします。
vim エディタでソースファイルを開きます。先ほどコピーしたファイルパスを貼り付けます。お好みのエディタを使用していただいて構いません。
OpenResty XRay が提案したように 164 行目にジャンプします。
このコード行は insert
関数内にあります。
次に、2 番目のコードパスを見てみましょう。2 番目に CPU 時間を消費しているコードパスで、CPU 時間の約 40% を消費しています。
トップレベルの関数呼び出し get_inner
は、Sled ライブラリ内部でデータを取得するためのインターフェースです。
get
関数はライブラリが外部に公開しているインターフェースで、内部で get_inner
関数を呼び出しています。
「More」をクリックして詳細を表示します。
フレームグラフを拡大して、get_inner
関数呼び出しの詳細を確認します。
get_inner
を拡大します。
get_inner
関数内の CPU 時間の大部分が、先ほど言及した view_for_key
関数に占有されていることがわかります。
Rust の Sled ライブラリでは、sled::lru::Lru::accessed
関数を使用して LRU キャッシュ内のアイテムのアクセス状態を更新し、削除が必要なページ ID のリストを返します。
自動生成レポート
OpenResty XRay はオンラインプロセスを自動的に監視し、分析レポートを生成することができます。「Insights」ページに切り替えてください。
「Insights」ページに切り替えます。
「Insights」ページでは、日次および週次のレポートを確認することができます。したがって、「Guided Analysis」機能を必ずしも使用する必要はありません。
もちろん、「Guided Analysis」はアプリケーションの開発やデモンストレーションに非常に有用です。
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(マイクロサービスおよび分散トラフィックに最適化された多機能
翻訳
英語版の原文と日本語訳版(本文)をご用意しております。読者の皆様による他の言語への翻訳版も歓迎いたします。全文翻訳で省略がなければ、採用を検討させていただきます。心より感謝申し上げます!