Methodology
When creating RAID-5 storage for testing, I used all available space on the disks and stipulated a stripe size of 64 KiB. For Windows/SW, there is no way to specify the stripe size, but I have read unsubstantiated claims that the stripe size is 64 KiB. For Ubuntu/HW and Windows/HW, I used the LSI storcli64 utility to create the array and configure it to use a cached I/O policy with an always-on write-back cache, physical disk cache, and adaptive read-ahead.
I tested on Ubuntu using fio performing I/O directly on the device.
I tried several versions of the Windows port of fio but could not get it to work with Storage Spaces without the process ignoring the end of the test interval, becoming unkillable, and requiring a reboot. Instead, I performed all tests on Windows using DiskSpd. I created a file for DiskSpd that filled up the entire test volume on an exFAT file system. In the case of Storage Spaces, the software is aware of what blocks on the virtual disk contain data (i.e., have been written to since creation) and so I filled the file with random data before testing. Otherwise, read tests of any kind would measure throughput at several gigabytes per second.
When a new array initialized its parity after creation, I waited until it was complete before testing.
I tested six different I/O patterns. Each test was preceded by 15 seconds of no activity, a 30-second ramp-up, and a 300-second test interval. Each set of six tests was performed 20 times. Each I/O pattern is named and described as follows:
I/O Pattern | Description |
---|---|
randread4ki | Random reads of 4 KiB at 4 KiB boundaries with queue depth of 64 from two threads |
randread64ki | Random reads of 64 KiB at 64 KiB boundaries with queue depth of 64 from two threads |
randwrite4ki | Random writes of 4 KiB at 4 KiB boundaries with queue depth of 64 from two threads |
randwrite64ki | Random writes of 64 KiB at 64 KiB boundaries with queue depth of 64 from two threads |
seqread | A sequential read of 4 MiB blocks with queue depth 16 from a single thread |
seqwrite | A sequential write of 4 MiB blocks with queue depth 16 from a single thread |
Continue to the next page for a discussion of the test results.