データ シリーズ: Windows Azure のドライブ、ディスク、イメージについて
このポストは、6 月 27 日に投稿された Data Series: Exploring Windows Azure Drives, Disks, and Images の翻訳です。
Windows Azure 仮想マシンのプレビュー版では、Windows Azure 仮想マシン ディスクおよび Windows Azure 仮想マシン イメージという、2 種類の特殊な Blob が Windows Azure ストレージに格納されています。もちろん、この他に既存の Windows Azure Drive (英語) のプレビュー版もあります。本稿では、これらをそれぞれ、ストレージ、ディスク、イメージ、ドライブと呼ぶことにし、ドライブ、ディスク、イメージがそれぞれどのようなものであるか、またストレージとどのような関係であるかを説明します。
仮想ハードドライブ (VHD)
ドライブ、ディスク、イメージはいずれもユーザーのストレージ アカウント内にページ Blob として格納されている VHD ( 英語 ) ですが、実際には VHD 形式 (英語) がそれぞれ、固定、ダイナミック、差分であるという細かい違いがあります。現在のところ、Windows Azure でサポートされている形式は "固定" のみです。この形式の場合、論理ディスクが固定ファイル形式で線形に配置されます。このため、オフセットが X の Blob の場合、ディスクのオフセットは X として格納され、この Blob の末尾には VHD のプロパティが記録された小さいフッターが付属します。ページ Blob への格納はすべて標準の VHD 形式で実行されるため、この VHD は必要に応じてオンプレミスのサーバーにマウントすることができます。ほとんどの場合、ディスクには未使用領域がかなりあるため、固定形式ではディスク容量が必要以上に使用されることがよくあります。しかし、"固定" ディスクであると共に "拡張可能な" ディスクであるという 2 つのメリットが同時に得られるため、"固定" VHD は疎なフォーマットであるページ Blob (英語) として格納されています。
VHD の Windows Azure ストレージへのアップロード
VHD はストレージ アカウントにアップロードし、PaaS または IaaS として使用することができます。VHD をストレージにアップロードする際には、ページ Blob がスパースであるという特性を認識し、かつ実際にデータが格納されている VHD のみをアップロードするツールを使用することをお勧めします。また、ダイナミック VHD を使用している場合は、アップロード時にダイナミック VHD から固定 VHD への変換を実行するツールを使用するのがお勧めです。Windows Azure SDK (英語) の一部として提供されている CSUpload には、この両方の機能が備わっています。
永続性と耐久性
ドライブ、ディスク、イメージはすべてストレージに格納されるため、仮想マシンを別の物理マシンに移動してもデータは保持されます。Windows Azure ストレージでは、ディスクまたはドライブに対する書き込みのうち、バッファーしておらず、フラッシュ済みのデータはストレージ内で 3 つに複製され、その後アプリケーションに処理が正常に終了したことが返されます。このように、Windows Azure ストレージは耐久性の高い構造になっており (英語)、データはこの仕組みによって守られます。
ドライブ (PaaS)
ドライブは PaaS のロール (ワーカー ロール、Web ロール、および VM ロール) で使用されるもので、VHD をマウントし、ドライブ文字を割り当てることができます。ドライブの使用方法の詳細については、こちら (英語) を参照してください。ドライブは、ユーザーの仮想マシン内で実行されているカーネル モード ドライバーを使用して実装されています。このため、仮想マシン内のドライブでディスク I/O が発生すると、仮想マシンと Windows Azure ストレージ内のページ Blob との間でネットワーク I/O が発生します。以下の図は、仮想マシン内で実行されているドライバーが仮想マシンの仮想ネットワーク アダプター経由でストレージと通信を行っている様子を示したものです。
PaaS のロールでは、1 ロールあたり最大 16 台のドライブをマウントできます。
ディスク (IaaS)
Windows Azure 仮想マシンを作成すると、このプラットフォームによって少なくとも 1 つのディスクが仮想マシンにアタッチされ、オペレーティング システム用のディスクとして使用されます。このディスクは、ストレージ内にページ Blob として格納された VHD です。仮想マシン内のディスクに書き込みを行った場合、ディスクの内容の変更は、ストレージ内のページ Blob の内容を変更することにより実行されます。仮想マシンにはディスクを追加してアタッチ (英語) することが可能で、データ ディスクとして使用できます。このディスクも同様に、ページ Blob としてストレージ内に格納されます。
ドライブとは異なり、ユーザーのディスクの代役を務めるストレージと通信を行うコードは、仮想マシン内に存在しているわけではありません。このため、ディスク I/O が発生した場合、ネットワーク アクティビティは物理ノードでは発生しますが、仮想マシンでは発生しません。以下の図は、ホスト OS 上でドライバーが動作する様子、および仮想マシンがディスク インターフェイス経由でドライバーと通信を行い、さらにホストのネットワーク アダプター経由でストレージと通信を行う様子を示したものです。
仮想マシンがマウント可能なディスクの数には上限があります。XL の仮想マシンではデータ ディスクを最大 16 台、XS の仮想マシンではデータ ディスク 1 台をマウント可能です。詳細については、こちら (英語) を参照してください。
重要 : Windows Azure プラットフォームは、ストレージ アカウント内でディスクとして使用されているすべてのページ Blob について、リースを無限に保持します。これは、仮想マシンが VHD を使用中に、誤って基礎となるページ Blob、コンテナー、またはストレージ アカウントが削除されることを防ぐためです。基礎となるページ Blob、その格納元のコンテナーまたはストレージ アカウントを削除する場合は、まず下の画面で仮想マシンからのディスクのデタッチを選択します。
次に、デタッチするディスクを選択し、削除を実行します。
その後、ポータルからディスクを削除する必要があります。
最後に、ウィンドウ下部の [DELETE DISK] を選択します。
注意: ディスクの削除を実行しても、ストレージ アカウント内のディスク (VHD のページ Blob) は削除されません。この操作では、Windows Azure 仮想マシンで使用可能なイメージとの関連付けが解除されるだけです。上記の操作をすべて実行した後に Windows Azure ストレージの REST API またはストレージ エクスプローラーを使用すると、ストレージ アカウントからディスクを削除できます。
イメージ (IaaS)
Windows Azure では、テンプレートの VHD を表す "イメージ" という概念が採用されています。これは、1 台以上の仮想マシンを作成するときに使用されるものです。仮想マシンの作成に使用可能なイメージは、Windows Azure および一部のパートナーから提供されています。また、既存の Windows Azure 仮想マシンのイメージをキャプチャ (英語) して、自身が使用するイメージを作成したり、ストレージ アカウントに Sysprep コマンド適用済みのイメージをアップロード (英語) することもできます。イメージも VHD 形式ですが、このプラットフォームがイメージに書き込みを行うことはありません。イメージから仮想マシンを作成する場合、ストレージ アカウント内にそのイメージのページ Blob のコピーが作成されます。このコピーが、仮想マシンのオペレーティング システム ディスクとして使用されます。
重要 : Windows Azure はすべてのページ Blob、Blob コンテナー、ストレージ アカウントについて無限のリースを保持しています。これらはストレージ アカウント内でイメージとして扱われます。このため、基礎となるページ Blob を削除するには、ポータルの [VIRTUAL MACHINES] セクションで [IMAGES] をクリックし、イメージを削除する必要があります。
次にイメージを選択し、画面下部の [DELETE IMAGE] をクリックします。この操作で、VHD と登録済みのイメージ セットの関連付けが解除されます。しかし、この操作では、ページ Blob はストレージ アカウントから削除されません。この場合、上記の操作を実行した後、ストレージ アカウントからイメージを削除する操作を実行します。
一時ディスク
Web ロール、ワーカー ロール、VM ロール、および Windows Azure 仮想マシンには、一時ディスクと呼ばれるディスクが必ず別途存在します。これはノード上の物理ディスクで、スクラッチ領域として使用されます。このディスクに保存されているデータは、仮想マシンを別の物理マシンに移動した場合、保持されません。アップグレード時、修正プログラム適用時、および実行中のノードで Windows Azure が何らかの異常を検出した場合などに、データ損失が発生する可能性があります。提供される一時ディスクの容量については、こちら (英語) を参照してください。
一時ディスクは、オペレーティング システムのページ ファイルの保存場所として最適です。
重要 : 一時ディスクは永続的なものではありません。このディスクに書き込むデータは、いつ失っても構わないものだけにしてください。
課金
Windows Azure ストレージの料金は、帯域幅、トランザクション数、ストレージ容量 (英語) によって決定されます。それぞれのユニットあたりの料金は、こちらを参照してください。
帯域幅
ドライブをマウントする際は、最大限のパフォーマンスを得ると共に帯域幅への課金が発生しないように、ストレージ アカウントが格納されている場所と同じ地域 (US East など) から行うことをお勧めします。ディスクの場合は、ディスクが格納されている場所と同じ地域で使用する必要があります。
トランザクション
仮想マシン接続時、ディスク I/O は、ドライブおよびディスクのいずれからのものでも、ストレージに対して実行されます (その前に、後述のキャッシュの層のいずれかで要求が満たされた場合は、この限りではありません)。小規模なディスク I/O では、1 回の I/O につき 1 つの Windows Azure ストレージ トランザクションが発行されます。大規模なディスク I/O は小さな I/O に分割されるため、複数のトランザクションが発行されます。分割は次の条件で実行されます。
- ドライブ
- 2 MB 未満の I/O の場合、1 つのトランザクションとして処理
- 2 MB 以上の I/O の場合、2 MB 以下のトランザクションに分割して処理
- ディスク
- 128 KB 未満の I/O の場合、1 つのトランザクションとして処理
- 128 KB 以上の I/O の場合、128 KB 以下のトランザクションに分割して処理
オペレーティング システムは、小規模なシーケンシャル I/O (通常は 64 KB 未満) について先読みを実行すること場合がよくあります。この場合、ドライブまたはディスクの I/O サイズが、アプリケーションが発行した I/O のサイズよりも大きくなることがあります。また、プリフェッチされたデータが使用された場合は、アプリケーションが発行した I/O 数よりもストレージ アカウントのトランザクション数が少なくなる場合があります。
ストレージ容量
Windows Azure ストレージにはページ Blob が格納されおり、さらにその中に VHD が疎なフォーマットで格納されています。VHD 内のデータに対する課金は、VHD の使用期間内に実際に書き込みが行われた分だけが対象となります。このため、"クイック フォーマット" のご使用をお勧めしています。クイック フォーマットの場合、ページ Blob 内に存在する大きな領域にゼロが書き込まれることはありません。VHD 作成時に以下のオプションを指定すると、クイック フォーマットを選択できます。
ほとんどのオペレーティング システムは、VHD で使用されているファイル システムでファイルを削除しても、その領域を開放したり、その領域にゼロを格納したりしません。このため、ディスクまたはドライブで削除したデータの Blob 領域に対しても、ストレージ容量に対する課金が続行される可能性があるので注意が必要です。
さまざまなキャッシュ
ドライブとディスクのいずれも、オンディスク キャッシュ、および限定的なメモリ内キャッシュの一部をサポートしています。オペレーティング システムの多くの層でも、アプリケーション ライブラリと同様にメモリ内キャッシュが使用されています。ここでは、アプリケーション開発者が選択可能なキャッシュの種類について説明します。
キャッシュ機能を利用すると、パフォーマンスが向上すると同時に、トランザクション料金を抑えることができます。以下の表は、ディスクおよびドライブで利用可能なキャッシュの一部の概要を示したものです。表の後に、それぞれの詳細な説明があります。
種類 |
目的 |
データの永続性 |
|
FileStream |
メモリ |
パフォーマンスが向上、シーケンシャルな読み書きでの I/O が減少 |
書き込みは自動的には永続化されない。"Flush" を呼び出すと書き込みが永続化される。 |
オペレーティング システムのキャッシュ |
メモリ |
パフォーマンスが向上、ランダム/シーケンシャルな読み書きでの I/O が減少 |
書き込みは自動的には永続化されない。"Write through" ファイル ハンドルまたは "Flush" を使用すると書き込みが永続化される。 |
Windows Azure Drive のキャッシュ |
メモリおよびディスク |
ストレージへの読み取りトランザクションが減少。ワークロードによっては、シーケンシャル I/O のパフォーマンスが向上 |
書き込みは自動的に永続化される。"Write through" ファイル ハンドルまたは "Flush" を使用すると書き込みの永続化を確認可能。 |
Windows Azure 仮想マシン ディスクのキャッシュ |
メモリおよびディスク |
ストレージへのトランザクションが減少。ワークロードによっては、シーケンシャル I/O のパフォーマンスが向上。起動時間が短縮 |
書き込みは自動的に永続化される。"Write through" ファイル ハンドルまたは "Flush" を使用すると書き込みの永続化を確認可能。 |
ディスクまたはドライブでキャッシュを使用しない |
該当なし |
ワークロードによっては、シーケンシャル I/O のパフォーマンスが向上 |
書き込みは自動的に永続化される。"Write through" ファイル ハンドルまたは "Flush" を使用すると書き込みの永続化を確認可能。 |
FileStream (ディスクとドライブの両方に適用)
.NET framework の FileStream クラスでは、読み取りと書き込みの両方がメモリ内でキャッシュされます。この結果、ディスクへの I/O が減少します。FileStream のコンストラクターの一部は、キャッシュ サイズを取得します。その他のコンストラクターは、既定値の 8 KB をキャッシュ サイズとして選択します。キャッシュ サイズの最低値は 8 KB であるため、メモリ キャッシュの使用は必須です。FileStream.Flush(bool) API を呼び出すと、バッファーを強制的にディスクに書き込むことができます。
オペレーティングシステムのキャッシュ ( ディスクとドライブの両方に適用 )
オペレーティング システム自体が、読み書きの実行時にメモリ内でバッファリングを行います。ただし、FILE_FLAG_WRITE_THROUGH または FILE_FLAG_NO_BUFFERING を使用して明示的にこの機能をオフにしている場合は、この限りではありません。Windows のメモリ内キャッシュの動作に関する詳細な説明については、こちら (英語) を参照してください。
Windows Azure Drive のキャッシュ
ドライブでは、読み取りキャッシュとしてノードのローカルの一時ディスクを使用するか、キャッシュをまったく使用しないかのいずれかを選択できます。ドライブのキャッシュに使用する領域は、Web ロールまたはワーカー ロールの一時ディスクから割り当てられます。このキャッシュはライトスルーであるため、書き込みは即座にストレージにコミットされます。読み取りはローカル ディスクまたはストレージのいずれかから実行されます。
ドライブのローカル キャッシュを使用した場合、読み取りでキャッシュの内容が "ヒット" すると、シーケンシャル I/O の読み取りのパフォーマンスが向上します。シーケンシャルな読み取りでキャッシュがヒットするのは、次の場合です。
1.以前に読み取りが実行されていたデータの場合。データが最初に読み取りが実行されたときにキャッシュされています (最初に書き込みが実行されたときではありません)。
2.キャッシュが全データを保持できるほど大きい場合。
Blob へのアクセスでは、ローカル ディスクよりもランダム I/O の方が速い場合があります。しかし、ランダム I/O ではストレージ トランザクション料金が発生します。ストレージへのトランザクション数を削減するために、ランダム I/O 用のローカル ディスク キャッシュを使用することもできます。ランダム I/O によるディスクへの書き込みのサイズが 8 KB で揃えられ、I/O サイズが 8 KB の倍数である場合に、最大のパフォーマンスが得られます。
Windows Azure 仮想マシン ディスクのキャッシュ
仮想マシンの展開時に、OS ディスクのホスト キャッシュを次の 2 種類から選択できます。
1.読み取り/書き込み (既定) - ライトバック キャッシュ
2.読み取り - ライトスルー キャッシュ
仮想マシンにデータ ディスクをセットアップする場合は、ホスト キャッシュを次の 3 種類から選択できます。
1.読み取り/書き込み - ライトバック キャッシュ
2.読み取り - ライトスルー キャッシュ
3.なし (既定)
データ ディスクおよび OS ディスクで使用するキャッシュの種類は、現在のところポータルでは公開されていません。ホスト キャッシュの種類を設定するには、サービス管理 API (Add Data Disk (英語) または Update Data Disk (英語))、あるいは Powershell コマンド (Add-AzureDataDisk (英語) または Set-AzureDataDisk(英語)) のいずれかを使用する必要があります。
読み取りキャッシュは、ホスト OS がディスク上とメモリ内の両方に格納します。書き込みキャッシュは、ホスト OS がメモリ内で格納します。
警告: FILE_FLAG_WRITE_THROUGH (英語) を使用しないアプリケーションでは、ホスト OS のメモリ上に書き込み待ちのデータが格納されているときに予期せず物理マシンがクラッシュすると、書き込みキャッシュのデータが失われる可能性があります。
読み取りキャッシュを使用した場合、読み取りでキャッシュの内容が "ヒット" すると、シーケンシャル I/O の読み取りのパフォーマンスが向上します。シーケンシャルな読み取りでキャッシュがヒットするのは、次の場合です。
1.以前に読み取りが実行されていたデータの場合。
2.キャッシュが全データを保持できるほど大きい場合。
ディスクのキャッシュ サイズは、インスタンスのサイズおよびマウントされているディスクの数によって異なります。キャッシュ機能は、最大で 4 台のデータ ディスクで使用可能です。
Windows Azure Drive および仮想マシンディスクでキャッシュを使用しない
Windows Azure ストレージでは、キャッシュに使用されるユーザーのノード上のローカル ディスクよりも高速なランダム I/O が可能です。アプリケーションがランダム I/O を大量に実行し、同時にスループットが重要である場合、上記のキャッシュを使用しないことが望ましい場合もあります。ただし、この I/O が実行されると Windows Azure ストレージのトランザクション料金が発生するので注意が必要です。ローカル キャッシュへの I/O では料金は発生しません。
Windows Azure Drive のキャッシュを無効にするには、Mount() API の呼び出し時にキャッシュ サイズを “0” に指定します。
仮想マシンのデータ ディスクでは、既定でキャッシュを使用しない設定になっています。データ ディスクのキャッシュが有効になっている場合は、サービス管理 API の Update Data Disk (英語)、または Powershell コマンドの Set-AzureDataDisk (英語) を使用すると無効にできます。
仮想マシンの OS ディスクでは、既定でキャッシュを使用する設定になっています。アプリケーションがデータ ファイルへのランダム I/O を大量に実行する場合は、該当するファイルを、キャッシュ機能を無効化したデータ ディスクに移動するとよい場合もあります。
Andrew Edwards、Brad Calder
データシリーズ