Optimizing Windows Server 2012 storage management via PowerShell for both performance and resiliency

“Hi there!  I’d like to introduce Josh Adams, a Senior Program Manager in the Enterprise Engineering Center (EEC), a facility dedicated to validating Microsoft’s next wave of enterprise solutions.  Josh’s area of focus is Window Server 2012’s new Storage Management features.  This blog delves into the intricacies of optimizing Windows-managed storage via PowerShell for both performance and resiliency.”

–Natalia Mackevicius

Although the new Server Manager UI in Windows Server 2012 provides a very convenient and intuitive workflow to provision and manage Storage, interaction with PowerShell is required to access many of the advanced features afforded by the new Storage Management API.  For example, you can easily create a Virtual Disk in the UI; however, the Wizard only allows setting the following parameters:

  • Underlying Storage Pool name
  • Virtual Disk Name
  • Resiliency setting (Simple, Mirror or Parity)
  • Provisioning type (Thin or Fixed)
  • Virtual Disk size

In contrast, when creating a Virtual Disk via PowerShell, you can specify additional parameters to tune both resiliency and performance:

  • Number of Columns: The number of columns the Virtual Disk contains
  • Number of Data Copies: Number of complete copies of data that can be maintained
  • Disk interleave: Number of bytes forming a stripe
  • Physical disks to use: Specific disks to leverage in the Virtual Disk

For example, assuming I have an existing pool with the following attributes:

  • Friendly Name: Pool01
  • Disks: 9 450GB disks (each allocated as Data Store)
  • Pool Capacity: 3.68TB

If I then create a simple 200GB Virtual Disk via the UI named VDiskSimpleUI, the resulting Virtual Disk leverages 8 columns and maintains 1 copy of the data.  But when creating the Virtual Disk via PowerShell, I can force the tripping across all nine of the disks and optimize performance.

New-VirtualDisk -StoragePoolFriendlyName Pool01 -ResiliencySettingName Simple -Size 200GB
-FriendlyName VDiskSimplePS -ProvisioningType Fixed -NumberOfDataCopies 1 -NumberOfColumns 9

And creating a mirrored 200GB Virtual Disk via the UI named VDiskMirrorUI produces a Virtual Disk with 4 columns and 2 data copies.  But with PowerShell, I can create a slightly different configuration, increasing the data protection (and also the disk footprint):

New-VirtualDisk -StoragePoolFriendlyName Pool01 -ResiliencySettingName Mirror -Size 200GB
‘-FriendlyName VDiskMirrorPS -ProvisioningType Fixed -NumberOfDataCopies 3 -NumberOfColumns 3

The results and differences of these various permutations can be easily displayed via PowerShell:

Get-VirtualDisk | ft FriendlyName, ResiliencySettingName, NumberOfColumns, NumberOfDataCopies, @{Expression={$_.Size / 1GB}; Label=”Size(GB)”}, @{Expression={$_.FootprintOnPool / 1GB}; Label=”PoolFootprint(GB)”} -AutoSize

FriendlyName     ResiliencySettingName   NumberOfColumns NumberOfDataCopies Size(GB)           PoolFootprint(GB)
—————-      —————————   ———————– ————————–  ———             ——————-

VDiskSimpleUI   Simple                              8                             1                         200                 200

VDiskMirrorUI    Mirror                               4                             2                         200                 400

VDiskSimplePS   Simple                              9                             1                         200.25            200.25

VDiskMirrorPS    Mirror                               3                             3                         200.25            600.75


Some additional tips:

  • The number of columns multiplied by the number of data copies cannot exceed the number of disks in the underlying pool
  • 256MB of each physical disk is consumed when adding to a Pool
  • Default Resiliency Settings
    • Simple: Striping with no redundancy using a default stripe size of 64K
    • Mirror: 2-way mirroring with a 64K default stripe size
    • Parity: Striping with parity using a default column width of 3 (i.e. 3 disks per row  with 2 containing data while the other contains parity) and a default stripe size of 64K
  • Although not enforced, it is recommended that pools with more than 24 disks use ‘Manual’ allocation (as opposed to the auto allocation default of ‘Data Store’)
  • Clustering

    • Clustering Virtual Disks requires the underlying hardware to support Persistent Reservations
    • Clustered Storage Spaces require fixed provisioning
    • Removing a clustered Storage Pool from Failover Clustering will cause the underlying Pool to be marked Read Only
  • PowerShell Links


Joshua Adams
Senior Program Manager
Enterprise Engineering Center


Comments (0)