How to set up tiered storage on windows 10

I was planning of just using the windows 10 tiering rather than the ryzen store MI stuff as I don’t need it to be bootable, and it saves using any more software. I am just a bit unsure how to do it as there is no gui for tiering in win10 and I have never really used powershell before. I have found a few guides but some are pretty old and they contradict each other.

I was not aware that Windows 10 have more than basic functions of Storage Spaces. After reading your question I have probably found the same tutorials/examples as you did. One of them was actually an example of 2 SSD and 2 HDDs - but I think it was only an scenario that author used as an example.

I have not tested tiered storage so far. But I have in my home two machines that have some volumes with storage spaces, and here are my recommendations for you:

  • Powershell is your only friend!
  • You do not need to learn PowerShell perse, just those commands for Storage Spaces. Powershell possibilities are just for more advance, scripted things you might need to use when creating the similar configurations on multiple machines.
  • I always end up studying sites like: https://docs.microsoft.com/en-us/powershell/module/storage/get-physicaldisk because tutorials/guides on internet always do things in narrowed way.
  • Do not use any UI application from MS for storage spaces. I have Windows 2016 Essentials and because it is both Server and “Essesntial” it has not one, but two, UI management applications for storage spaces. Both are nice to see the status and both are completely useless and dangerous to use (the application literally cannot calculate parameters for commands called in background to create disk pool/volume and fails with “unknown error” )
  • I assume that that if UI for Storage Spaces works in WIn 10 it is only because it is so limited that team behind it simply did not have opportunity to make the same mistakes like with Windows Server.

Tiered storage spaces on win10 isn’t a supported feature as far as I know and definitely can’t be created via a GUI.

In older versions of win10 the posh commands to set this up failed. It did work on one of the builds last year as I did manage to get it running. To be honest the results were not impressive. I will see if I can dig out any more info.

Cheers guys, there is no GUI in windows 10 for storage space tiering at all, it is very basic indeed. It allegedly does work via powershell and Wendell mentioned it in his store MI video, so I doubt he would be wrong on that. I was planning on just buying the $20 version of store MI to try but it only supports up to 250gb SSDs and I have a 500gb. You can buy the pro version which supports up to 1tb SSD and 4Gb RAM but it is $60 which is a little more than I would like to pay for an experiment. If I could do the same thing via windows 10 for free I would obviously try that first. I will have another look at the commands and see if I can understand it. better

1 Like

I have found the suggested powershell commands if this makes sense to anyone.

#List all disks that can be pooled and output in table format (format-table)
Get-PhysicalDisk -CanPool $True | ft FriendlyName,OperationalStatus,Size,MediaType

#Store all physical disks that can be pooled into a variable, $pd
$pd = (Get-PhysicalDisk -CanPool $True | Where MediaType -NE UnSpecified)
#Create a new Storage Pool using the disks in variable $pd with a name of My Storage Pool
New-StoragePool -PhysicalDisks $pd –StorageSubSystemFriendlyName “Storage Spaces*” -FriendlyName “My Storage Pool”
#View the disks in the Storage Pool just created
Get-StoragePool -FriendlyName “My Storage Pool” | Get-PhysicalDisk | Select FriendlyName, MediaType

#Create two tiers in the Storage Pool created. One for SSD disks and one for HDD disks
$ssd_Tier = New-StorageTier -StoragePoolFriendlyName “My Storage Pool” -FriendlyName SSD_Tier -MediaType SSD
$hdd_Tier = New-StorageTier -StoragePoolFriendlyName “My Storage Pool” -FriendlyName HDD_Tier -MediaType HDD

#New-VirtualDisk –SNtoragePoolFriendlyName “My Storage Pool” –ResiliencySettingName Simple –Size 10TB –Provisioningtype Thin –FriendlyName “Documents”
#Create a new virtual disk in the pool with a name of TieredSpace using the SSD (50GB) and HDD (300GB) tiers
$vd1 = New-VirtualDisk -StoragePoolFriendlyName “My Storage Pool” -FriendlyName TieredSpace -StorageTiers @($ssd_tier, $hdd_tier) -StorageTierSizes @(50GB, 300GB) -ResiliencySettingName Mirror -WriteCacheSize 1GB #cannot also specify -size if using tiers and also cannot use provisioning type, e.g. Thin

