====== 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| ^CPU|Xeon 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 | ^OS|Windows Storage Server 2016 Standard| 下図のディスク0の未割り当て領域と、ディスク1全体を使って記憶域階層を作成する。 {{ :windows:disk_layout_before_assigned_ssd_tier.png |}} ===== 手順 ===== 実際のところ、普通の手順で記憶域階層を作るだけである。 ==== 現在のディスクを確認 ==== 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の綴りが間違ってるのはご愛嬌。 {{:windows:disk_layout_after_assigned_ssd_tier.png|}} ==== 記憶域プールを確認 ==== 意図したディスクでプールが作られたか確認。 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 ==== SSD層とHDD層の作成 ==== 記憶域プールに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|{{ :windows:wss2016_tiered_space_cdm_4gb.png |}}| 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|{{ :windows:wss2016_tiered_space_cdm_16gb.png |}}| 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|{{ :windows:wss2016_tiered_space_cdm_32gb.png |}}| 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) | ===== 参考サイト ===== * [[https://social.technet.microsoft.com/Forums/windowsserver/en-US/29c6c2d2-e928-4edd-9fd8-3da5b434a54b/storage-spaces-can-only-use-whole-drives?forum=winserveressentials|Storage spaces can only use whole drives]] * [[https://blogs.technet.microsoft.com/askpfeplat/2013/10/20/storage-spaces-how-to-configure-storage-tiers-with-windows-server-2012-r2/|Storage Spaces: How to configure Storage Tiers with Windows Server 2012 R2 | Ask Premier Field Engineering (PFE) Platforms]] * [[https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2012-R2-and-2012/dn387076(v=ws.11)|What's New in Storage Spaces in Windows Server | Microsoft Docs]] * [[http://www.vwnet.jp/windows/WS16TP4/201511201/StrageTier.htm|Windows Server 2016 で SSD + HDD の階層を作る]] * [[https://satsumahomeserver.com/blog/2804|記憶域スペースに関する理解を深める(パラメーター設定と振る舞い):(1)]] * [[https://satsumahomeserver.com/blog/3075|Windows Server 2012 R2 の記憶域スペースは、Write-Back Cache と 記憶域階層 をサポート]] * [[https://redmondmag.com/articles/2013/10/28/ssd-write-back-cache.aspx|Using Windows Server 2012's SSD Write-Back Cache -- Redmondmag.com]] * [[https://geekdudes.wordpress.com/2017/02/11/storage-spaces-tiering-in-windows-server-2016/|Storage Spaces Tiering in Windows Server 2016 | geekdudes]] * [[http://www.checkyourlogs.net/?p=22141|Workaround for Storage Spaces Direct – Unspecified Media Type | CheckYourLogs.Net]] * [[http://www.miru.ch/creating-tiered-storage-spaces-in-server-2012-r2/|Creating tiered Storage Spaces in Server 2012 R2 ← MIRU.CH]] * [[http://www.dell.com/support/manuals/jp/ja/jpbsd1/storage-md1420-dsms/dsms_bpg_pub/dell-storage-with-microsoft-storage-spaces-%E3%81%AE%E3%83%99%E3%82%B9%E3%83%88%E3%83%97%E3%83%A9%E3%82%AF%E3%83%86%E3%82%A3%E3%82%B9%E3%82%AC%E3%82%A4%E3%83%89?guid=guid-5b8de7b7-879f-45a4-88e0-732155904029&lang=ja-jp|Dell Storage with Microsoft Storage Spaces のベストプラクティスガイド]]