Windows Storage Server 2016の起動SSDの空き領域で記憶域階層を構築

Windowsの記憶域プールでは、構成するドライブを丸ごと割り当てている事例が多い。そして、何となくそうしなければならない印象すらある。しかし実際には別用途で使っているドライブの空き領域をプールに組み込み、既存データと記憶域プールでドライブを共有することも出来るようだ。

というわけで、Windows Storage Server 2016が入っているRAID-1なSSDアレイを既存のOSパーティションはそのままに、記憶域プールに組み込んで記憶域階層のSSD層として使えるか試してみた。

もっとも、こういう場合、RAIDカード側でアレイをOS用と記憶域階層用の仮想ドライブに分けるのが普通だと思う。今回使ったRAIDカード(実態はソフトウェアRAID)のHP B140iでは仮想ドライブが使えなかったため、已む無くこのような構成&実験を行ったというのが実情だったりする。

マシンHP ProLiant ML150 Gen9
CPUXeon E5-2620v3 (6C12T/2.4GHz)
メモリDDR4-2133 16GB (8GBx2)
ストレージB140i/ZM
  • SSDアレイ (RAID-1)
    • Intel DC S3500 800GB×2
      • システム:100GiB
      • 記憶域用:640GiB
  • HDDアレイ (RAID-10)
    • WD Red 4TB×6
      • 記憶域用:10.9TiB
OSWindows Storage Server 2016 Standard

下図のディスク0の未割り当て領域と、ディスク1全体を使って記憶域階層を作成する。

実際のところ、普通の手順で記憶域階層を作るだけである。

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仮想ディスクに割り当てる場合は、最大値を自前計算する必要がある。

  • (SSD層の最大値) = (SSD層の最大容量)-(ライトバックキャッシュ容量)-(記憶域システムの管理用領域)
  • (HDD層の最大値) = (HDD層の最大容量)-(記憶域システムの管理用領域)

現状、記憶域システムが使う容量を算出する方法がないので、適当に差っ引くしかない。結構ギリギリまで攻めても大丈夫っぽいが、本当に大丈夫かどうかはわからない…。

セクタサイズとキャッシュサイズを確認してみる。

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の空き領域に対して行われるため妥当な結果である。

4GB
CrystalDiskMark 6.0.1 x64 (C) 2007-2018 hiyohiyo

   Sequential Read (Q= 32,T= 1) :   954.489 MB/s
  Sequential Write (Q= 32,T= 1) :   456.697 MB/s
  Random Read 4KiB (Q=  8,T= 8) :   611.536 MB/s [ 149300.8 IOPS]
 Random Write 4KiB (Q=  8,T= 8) :   245.631 MB/s [  59968.5 IOPS]
  Random Read 4KiB (Q= 32,T= 1) :   251.855 MB/s [  61488.0 IOPS]
 Random Write 4KiB (Q= 32,T= 1) :   176.885 MB/s [  43184.8 IOPS]
  Random Read 4KiB (Q=  1,T= 1) :    23.101 MB/s [   5639.9 IOPS]
 Random Write 4KiB (Q=  1,T= 1) :    45.986 MB/s [  11227.1 IOPS]

  Test : 4096 MiB [D: 0.0% (0.5/11383.9 GiB)] (x3)  [Interval=5 sec]
    OS : Windows Server 2016 Storage Server Standard [10.0 Build 14393] (x64)
    WSS2016 記憶域階層(SSD 640G/書込キャッシュ 8G)
16GB
CrystalDiskMark 6.0.1 x64 (C) 2007-2018 hiyohiyo

   Sequential Read (Q= 32,T= 1) :   945.471 MB/s
  Sequential Write (Q= 32,T= 1) :   431.246 MB/s
  Random Read 4KiB (Q=  8,T= 8) :   616.567 MB/s [ 150529.1 IOPS]
 Random Write 4KiB (Q=  8,T= 8) :   238.002 MB/s [  58106.0 IOPS]
  Random Read 4KiB (Q= 32,T= 1) :   251.890 MB/s [  61496.6 IOPS]
 Random Write 4KiB (Q= 32,T= 1) :   152.648 MB/s [  37267.6 IOPS]
  Random Read 4KiB (Q=  1,T= 1) :    23.280 MB/s [   5683.6 IOPS]
 Random Write 4KiB (Q=  1,T= 1) :    45.708 MB/s [  11159.2 IOPS]

  Test : 16384 MiB [D: 0.0% (0.5/11383.9 GiB)] (x3)  [Interval=5 sec]
    OS : Windows Server 2016 Storage Server Standard [10.0 Build 14393] (x64)
    WSS2016 記憶域階層(SSD 640G/書込キャッシュ 8G)
32GB
CrystalDiskMark 6.0.1 x64 (C) 2007-2018 hiyohiyo

   Sequential Read (Q= 32,T= 1) :   959.648 MB/s
  Sequential Write (Q= 32,T= 1) :   436.868 MB/s
  Random Read 4KiB (Q=  8,T= 8) :   612.621 MB/s [ 149565.7 IOPS]
 Random Write 4KiB (Q=  8,T= 8) :   235.406 MB/s [  57472.2 IOPS]
  Random Read 4KiB (Q= 32,T= 1) :   250.300 MB/s [  61108.4 IOPS]
 Random Write 4KiB (Q= 32,T= 1) :   161.983 MB/s [  39546.6 IOPS]
  Random Read 4KiB (Q=  1,T= 1) :    23.406 MB/s [   5714.4 IOPS]
 Random Write 4KiB (Q=  1,T= 1) :    45.752 MB/s [  11169.9 IOPS]

  Test : 32768 MiB [D: 0.0% (0.6/11383.9 GiB)] (x3)  [Interval=5 sec]
    OS : Windows Server 2016 Storage Server Standard [10.0 Build 14393] (x64)
    WSS2016 記憶域階層(SSD 640G/書込キャッシュ 8G)
  • windows/create_storage_tier_on_wss2016_boot_ssd.txt
  • 最終更新: 2018-08-09 17:36
  • by Decomo