Storage Spaces - mix SSD with HDD
This somewhat extends TiernanO's answer - I've struggled to find good detailed background on all this, so I thought I'd write it up nicely for everyone:
SSDs can be used to speed up your pools, but it only works in certain situations and there's a number of conditions that must be adhered to.
Firstly, you can't simply just add SSDs to an existing pool and expect it to speed up your system. In fact, if you're mixing SSDs with HDDs in the same pool you're basically wasting the SSDs because each of your files is split up over the other disks, so half of your file might be on a SSD and the other half on the HDD -- so you're still going to need to wait for the HDD to spin up and seek the data before it can actually be used by your computer even though the SSD found the first half of the data long ago. [this is an oversimplification, in fact the data is split to different disks on a block level, not a file level]
So, you probably don't want to mix SSDs and HDDs in the same virtual disk -- have pools composed of only HDDs or only SSDs, not both. Incidentally, it's okay to have them in the same storage pool, just not working on the same virtual disk.
Now, getting back to your question -- yes, it's possible to use SSDs to speed things up by using Storage Space's 'journaling' feature -- but there's a few conditions:
- You must be using a virtual disk with a resiliency setting of 'Parity', journal disks cannot be used with 'Simple' or 'Mirror' virtual disks
- You must have at least two SSDs -- you can't override this (in the background, they're configured as a Mirror Space in itself in case one fails)
- All space on the SSD must be dedicated to journaling, you'll not be able to use either of the SSDs to store data
- None of this can be configured from Windows' UI in Windows 8 or Server 2012 -- you have to do it manually using PowerShell
- If you've manually increased the number of parity spaces in your pool then you should equally increase the number of journal disks (e.g. if you're using the default 1 parity space, you need 2 SSDs. If you've got 2 parity spaces, you need 4 SSDs etc.).
- It may be obvious, but adding Journal disks only increases the speeds of data writes to the virtual disk -- data read speeds will be unaffected
Assuming you're happy with those restrictions, here's what you'll need to do in an elevated PowerShell window:
For this example, I'm assuming you've not yet created your storage pool or virtual disks -- if you've got an existing set modify the instructions to suit.
# See what disks you've got available so you can set the below variables
Get-StoragePool -IsPrimordial $true | Get-PhysicalDisk `
| Where-Object CanPool -eq $True
# Tell Windows which disk is a traditional HDD and which is an SSD
$HDDs = "PhysicalDisk1", "PhysicalDisk2", "PhysicalDisk3"
$SSDs = "PhysicalDisk4", "PhysicalDisk5"
# Create a new storage pool (these are fairly default options)
New-StoragePool -FriendlyName "Your Storage Pool" `
-PhysicalDisks (Get-PhysicalDisk $HDDs) `
-StorageSubSystemFriendlyName "Storage Spaces*" `
-ResiliencySettingNameDefault Parity
# Add in your two (or more) Journal disks
Add-PhysicalDisk -StoragePoolFriendlyName "Your Storage Pool" `
-PhysicalDisks (Get-PhysicalDisk $SSDs) -Usage Journal
# Create the virtual disk and get it ready for use
New-VirtualDisk -FriendlyName "Parity Protected & Journaled Data" `
-StoragePoolFriendlyName "Your Storage Pool" -NumberOfColumns 3 `
-ProvisioningType Thin -ResiliencySettingName Parity -Size 2TB `
| Initialize-Disk -PassThru -PartitionStyle MBR `
| New-Partition -AssignDriveLetter -UseMaximumSize `
| Format-Volume -FileSystem NTFS `
-NewFileSystemLabel "Parity Protected & Journaled" -Confirm:$false
You can now check it all worked using a Get-PhysicalDisk
:
FriendlyName CanPool OperationalStatus HealthStatus Usage Size
------------ ------- ----------------- ------------ ----- ----
PhysicalDisk1 False OK Healthy Auto-Select 10.25 GB
PhysicalDisk2 False OK Healthy Auto-Select 10.25 GB
PhysicalDisk3 False OK Healthy Auto-Select 10.25 GB
PhysicalDisk4 False OK Healthy Journal 10.25 GB
PhysicalDisk5 False OK Healthy Journal 10.25 GB
Sources:
- TechNet Forums: Slow performance Storage pool
- TechNet Wiki: Storage Spaces - Designing for Performance
- Random blog post: Relative Performance of Parity .vs. Mirror in Storage Spaces
I think this is improved on Windows server 2012 r2.
- Write-back cache
Storage Spaces can use existing solid-state drives in the storage pool to create a write-back cache that is tolerant of power failures and that buffers small random writes to solid-state drives before later writing them to hard disk drives.
- What value does this change add?
Small random writes often dominate common enterprise workloads, and they can impact the performance of other data transfers that are taking place. By using solid-state drives (which excel at random access) for a write-back cache, Storage Spaces can reduce the latency of the random writes and also greatly reduce any impact on the performance of other data transfers.
- What works differently?
The write-back cache is transparent to administrators and users, and it is created on all new virtual disks if there are a sufficient number of solid-state drives in the storage pool, as determined by the following requirements for the associated storage space:
- Simple spaces require one solid-state drive
- Two-way mirror spaces and single-parity spaces require two solid-state drives
- Three-way mirror spaces and dual parity spaces require three solid-state drives
The write-back cache works with all types of storage spaces, including storage spaces with storage tiers.
Newly created storage spaces automatically use a 1 GB write-back cache by default when the storage pool contains enough physical disks with MediaType set to SSD or Usage set to Journal to support the specified resiliency setting. If there aren’t enough physical disks with these settings, the write-back cache size is set to 0, except for parity spaces, when it’s set to 32 MB.
It depends, really. There's at least 4 ways you may utilize SSDs in a mixed setup, i.e. when there are both HDDs and SSDs:
- You can just blindly add them all to the pool. This makes no sense whatsoever, because data will spread randomly across your disks, no matter how write-intensive it is. Note: this is the default setting, of course.
- You can use the SSDs for journaling with parity (RAID5/6) spaces, i.e. caching during writes. This I would recommend wholeheartedly if parity spaces didn't suck so hard. No, really, it is BAD, avoid at all costs. For mirrored spaces a dedicated journal is useless as there's no parity involved, just a 1:1 copy.
- You can set up tiered storage and let Windows automatically move frequently-accessed data to the faster SSDs. This may work decently, but it's really hard to benchmark so I can't say if it's good or bad.
- You can also create 2 separate arrays, put the 2 SSDs in a 2-way mirror for program files and other write-intensive stuff, and put the 4 HDDs in another 2-way mirror for everything else. This is the one I recommend for you.
If you're curious why I'm so confident, it's because I've spent a few weeks (not kidding) testing the hell out of Storage Spaces. Check out my in-depth benchmarking series for all the numbers that back my statements:
- Storage Spaces Performance Analysis - Part 1
- Storage Spaces Performance Analysis - Part 2
- Storage Spaces Performance Analysis - Part 3
Cheers.
There is very little documentation on this, but i did read somewhere that Storage Spaces has the option to add a disk to a pool for Journaling. I cant find the original article, but if you look at the Add-PhysicalDisk cmdlet, under Usage, there is an option for Journal... When I read about it, the guy mentioned that he used an SSD as a journal disk, and added it to a pool of 8 2Tb drives, and read and write increased by 40+%... Your Mileage may Vary, but it might be worth a shot...
As a third party option, you may also want to have a look at FancyCache. You can use memory and SSDs as a cache for your slower Media. I used it before, and it worked well, just have not had a chance to re-install since moving to Server 2012...