How to Configure Storage Tiering with Storage Spaces on Windows Server 2016

Storage Tiering is a feature of Storage Spaces in Windows Server 2016 that automatically moves frequently accessed data to faster storage media (such as SSDs) and less frequently accessed data to slower, higher-capacity media (such as HDDs). This provides a cost-effective approach to storage by combining the speed of solid-state drives with the capacity of traditional spinning disks. Windows Server 2016 analyzes I/O patterns over time and uses background optimization tasks to move data between tiers, typically running during off-peak hours. For workloads with mixed hot and cold data, storage tiering can deliver near-SSD performance at HDD-class cost per gigabyte.

Storage Tiering requires a storage pool containing at least one SSD and one HDD. In Windows Server 2016, tiering works with both standalone Storage Spaces and Storage Spaces Direct (S2D). The feature operates transparently to applications — no changes are required in the application layer. Data is moved in 256 MB slabs called tier regions, and the system tracks the frequency of access to each slab to determine placement.

Preparing Disks and Creating a Storage Pool

First, identify available disks and their media types. It is important that Windows correctly classifies SSDs and HDDs:

Get-PhysicalDisk | Select-Object FriendlyName,MediaType,Size,HealthStatus,OperationalStatus

If a disk’s MediaType shows as Unspecified, set it manually. For an SSD:

Set-PhysicalDisk -FriendlyName "ATA Samsung SSD" -MediaType SSD

For an HDD:

Set-PhysicalDisk -FriendlyName "WD Black 2TB" -MediaType HDD

Get only disks that are not yet in a pool and are available for use:

Get-PhysicalDisk -CanPool $true

Create a storage pool from the available disks:

$disks = Get-PhysicalDisk -CanPool $true
New-StoragePool -FriendlyName "TieredPool" -StorageSubSystemFriendlyName "Windows Storage*" -PhysicalDisks $disks

Creating Storage Tiers

Create named storage tiers within the pool. The tier definitions specify which media type they correspond to and their resiliency settings:

New-StorageTier -StoragePoolFriendlyName "TieredPool" -FriendlyName "SSDTier" -MediaType SSD -ResiliencySettingName Mirror
New-StorageTier -StoragePoolFriendlyName "TieredPool" -FriendlyName "HDDTier" -MediaType HDD -ResiliencySettingName Mirror

Verify the tiers were created:

Get-StorageTier

Creating a Tiered Virtual Disk

Create a virtual disk that uses both tiers. Specify the size to allocate from each tier. The SSD tier holds the hot data and the HDD tier holds the warm or cold data:

$ssdTier = Get-StorageTier -FriendlyName "SSDTier"
$hddTier = Get-StorageTier -FriendlyName "HDDTier"
New-VirtualDisk -StoragePoolFriendlyName "TieredPool" -FriendlyName "TieredDisk" -StorageTiers $ssdTier,$hddTier -StorageTierSizes 100GB,400GB -WriteCacheSize 1GB

The WriteCacheSize parameter allocates a write-back cache on the SSD tier to absorb bursty write workloads before they are committed to the HDD tier. Verify the virtual disk:

Get-VirtualDisk -FriendlyName "TieredDisk" | Select-Object FriendlyName,HealthStatus,OperationalStatus,Size

Initializing and Formatting the Tiered Volume

Initialize the new disk, create a partition, and format it with NTFS or ReFS:

Get-VirtualDisk -FriendlyName "TieredDisk" | Get-Disk | Initialize-Disk -PartitionStyle GPT -PassThru | New-Partition -AssignDriveLetter -UseMaximumSize | Format-Volume -FileSystem ReFS -NewFileSystemLabel "TieredVolume" -Confirm:$false

Pinning Data to Specific Tiers

Windows Server 2016 allows you to pin specific files to a storage tier, overriding the automatic tiering algorithm. This is useful for database files that should always reside on SSD regardless of access patterns:

Set-FileStorageTier -FilePath "E:Databasescritical.mdf" -DesiredStorageTierFriendlyName "SSDTier"

View the tier assignment for a file:

Get-FileStorageTier -FilePath "E:Databasescritical.mdf"

Managing Tier Optimization

The Storage Tiers Optimization task runs automatically on a schedule. To run it manually:

Optimize-Volume -DriveLetter E -TierOptimize

Check how much data is currently on each tier of a virtual disk:

Get-StorageTierSupportedSize -FriendlyName "SSDTier" -ResiliencySettingName Mirror
Get-StorageTier | Select-Object FriendlyName,AllocatedSize,FootprintOnPool

Storage Tiering with Storage Spaces is one of the most impactful ways to improve storage performance on Windows Server 2016 without the full cost of an all-SSD array. By correctly classifying disk media types and choosing appropriate tier sizes for your workload — typically 10 to 20 percent of total capacity on SSD is sufficient for most database and VM workloads — you can achieve significant performance improvements for your hot data while keeping overall storage costs manageable.