記憶域スペースから記憶域ディスクへの書き込み
まず、仮想論理ドライブである記憶域スペースにデータを書き込みする場合、仮想物理ディスクである記憶域プールならびに実際の物理ディスクへの書き込みがどのように行われるかを理解します。
NumberOfDataCopies=1の場合
理解を促進するため、まず単純に記憶域スペースのNumberOfDataCopies=1の場合(Simple,Parity)の場合を、以下のような概念図を用いて説明します。
- 記憶域スペースへのデータの保存
記憶域スペースにデータを保存します。図ではExcelファイルを記憶域スペースに保存する流れを示しています。NumberofDataCopiesの値は1のため、記憶域スペースは1ファイルを記憶域プールに対して保存します。データを保存していく際に、以下の2~4を繰り返します。 -
ストライプへの分割
1つのデータを、実際にディスクに書き込む1トランザクションの単位であるストライプに分割します。1ストライプのサイズは記憶域スペースの属性として指定される 「Interleave × NumberofColumns 」で決定されます。Interleave はデフォルトで256kbとなります。言い換えると、記憶域スペースに保存されるデータは、データサイズ/ストライプサイズに分割されます。 - 1ストライプを1Columnへ分割
ストライプを記憶域スペースの属性として指定されているNumberOfColumnsで分割します。図では3Columnsになります。 - Columnを物理ディスクに書き込み
それぞれのColumnを、物理ディスクに書込みます。これをストライプの数だけ繰り返していきます。このケースでは、NumberOfDataCopies=1,NumberOfColumns=3、ですので、保存したデータは1×3=3台の物理ディスクに跨って書込まれていきます。この絵では、記憶域プール内の物理ディスク数とNumberOfColumnsが一致していますが、例えばNumberOfColumnsは3で記憶域プールに物理ディスクが4つある場合、明示的にPhysicalDisksToUse属性が指定されていない限りは4つの物理ディスクに対してランダムに各Columnを書込んでいくことになります。
NumberOfDataCopies=2の場合
次に、NumberOfDataCopies=2、すなわち双方向ミラーの場合を示します。
- 記憶域スペースへのデータの保存
記憶域スペースにデータを保存します。図ではExcelファイルを記憶域スペースに保存する流れを示しています。NumberofDataCopiesの値は2のため、記憶域スペースは2ファイルを記憶域プールに対して保存します。図ではデータの四角が2つあるのはこの2ファイルを意味しています。データを保存していく際に、以下の2~4を繰り返します。 -
ストライプへの分割
1つのデータを、実際にディスクに書き込む1トランザクションの単位であるストライプに分割します。 - 1ストライプを1Columnへ分割
ストライプを記憶域スペースの属性として指定されているNumberOfColumnsで分割します。図では3Columnsになります。 - Columnを物理ディスクに書き込み
それぞれのColumnを、物理ディスクに書込みます。これをストライプの数だけ繰り返していきます。このケースでは、NumberOfDataCopies=2,NumberOfColumns=3、ですので、保存したデータは2×3=6台の物理ディスクに跨って書込まれていきます。
これは双方向ミラーの例ですが、NumberOfDataCopies=3すなわち3方向ミラーの場合も同様の考え方になり、図の記憶域スペースに保存されるデータが3つになります。
記憶域スペースのパフォーマンス
NumberOfDataCopiesとNumberOfColumnsによって、最低限必要な物理ディスク数が決まる
ここまで示してきたように、記憶域スペースに1つのファイルを保存する際に必要な物理ディスクの最低数は、(NumberOfDataCopies)×(NumberOfColumns)で決定されます。ただし、記憶域スペースにはクォーラムの考え方がありますので、3方向ミラーの場合はこれに関わらず最低5台の物理ディスクが必要となります。
回復性毎の特徴
- Simple : 複数の物理ディスクに跨ってデータが記録されますのでディスクIOのスループットが向上しますが、物理ディスクに1つでも障害が起こるとデータは消失します。
- Mirror:データは2つまたは3つの物理ディスク(NumberOfColumnsが1の場合)に複製されて保存されます。1つまたは2つの物理ディスク障害からもデータは保護されますが、ディスクの使用可能領域は1/2または1/3になります。
- パリティ:データとパリティ情報が物理ディスクを跨って保存されます。ディスクIOの都度パリティ計算が行われるため、パフォーマンス的には不利ですが、1台の物理ディスクからの障害からデータは保護され、信頼性は向上します。ディスクの使用可能領域は1/3~1/8になります(NumberOfColumnsによる)。
InterleaveのサイズとNumberOfColumnsによるパフォーマンスの最適化
記憶域スペースのパフォーマンスに影響を及ぼす要素として、ディスクIOとCPUリソースがあります。ディスクIOの際にパリティ演算が走るパリティはCPUリソースの面からパフォーマンスが低下する傾向にあります。同じ回復性の場合に、記憶域スペースのパフォーマンスを向上させるには、ディスクIOの1単位となるInterleaveのサイズ(デフォルトは256kb)と、書込み先のディスク数であるNumberOfColumnsを適切に設定することで、パフォーマンスの最適化が行えます(ネットワークで例えれば、MTUサイズの調整と、NICチーミングなどによる経路の分散をすることでスループットがあがるということと同じです)。ただし、Interleaveのサイズはアプリケーションの特徴等を考慮して適切に設定しないと逆にボトルネックとなる可能性があるため、よく分からない場合はデフォルトの256kbのままで利用することをお勧めします。
PhysicalDisksToUseの指定によるパフォーマンスの最適化
記憶域スペースは、その属する記憶域プール内の物理ディスクに対してデータを保存していきます。その際の保存先ディスク数はNumberOfColumnsで定められた数になります。1ストライプの書込み毎に、記憶域プール内のディスクからある一定の法則に従ってNumberOfColumns数分のディスクを選び出し、そのディスクに対して書き込みを行っていきます。
ここで問題となるのが、同一記憶域プールの中に、パフォーマンスの異なる物理ディスクが存在している場合です。たとえば、HDDとSSDが存在している場合、HDDの性能がボトルネックとなる場合があります。このような場合は、予めHDDとSSDで記憶域プール自体を分けてしまうか、もしくは記憶域スペース毎に利用する記憶域プール内の物理ディスクを明示的に指定することで、パフォーマンスの調整が出来ます。
たとえば、FriendlyName が “FNStoragePool”の記憶域プールに、物理ディスクが合計4台、それぞれHDD1,HDD2,SSD1,SSD2 が存在している場合に、この記憶域プールの上に作成するFriendlyName “FNStorageSpace”の記憶域スペースが利用する物理ディスクをSSD1,SSD2に限定したい場合は、PowerShellから例えば以下のようなコマンドを利用して記憶域スペースを作成します。
$SSDs = "SSD1","SSD2" New-VirtualDisk -FriendlyName FNStorageSpace -ResiliencySettingName Mirror -PhysicalDiskstoUse (Get-Physicaldisk $SSDs) -size 1TB -ProvisioningType Thin -StoragePoolFriendlyName FNStoragePool
このように-PhysicalDiskToUse属性を付けて作成した記憶域スペース FNStorageSpaceと、付けずに作成した記憶域スペース FNStorageSpace2 が利用する物理ディスクを PowerShell で以下のようなコマンドを実行して確認します。
Get-VirtualDisk -FriendlyName “FNStorageSpace” | Get-PhysicalDisk
Get-VirtualDisk -FriendlyName “FNStorageSpace2” | Get-PhysicalDisk
以下のように同じ記憶域プール上に作成していながら、利用している物理ディスクがFNStorageSpaceは SSD1,SSD2に限定されていることが確認出来ます。
同じ事を概念的に絵で示すと、通常は右側のFNStorageSpace2のように、記憶域プール内の物理ディスクをまんべんなく利用するが、PhysicalDiskToUse属性の指定により、左側のFNStorageSpaceのようにSSD1,SSD2しか利用しないよう指定も出来るということになります。
PowerShellで記憶域スペースを作成したら、後は通常PowerShellで記憶域スペースを作成するのと同じ手順です。
Get-VirtualDisk -FriendlyName "FNStorageSpace" | Get-Disk
コマンドを実行して、ディスク番号を確認します。
ディスク番号が確認できたら、
New-Partition -DiskNumber 9 -UseMaximumSize -AssignDriveLetter
を実行し、パーティションを作成してドライブレターを割り当てます。
最後に、割り振られたドライブレターを指定して、フォーマットを実行して完了です。
Format-Volume -Driveletter E -FileSystem NTFS
これで、PhysicalDisksToUse で記憶域プールの中で利用する物理ディスクを指定して作成した記憶域スペースが利用出来るようになります。