Performance history for Storage Spaces Direct

Applies To: Windows Server Insider Preview build 17093 and later

Performance history is a new feature that gives Storage Spaces Direct administrators easy access to historical compute, memory, network, and storage measurements across host servers, drives, volumes, virtual machines, and more. Performance history is collected automatically and stored on the cluster for up to one year.


This feature is new in Windows Server Insider Preview build 17093 and later. It is not available in Windows Server 2016.

Get started

Performance history is collected by default. You do not need to install, configure, or start anything. An external database is not required. An Internet connection is not required. System Center is not required.

To see your cluster's performance history, use Windows Admin Center, the next-generation in-box management tool for Windows Server, or the new Get-ClusterPerformanceHistory cmdlet. See Usage in PowerShell for details.

How it works

How it works

  1. When Storage Spaces Direct is enabled, the Health Service creates an approximately 10 GB three-way mirror volume named ClusterPerformanceHistory and provisions an instance of the Extensible Storage Engine (also known as Microsoft JET) there. This lightweight database stores the performance history.

  2. The Health Service automatically discovers relevant objects, such as virtual machines, anywhere in the cluster and begins streaming their performance counters. The counters are aggregated, synchronized, and inserted into the database. Streaming runs continuously and is optimized for minimal system impact.

  3. You can see performance history in Windows Admin Center or in PowerShell. Performance history is stored for up to one year, with diminishing granularity. Queries are served directly from the database for consistent, snappy performance and to minimize system impact.

What's collected


Performance history is collected for 7 types of objects: drives, network adapters, servers, virtual machines, virtual hard disk files, volumes, and the overall cluster. In many cases, history is aggregated across peer objects to their parent: for example, networkadapter.bytes.inbound is collected for each network adapter separately, and also aggregated to the overall server; likewise, node.cpu.usage is collected for each server separately, and also aggregated to the overall cluster; and so on.

Types of objects



See Performance history for drives.

Network adapters

See Performance history for network adapters.


See Performance history for servers.

Virtual hard disks

See Performance history for virtual hard disks.

Virtual machines

See Performance history for virtual machines.


See Performance history for volumes.


See Performance history for clusters.


Performance history is stored for up to one year, with diminishing granularity. For the most recent hour, measurements are available every ten seconds. Thereafter, they are intelligently merged (by averaging or summing, as appropriate) into less granular series that span more time. For the most recent day, measurements are available every five minutes; for the most recent week, every fifteen minutes; and so on.

In Windows Admin Center, you can select the timeframe in the upper-right above the chart.

Timeframes in Windows Admin Center

In PowerShell, use the -TimeFrame parameter.

Here are the available timeframes:

Timeframe Measurement frequency Retained for
LastHour Every 10 secs 1 hour
LastDay Every 5 minutes 25 hours
LastWeek Every 15 minutes 8 days
LastMonth Every 1 hour 35 days
LastYear Every 1 day 400 days

Usage in PowerShell

See performance history in PowerShell with the Get-ClusterPerformanceHistory cmdlet.



Use the Get-ClusterPerf alias to save some keystrokes.

Specify the object

You can specify an object you want by the pipeline. This works with 7 types of objects:

Object from pipeline Example
Get-PhysicalDisk Example
Get-NetAdapter Example
Get-ClusterNode Example
Get-VHD Example
Get-VM Example
Get-Volume Example
Get-Cluster Example

If you don't specify, performance history for the overall cluster is returned.


Consider specifying the series you want too.

Specify the series

You can specify the series you want with these parameters, which support tab-completion for discoverability:


If you don't specify, every series available for the specified object is returned.

Specify the timeframe

You can specify the timeframe of history you want with the -TimeFrame parameter.

If you don't specify, the MostRecent measurement is returned.


To get the CPU usage of the virtual machine named MyVM for the last hour:

Get-VM "MyVM" | Get-ClusterPerf -TimeFrame LastHour -VirtualMachineSeriesName "VirtualMachine.Cpu.Usage"

To print the series of measurements to the PowerShell console:

$Measurements = Get-VM "MyVM" | Get-ClusterPerf -TimeFrame LastHour -VirtualMachineSeriesName "VirtualMachine.Cpu.Usage"

To save the series of measurements to an output file:

($Measurements).Group >> file.txt

Frequently asked questions

What extensibility is available?

We designed cluster performance history to be scripting-friendly. You can use PowerShell to pull any available history from the database. You can build automated reporting or alerting, export history for safekeeping, roll your own visualizations, and much more. However, it is not currently possible to collect history for additional objects, timeframes, or series.

Can I change the measurement frequency and/or retention period?

No, measurement frequency and retention period are not currently configurable.

How does this feature handle failures?

The Health Service, which collects measurements and inserts them into the database, is highly available. If the server where it is running goes down, it will resume moments later on another server in the cluster. Performance history collection may lapse briefly, but it will resume automatically. Resiliency for the database storage is provided by three-way mirroring. The ClusterPerformanceHistory volume is repaired after drive or server failures just like any other volume in Storage Spaces Direct.

How are missing measurements handled?

When measurements are merged into less granular series that span more time, as described in Timeframes, periods of missing data are excluded. For example, if the server was down for 30 minutes, then running at 50% CPU for the next 30 minutes, the node.cpu.usage average for the hour will be recorded as 50%.

How do I disable this feature?

If you have already enabled Storage Spaces Direct, there are two steps:

  1. Remove the path to the volume. This prevents the Health Service from collecting new measurements.

    Get-StorageSubSystem Cluster* | Remove-StorageHealthSetting -Name "System.PerformanceHistory.Path"
  2. Delete the volume to delete existing measurements.

    Remove-VirtualDisk "ClusterPerformanceHistory"

If you have not yet enabled Storage Spaces Direct, use the -CollectPerformanceHistory parameter of the Enable-ClusterS2D cmdlet. Set it to $False.

Enable-ClusterS2D -CollectPerformanceHistory $False


The cmdlet doesn't work

An error message like "The term 'Get-ClusterPerf' is not recognized as the name of a cmdlet" means the feature is not available or installed. Verify that you have Windows Server Insider Preview build 17093 or later and that you're running Storage Spaces Direct.


This feature is not available on Windows Server 2016 or earlier.

The cmdlet works but does nothing

If the cmdlet doesn't return the latest measurement (within the last ten seconds), performance history collection may have lapsed or stopped. Collection is managed by the Health cluster resource. Verify that it is present and Online:

Get-ClusterResource Health

If the cluster resource is stopped, start it:

Start-ClusterResource Health

Measurements are stored on the volume name ClusterPerformanceHistory. Verify that it is present and OK:

Get-Volume -FriendlyName "ClusterPerformanceHistory"

The volume is deleted or missing

To provision the ClusterPerformanceHistory volume again:

  1. Confirm the volume is deleted:

    Remove-VirtualDisk "ClusterPerformanceHistory"
  2. Remove the path to the volume:

    Get-StorageSubSystem Cluster* | Remove-StorageHealthSetting -Name "System.PerformanceHistory.Path"
  3. Set AutoProvision back to True:

    Get-StorageSubSystem Cluster* | Set-StorageHealthSetting -Name "System.PerformanceHistory.AutoProvision.Enabled" -Value "True"

It might take a few minutes for the changes to take effect.

See also