I see the write cache and provisioning are both set with the commands which seems a lot more powerful than the GUI can manage. I take it thin provisioning means morer discs can be added later.

1 Like

To ensure the formatting and the quotes don’t get messed up (plus I also expanded the aliases and added the named parameters.

I haven’t looked at the script itself any further, nor the actual cmdlets so I make no warranty or claims whether it actually works - but it looked interesting - and well I saw that the quotes were being messed up (happens often when copying/pasting from the web) so before anyone tries to run it and gets errors because of that I figured I’d clean it up a bit.

If someone else hasn’t jumped on it later on, I can have a crack at it if wanted/needed/asked (I am about to head in for the night) :slight_smile:

# List all disks that can be pooled and output in table format (format-table)
Get-PhysicalDisk -CanPool $True | Format-Table -Property FriendlyName, OperationalStatus, Size, MediaType

# Store all physical disks that can be pooled into a variable, $pd
$pd = (Get-PhysicalDisk -CanPool $True | Where-Object -FilterScript {$_.MediaType -NE 'UnSpecified'})
# Create a new Storage Pool using the disks in variable $pd with a name of My Storage Pool
New-StoragePool -PhysicalDisks $pd –StorageSubSystemFriendlyName "Storage Spaces*" -FriendlyName "My Storage Pool"
#View the disks in the Storage Pool just created
Get-StoragePool -FriendlyName "My Storage Pool" | Get-PhysicalDisk | Select-Object -Property FriendlyName, MediaType

# Create two tiers in the Storage Pool created. One for SSD disks and one for HDD disks
$ssd_Tier = New-StorageTier -StoragePoolFriendlyName "My Storage Pool" -FriendlyName SSD_Tier -MediaType SSD
$hdd_Tier = New-StorageTier -StoragePoolFriendlyName "My Storage Pool" -FriendlyName HDD_Tier -MediaType HDD

# New-VirtualDisk –SNtoragePoolFriendlyName "My Storage Pool" –ResiliencySettingName Simple –Size 10TB –Provisioningtype Thin –FriendlyName "Documents"
# Create a new virtual disk in the pool with a name of TieredSpace using the SSD (50GB) and HDD (300GB) tiers
$vd1 = New-VirtualDisk -StoragePoolFriendlyName "My Storage Pool" -FriendlyName TieredSpace -StorageTiers @($ssd_tier, $hdd_tier) -StorageTierSizes @(50GB, 300GB) -ResiliencySettingName Mirror -WriteCacheSize 1GB # cannot also specify -size if using tiers and also cannot use provisioning type, e.g. Thin
1 Like

Thanks very much for that, much appreciated. I wasn’t going to run the script as a few of the parameters don’t apply to me, but it is a good idea in case anyone else did it. My scripting knowledge is limited to basic command line stuff and I have only used powershell once before. However it looks really powerful and I am keen to understand exactly what is happening before running anything. Any help would be much appreciated. I do use storage spaces at work but that is a simple mirrored array with 4 discs using the GUI. This stuff is much more sophisticated.

Just found an interesting blog on the subject with the required powershell commands. I have located a spare 4tb data drive so will give this a go over the weekend.

1 Like

Well I finally had a go at setting up the tiered space and it seems to be working well. The only snag I hit was when creating the new disc the “max size” commands for the tier sizes didn’t work and threw an error. I then tried manually specifying the sizes but got the same error as I think there must be some formatting overhead which reduces the available size a bit . In the end I had to go for 400GB SSD tier and 3.5TB HDD tier (for a 500gb SSD and 4TB HDD) before the volume would be created leading to a total tiered space of 3.88TB. I am now copying around 2TB of data onto the volume so will see how the performance goes.

You’re very welcome! Sorry I didn’t get back here sooner, work has been busy.

For a bit more of an introduction to PowerShell I’d recommend; https://github.com/PowerShell/PowerShell/blob/master/docs/learning-powershell/powershell-beginners-guide.md

On top of that, pretty much >any< recent version of PowerShell has this great awesome cmdlet called Get-Help or its alias ‘help’ (or in some cases ‘man’ although I believe on PowerShell (core) that’s now removed - not sure though)

Type it in front of any command you want to know more about and it will give more info. My personal favorite is using it like this (requires PowerShell version 3 or higher, which any Windows version above 7 will have by default)
Get-Help New-StorageTier -ShowWindow

Additionally, you can use https://docs.microsoft.com to look up the commands as well; for example: https://docs.microsoft.com/en-us/powershell/module/storage/new-storagetier?view=win10-ps

Hope this helps - and great stuff on this thread so far!

You might want to mention that creating a new Storage Space does wipe the drive from what I quickly glanced - so better make sure there is nothing on there (you DO get warned about it so pay attention :slight_smile: )

Yeah, the drives were well and truely wiped during the process. You have to delete all partitions before the drives can be pooled, and even then I had to run clean in diskpart and reboot the machine before it would work. I went back in and managed to get a bit more capacity out of the pool so I now have 4.06 TB of formatted space. Performance is hard to assess as I am still copying all my data over, but it is pegged between 110 and 120 MB/sec which is the max read speed of the source drive. I will try copying files off my NVME system drive which will give me a btter idea of the performance. Thank for those links. Powershell seems very powerful indeed, on another level to the normal command prompt.

Are you doing this over the network? At 1gbps speeds?

Nope over sata but the source drive in a 4TB seagate HDD which has a max seq read speed of about 150 MB/s so that is about the best I could hope for. All the data is now copied. I will try and get some large file copies from my nvme system drive to the tiered storage space as that will give a better indication of the performance.

1 Like

Just an update to this, Windows 10 does (at-least now) have a GUI for Tiered Storage, just search the start menu for “Manage Storage Spaces”

3 Likes

I thought they were depreciating storage spaces, so would new installs have it if windows doesn’t detect a space already active?

I tried this on my Win 10 Pro 1803 machine with two HDDs and one SSD with simple resiliency. It’s working great for about a month now. Thanks!
I just had to use "Windows Storage*" instead of "Storage Spaces*" for –StorageSubSystemFriendlyName.

Does anyone know whether data is automatically striped across multiple drives of the same tier (assuming they all have the same capacity)? Or are they just treated as a SPAN?

2 Likes

How did this project go for you? Were you happy with the results?

I was eager to get this working on Windows 10 (Pro) but the info posted here was’n’t quite detailed enough to help. So I continued to search and did find, via archive_org “Wayback Machine” a now dead site which did provide very good instructions. There was only one small minor powershell command mistake which I corrected and then it worked like a charm for my 1 ssd and 1 hdd setup. So, the real credit goes to diywhitebox_com but the following are my slightly corrected instructions:

First we’ll add all the available hard disks to the pool. The hard drives you add should not be formatted yet. You’ll need to remove any partitions from them in order for them to be added in this way. This works best when the drives are new out of the box. If re-using drives you will probably need to run “diskpart”, the “clean” command on those drives, and a system reboot before proceeding.

Launch PowerShell as an administrator to get started, then run the following:

(To see what disks are available for the space)
Get-PhysicalDisk -CanPool $True | Format-Table -Property FriendlyName, OperationalStatus, Size, MediaType

$storage = Get-StorageSubSystem
New-StoragePool -StorageSubSystemId $storage.UniqueId -FriendlyName Pool -PhysicalDisks (Get-PhysicalDisk -CanPool $true)

This should create a storage pool for you. Now you can create your tiers.

Get-StoragePool Pool | New-StorageTier –FriendlyName SSD –MediaType SSD
Get-StoragePool Pool | New-StorageTier –FriendlyName HDD –MediaType HDD

If you have just 1 SSD and 1 HDD run this command
Get-StoragePool Pool | Set-ResiliencySetting -Name Simple -NumberOfColumnsDefault 1

If you have 2 SSD and 2 HDD run this command
Get-StoragePool Pool | Set-ResiliencySetting -Name Simple -NumberOfColumnsDefault 2
Get-StoragePool Pool | Set-ResiliencySetting -Name Mirror -NumberOfColumnsDefault 1

Let’s create the virtual drive now.

$SSD = Get-StorageTier -FriendlyName SSD
$HDD = Get-StorageTier -FriendlyName HDD

You’ll want to change the size of the storage tiers in these next commands to suit your drives.

If you have just 1 SSD and 1 HDD run this command (sample - see my real Example way below)
Get-StoragePool Pool | New-VirtualDisk -FriendlyName Space -ResiliencySettingName Simple –StorageTiers $SSD, $HDD -StorageTierSizes 400GB, 900GB -WriteCacheSize 10GB

If you have 2 SSD and 2 HDD run this command (sample - see my real Example way below)
Get-StoragePool Pool | New-VirtualDisk -FriendlyName Space -ResiliencySettingName Mirror –StorageTiers $SSD, $HDD -StorageTierSizes 400GB, 900GB -WriteCacheSize 10GB

You can now either use the Windows 10 Storage Spaces GUI to format the drive (I highly recommend the GUI) or else the following powershell commands:

This will mount and format the new drive as the letter D: (so edit as needed or use the GUI)
Get-VirtualDisk Space | Get-Disk | Set-Disk -IsReadOnly 0
Get-VirtualDisk Space | Get-Disk | Set-Disk -IsOffline 0
Get-VirtualDisk Space | Get-Disk | Initialize-Disk -PartitionStyle GPT
Get-VirtualDisk Space | Get-Disk | New-Partition -DriveLetter “D” -UseMaximumSize
Initialize-Volume -DriveLetter “D” -FileSystem NTFS -Confirm:$false

EXAMPLE: For a 250GB Samsung EVO 850 and a 4TB WD Gold Enterprise HDD (can’t use full size because of computer GB math :frowning:)
Get-StoragePool Pool | New-VirtualDisk -FriendlyName Space -ResiliencySettingName Simple –StorageTiers $SSD, $HDD -StorageTierSizes 231GB, 3.5TB -WriteCacheSize 1GB

I played with various changes in size between the ssd StorageTierSizes and the WriteCacheSize and did not see any difference so 220GB, 3.5TB and 10GB respectfully seemed to work the same. I hope this helps any other searchers wanting to try this. With the above setup I can get very consistent 300MB/s transfers to my storage pool with very large dumps. Bursts of only 1-2GB go even much faster. Using a high-end NVMe ssd should result in tremendous speed improvement and I will be testing that soon.

2 Likes

Edit: Sorry for the premature question, after diving deep in the PowerShell commandlets regarding storage spaces I’ve been able to set the number of columns for the HDD Tier of the tiered storace space.
The following two commands need to be executed after creating the disk pool:
$SSD = New-StorageTier -StoragePoolFriendlyName Pool -FriendlyName SSD_Tier -ResiliencySettingName Simple -NumberOfColumns 1 -MediaType SSD
$SSD = New-StorageTier -StoragePoolFriendlyName Pool -FriendlyName HDD_Tier -ResiliencySettingName Simple -NumberOfColumns 2 -MediaType HDD

The rest should work the same.

Hello there! First of all thanks for PowerShell commands for setting up tiered storage.
I’ve been using a simple two-disc striped storage spaces volume to great success for quite a while, but recently an extra 128GB SSD has become available.
The PowerShell commands listed here are seemingly either for 1 or two disks in each tier, but might it also be possible to both use the two disks in the HDD tier in parallel (like in the 2 column simple volume) whilst also using one SSD in the SSD tier?

So far I haven’t been able to find an answer, and my PowerShell-fu is not the best it could be (yet). This forum, and it’s community seemed to be the most knowledgeable and the best place to ask :smiley:

Thanks a lot for posting this!
I’m going to try this with two SSDs (Corsair Force 3 120GB), three HDDs (two 500GB Velociraptors & one WD 1TB Green). Would there be any benefit to mirroring the SSDs instead of setting them to simple?
Thanks again for any input!