本記事はHarshit Agarwal氏 と Gary Little氏がNutanix.Devに2022年4月20日に投稿した記事の翻訳版です。
原文はこちら。
はじめに
Nutanix分散型ファイルシステム(NDFS)上では、仮想ディスク(vDisk)はクライアント(仮想マシンまたはコンテナ)がディスクの形態で利用できる、フラットな論理ストレージ空間です。このようなvDiskが各ノード上に複数存在し、I/Oを行うことで、クラスタの全リソースを効率的に利用できるようにシステムが設計されています。ですが、ユーザーのワークロードが、複数の仮想ディスク(vDisk)にまたがらない場合もあります。例えば、顧客がNutanixのハイパーコンバージド・プラットフォームに少数の巨大ボリュームを持つレガシー3層構成から移行したい場合、利用できるリソース(CPU、ディスク帯域、メモリ)があっても、ストレージサービスは最大のパフォーマンスを提供できない可能性があります。このようなユースケースは、リフト&シフトのワークロードに限らず、以下のシナリオでも単一仮想ディスク(Single vDisk)のパフォーマンスが重要である考えてきました。
- アプリケーションが複数ディスクの使用をサポートしていない場合。
- PoC時のベンチマーク・シナリオで、従来のシステムとNutanix HCIの仮想ディスクのパフォーマンスを比較する場合。
課題
AOSのストレージは、Stargateと呼ばれる各々の仮想ディスク(vDisk)に対してコントローラーを保持するプロセスですべてのI/Oを管理しています。ワークロードでランダムにデータの読み取りを実行している間に、仮想ディスク(vDisk)コントローラは、CVM内の使用可能なCPUのキャパシティをすべて利用することはできず、単一のCPUへ制限されていました。仮想ディスクコントローラーは、設計段階でシングルスレッドとなっています。これによって、仮想ディスクコントローラーのコードをシンプルなまま、効率的に、vDiskをロック状態にすることなく、全てのデータ構造にアクセスできるからです。システム全体としての性能はvDiskの数によって拡張されますが、1台のvDiskの性能自体は単一のCPUコア/スレッドの性能によって制限されます。
ソリューション
この課題を克服するためには、単一仮想ディスク(Single vDisk)操作の処理に必要なコンピュートリソースを追加するか、もしくは、これらの操作で利用されるCPUの総量を減らす必要がありました。今回のケースでは、その両方を行いました。AOS 6.1では、コンピュートリソースを増やすために、複数のスレッドが同一のコントローラ・オブジェクトによって動作するのではなく、複数のコントローラでそれぞれ1つのスレッドを使用する方法を選びました。この方法によって、ほぼすべてのコントローラの状態において、単体スレッドの保証を維持しています。そして、共通の状態だけが共有・アクセスが行われ、その際にはアクセスの種類に応じて読み取りまたは書き込みをカスタムロックインターフェイスを通じて行います。Nutanix独自のI/Oレンジ(I/Oの分割幅)は、オフセットに基づいてこれらのコントローラに効果的に分散させ、仮想ディスク(vDisk)を水平分割(シャーディング)します。I/O分散アプローチは、ストレージシステムにおいてはとても一般的ですが、これらのレンジが対応するシャードに関連付けないというNutanixのアプローチはユニークです。この設計により、シャード/コントローラの数は完全に動的なものになります。
外部コンポーネントは、1つのコントローラとのみ通信するので、通常の仮想ディスク(vDisk)と同じインターフェースとAPI構成を維持します。すべての変更は、仮想ディスク(vDisk)コントローラ層内にカプセル化されています。外部と相対するコントローラはプライマリコントローラに指定され、実際にI/Oを実行するn個のシャードコントローラに、I/Oを分散させる役割を果たします。
前述したように、vDiskのシャードやコントローラの数は、データ移行やメタデータの更新の必要なく、vDiskのライフサイクルが存続する間は動的に変化することが可能です。このため、与えられたワークロードを処理するために必要なコンピュートリソースの総量に基づいて、コントローラを追加または削除することができます。コントローラの数が変更されるたびに、レンジは対応するコントローラに対して自動的に再配置されます。レンジを重複することなく水平分割し続けることで、I/Oパスで必要なロック、特に様々なコントローラ間で共有される状態でのロックを最小化することができ、コントローラ数に応じて、性能を直線的に向上させることができます。
必要に応じて仮想ディスク(vDisk)に多くのリソースを取らせる一方、I/Oパスに物理CPU使用率を追跡する機能を追加し、フレームグラフなどのCPUプロファイリングツールを使用してボトルネックを特定することで、I/Oパスをより効率化させました。各プロファイリングツールを使って、いくつかのCPUホットスポットを特定し、それを修正し、またプロファイリングを実行して次のホットスポットを特定する、という作業を何度も繰り返しました。期待通り、この繰り返しで、シャード化(データが分割)された場合の仮想ディスク(vDisk)の性能だけでなく、通常の仮想ディスク(vDisk)の場合の性能も改善することができました。
パフォーマンス
ベンチマークの結果は、このソリューションの価値を示しています。当社のお客様の多くは、シングルディスクが一般的な構成であるSQL Serverを導入運用しているため、通常行うストレージ性能マイクロベンチマークにSQL Serverベンチマークを追加しました。
Nutanixとして、理想的には、細かいランダムな読み取りのワークロードのパフォーマンスを向上させたいと考えています。その理由は:
- (SQL Serverによる一般的な読み取り形式は、)多くのデータベースワークロードの普遍的なパターンとなっています。たとえば、最新のトランザクションTPCベンチマーク仕様であるTPC-Eでは、R:Wの比率が約9:1となっています。
- 細かいランダムな読み取りは、I/Oサイズが非常に小さく、与えられたI/Oに対して大きな固定CPU部分があるため、コンピュート上のの感度を高められます。言い換えれば、1MBを移動するのと4KBを移動するのはほぼ同じCPU量を必要とするので、例えるなら、1GBを4KBのチャンクで移動するのは、256Kのチャンクで移動するよりもはるかに多くのCPUを必要とします。アクセスパターンが予測できない(ストレージから見るとランダムな)ので、効率を上げるためにプリフェッチのトリックを使うことはできません。
CPU効率と規模を向上させるという水平分割(シャーディング)の目標は、予想通り、8KBのランダムな読み取りのワークロードで172%の改善が見られました。
また、マイクロベンチマークの成果がアプリケーションの性能向上につながっていることも確認したいと考えました。そこで、HammerDBとMicrosoft SQL Serverを使用したI/O集中型データベースワークロードのトランザクション性能の向上と、単一ドライブに格納されたデータベースのリストア時間の両方を測定しました。
仮想ディスク(vDisk)シャーディングでAOSリリースを使用した場合、トランザクションレートは78%向上し、リストアプロセスは32%高速化されました。
まとめ
幅広く導入展開されたアプリケーションにおいて、単一仮想ディスク(Single vDisk)のワークロードでこれだけ一目瞭然のパフォーマンス向上を直接確認できたのは素晴らしいことです。このような性能向上で効率とスケールの両方を同時に改善できたのです。