Windowsの記憶域プールでは、構成するドライブを丸ごと割り当てている事例が多い。そして、何となくそうしなければならない印象すらある。しかし実際には別用途で使っているドライブの空き領域をプールに組み込み、既存データと記憶域プールでドライブを共有することも出来るようだ。
というわけで、Windows Storage Server 2016が入っているRAID-1なSSDアレイを既存のOSパーティションはそのままに、記憶域プールに組み込んで記憶域階層のSSD層として使えるか試してみた。
もっとも、こういう場合、RAIDカード側でアレイをOS用と記憶域階層用の仮想ドライブに分けるのが普通だと思う。今回使ったRAIDカード(実態はソフトウェアRAID)のHP B140iでは仮想ドライブが使えなかったため、已む無くこのような構成&実験を行ったというのが実情だったりする。
マシン | HP ProLiant ML150 Gen9 |
---|---|
CPU | Xeon E5-2620v3 (6C12T/2.4GHz) |
メモリ | DDR4-2133 16GB (8GBx2) |
ストレージ | B140i/ZM
|
OS | Windows Storage Server 2016 Standard |
実際のところ、普通の手順で記憶域階層を作るだけである。
PS C:\> Get-PhysicalDisk | ft FriendlyName,SerialNumber,CanPool,BusType,DeviceId,MediaType,Size FriendlyName SerialNumber CanPool BusType DeviceId MediaType Size ------------ ------------ ------- ------- -------- --------- ---- HP LOGICAL VOLUME True RAID 0 SSD 800132521984 HP LOGICAL VOLUME True RAID 1 Unspecified 12002258673664
対象のディスクはRAIDアレイになっている。DeviceIdの0番がRAID-1のSSDアレイ、1番がRAID-10のHDDアレイである。言うまでもないが、本来はデバイスを直接記憶域システムで管理するのが望ましいとされている。
PS C:\> $Disks = Get-PhysicalDisk -CanPool $true PS C:\> $Disks FriendlyName SerialNumber CanPool OperationalStatus HealthStatus Usage Size ------------ ------------ ------- ----------------- ------------ ----- ---- HP LOGICAL VOLUME True OK Healthy Auto-Select 745.18 GB HP LOGICAL VOLUME True OK Healthy Auto-Select 10.92 TB
ここがミソ、といってもOSが入っているSSDを含め、記憶域プールを構成したいディスク群をいつも通りPhsicalDisksに渡す。物理ディスクとして渡すと、何となくディスク全体が使われて既存データが消えちゃいそうで、なかなか気づかない&実行できないよねっていう。
PS C:\> New-StoragePool -FriendlyName TieredPool -PhysicalDisks $Disks -StorageSubSystemUniqueId (Get-StorageSubSystem).UniqueId -LogicalSectorSizeDefault 4096 FriendlyName OperationalStatus HealthStatus IsPrimordial IsReadOnly ------------ ----------------- ------------ ------------ ---------- TieredPool OK Healthy False False
↓こんな感じで、未割り当て領域に記憶域用のパーティションが自動で作られて使われる。tierの綴りが間違ってるのはご愛嬌。
意図したディスクでプールが作られたか確認。
PS C:\> Get-StoragePool TieredPool | Get-PhysicalDisk FriendlyName SerialNumber CanPool OperationalStatus HealthStatus Usage Size ------------ ------------ ------- ----------------- ------------ ----- ---- HP LOGICAL VOLUME False OK Healthy Auto-Select 745 GB HP LOGICAL VOLUME False OK Healthy Auto-Select 10.92 TB
記憶域階層を作るには、プールにSSDとHDDが最低1つずつ必要である。デバイスの種類は自動的に識別されるが、今回のようにデバイスが直接露出してない場合は往々にして正しく識別されないので、手動で設定してやる。
メディアタイプを確認。
PS C:\> Get-StoragePool TieredPool | Get-PhysicalDisk | ft FriendlyName,DeviceId,MediaType,Size FriendlyName DeviceId MediaType Size ------------ -------- --------- ---- HP LOGICAL VOLUME 0 SSD 799937658880 HP LOGICAL VOLUME 1 Unspecified 12002017673216
今回の事例だと、SSDの方は正しく見えている(RAIDの設定ツールの方でSSDにはSSDのフラグが立っていた影響かも。)
よってDeviceID 1の方にHDDと指定してやる。下記コマンドレットのwhere DeviceId -eq 1
の数字の部分と'-MediaType'を適宜変えて設定してくだしあ。
PS C:\> Get-StoragePool TieredPool | Get-PhysicalDisk | where DeviceId -eq 1 | Set-PhysicalDisk -MediaType HDD PS C:\> Get-StoragePool TieredPool | Get-PhysicalDisk | ft FriendlyName,DeviceId,MediaType,Size FriendlyName DeviceId MediaType Size ------------ -------- --------- ---- HP LOGICAL VOLUME 0 SSD 799937658880 HP LOGICAL VOLUME 1 HDD 12002017673216
ライトバックを有効にする。(記憶域階層のライトキャッシュバックではなく、一般的な書き込み方式の方。)
PS C:\> Set-StoragePool TieredPool -IsPowerProtected $True PS C:\> Get-StoragePool TieredPool | ft FriendlyName,IsPowerProtected FriendlyName IsPowerProtected ------------ ---------------- TieredPool True
記憶域プールにtierを作成する。
SSD層
PS C:\> Get-StoragePool TieredPool | New-StorageTier -FriendlyName SSDtier -MediaType SSD ObjectId : {1}\\WIN-JCFBFMM4427\root/Microsoft/Windows/Storage/Providers_v2\SPACES_StorageTier.ObjectId=" {fd905169-74f9-11e8-9d72-806e6f6e6963}:ST:{f1f261c1-646f-4ff3-90a2-985826bc72ca}{2305468e-37dc -4b4a-87c8-770d886dba14}" PassThroughClass : PassThroughIds : PassThroughNamespace : PassThroughServer : UniqueId : {2305468e-37dc-4b4a-87c8-770d886dba14} AllocatedSize : 0 AllocationUnitSize : Auto ColumnIsolation : PhysicalDisk Description : FaultDomainAwareness : PhysicalDisk FootprintOnPool : 0 FriendlyName : SSDtier Interleave : 262144 MediaType : SSD NumberOfColumns : Auto NumberOfDataCopies : 2 NumberOfGroups : 1 ParityLayout : PhysicalDiskRedundancy : 1 ProvisioningType : Fixed ResiliencySettingName : Mirror Size : 0 Usage : Data PSComputerName :
HDD層
PS C:\> Get-StoragePool TieredPool | New-StorageTier -FriendlyName HDDtier -MediaType HDD ObjectId : {1}\\WIN-JCFBFMM4427\root/Microsoft/Windows/Storage/Providers_v2\SPACES_StorageTier.ObjectId=" {fd905169-74f9-11e8-9d72-806e6f6e6963}:ST:{f1f261c1-646f-4ff3-90a2-985826bc72ca}{9811c7f1-a66e -45e9-af52-9269998e5bda}" PassThroughClass : PassThroughIds : PassThroughNamespace : PassThroughServer : UniqueId : {9811c7f1-a66e-45e9-af52-9269998e5bda} AllocatedSize : 0 AllocationUnitSize : Auto ColumnIsolation : PhysicalDisk Description : FaultDomainAwareness : PhysicalDisk FootprintOnPool : 0 FriendlyName : HDDtier Interleave : 262144 MediaType : HDD NumberOfColumns : Auto NumberOfDataCopies : 2 NumberOfGroups : 1 ParityLayout : PhysicalDiskRedundancy : 1 ProvisioningType : Fixed ResiliencySettingName : Mirror Size : 0 Usage : Data PSComputerName :
SSD, HDDそれぞれの層を取得
PS C:\> $SSD = Get-StorageTier -FriendlyName SSDtier PS C:\> $HDD = Get-StorageTier -FriendlyName HDDtier
記憶域階層に仮想ディスクを作成
PS C:\> Get-StoragePool TieredPool | New-VirtualDisk -FriendlyName TieredDisk -ResiliencySettingName Simple -StorageTiers $SSD,$HDD -WriteCacheSize 8GB -StorageTierSizes 632GB,10.9TB FriendlyName ResiliencySettingName OperationalStatus HealthStatus IsManualAttach Size ------------ --------------------- ----------------- ------------ -------------- ---- TieredDisk OK Healthy False 11.52 TB
/-ライトバックキャッシュは8GBにしてみた(デフォルトでは1GB)。-/→記憶域階層のライトバックキャッシュはSSD層が満杯になった後のランダムライト用キャッシュとして機能するため、おそらく8GBは過剰。標準の1GBかせいぜい多くても4GBもあれば十分だと思われる。
-StorageTierSizes
引数で、仮想ディスクに割り当てるSSD/HDD層の容量を指定する。プール全部を1仮想ディスクに割り当てる場合は、最大値を自前計算する必要がある。
現状、記憶域システムが使う容量を算出する方法がないので、適当に差っ引くしかない。結構ギリギリまで攻めても大丈夫っぽいが、本当に大丈夫かどうかはわからない…。
セクタサイズとキャッシュサイズを確認してみる。
PS C:\> Get-VirtualDisk -FriendlyName TieredDisk | ft LogicalSectorSize,PhysicalSectorSize,WriteCacheSize LogicalSectorSize PhysicalSectorSize WriteCacheSize ----------------- ------------------ -------------- 4096 4096 8589934592
ライトキャッシュが8GBなので、テーストデータ4GB/16GB/32GBでCrystalDiskMarkを実行した。
/-データがキャッシュに全部載るかどうかで違いが出ると予想していたが、殆ど同じ結果となった。16GB以上でも全部SSDに大して書き込まれてるように見える…。記憶域階層の最適化でSSDが良く使われるデータで一杯になれば、また違いがでるのかしら?-/ → 書き込みはまずSSDの空き領域に対して行われるため妥当な結果である。