Windows Storage Spaces: Mirroring, Tiering, and IOPS Profiling
Build resilient, high-IOPS storage pools on Windows Server using two-way mirroring, performance tiers, and ReFS integrity streams.
Netbay Cloud Team
Netbay Engineering
On this page
Enterprise applications running on Windows Server (including Microsoft SQL Server, Hyper-V, and high-volume file shares) demand high I/O throughput coupled with data integrity. Windows Storage Spaces provides storage virtualization built directly into the operating system. Storage Spaces groups multiple physical or virtual disks into unified Storage Pools, upon which thin-provisioned or resilient Virtual Disks (Spaces) are created.
When combined with the Resilient File System (ReFS), Storage Spaces offers automatic background data scrubbing, self-healing data integrity streams, and two-way or three-way mirroring that sustains drive failures without downtime or data corruption.
Creating a Storage Pool via PowerShell
Identify available raw disks attached to your Windows Server instance using Get-PhysicalDisk:
# Query unallocated physical disks available for pooling
$disks = Get-PhysicalDisk -CanPool $True
# Inspect disk bus types and media types
$disks | Select-Object DeviceId, FriendlyName, MediaType, Size
# Create a new Storage Pool across available disks
$poolParams = @{
FriendlyName = "DatabasePool"
StorageSubsystemFriendlyName = "Windows Storage*"
PhysicalDisks = $disks
LogicalSectorSizeDefault = 4096
}
$pool = New-StoragePool @poolParamsProvisioning a Mirrored Virtual Disk with ReFS
Next, carve out a resilient two-way mirrored Virtual Disk from the pool and format it with the Resilient File System:
# Create a Two-Way Mirrored Virtual Disk
$vDiskParams = @{
StoragePoolFriendlyName = "DatabasePool"
FriendlyName = "DataDisk01"
ResiliencySettingName = "Mirror"
NumberOfDataCopies = 2
ProvisioningType = "Thin"
Size = "500GB"
}
$vDisk = New-VirtualDisk @vDiskParams
# Initialize and partition the new disk
$diskNum = ($vDisk | Get-Disk).Number
Initialize-Disk -Number $diskNum -PartitionStyle GPT
$partition = New-Partition -DiskNumber $diskNum -UseMaximumSize -AssignDriveLetter
# Format with ReFS and activate Integrity Streams
Format-Volume -Partition $partition -FileSystem ReFS -NewFileSystemLabel "SQLData" -AllocationUnitSize 64KB
Set-FileIntegrity -FileName "$($partition.DriveLetter):*" -Enable $TrueUsing an allocation unit size of 64KB optimizes I/O performance specifically for SQL Server extent allocations while ReFS integrity streams actively protect database files against silent corruption.
Storage Architecture and RAID Video
Learn about storage pooling, mirroring topologies, and disk parity in this overview:
Monitoring Disk Performance Metrics
Profile read and write IOPS and latency on your Storage Spaces volume using the built-in storage diagnostics cmdlets:
# Monitor storage pool throughput and operational status
Get-StoragePool -FriendlyName "DatabasePool" | Get-StorageReliabilityCounter
# Profile disk transfer queue and average latency
Get-Counter -Counter "PhysicalDisk(*)Disk Reads/sec", "PhysicalDisk(*)Disk Writes/sec", "PhysicalDisk(*)Avg. Disk sec/Transfer" -SampleInterval 2 -MaxSamples 10Scale database and storage workloads on high-throughput NVMe SSD drives at netbayhosts.in.
Keep reading
Follow along on a real VPS
Deploy Linux in under 60 seconds
These guides are written against Ubuntu, Debian, and RHEL-family images — the same ones on NetBay.
Deploy an instance