Hi all, thought I'd share my experiences with transferring large amounts of data for the first time. After all, the best time to write about learning is whilst you're doing it so that other people can follow along with you.
***NOTE: ALL OF THESE WERE COMPLETED ON AN EMPTY SERVER***
TL;DR:
Use Krusader, my config is included as a screenshot.
*Remove the parity drive before starting the transfer - but only do this on a virgin build as you lose any resilience.
Turbo-write makes no difference if you have removed parity. It is used in the creation of the parity drive at the expense of spinning up all drives. It is probably worthwhile turning it on for the first time you create your parity drive, then turning it off to save power/drive longevity. (Thanks to Jorgen for this info)
Disable the cache for a more consistently-high throughput over the duration of the transfer. (Thanks to ChatNoir for this info).
Full-fat:
Krusader makes things super easy to transfer files and Spaceinvader One's video was helpful, but at 4:06, it differs from how it's done in reality now. I tried just continuing like the YouTube comments suggested, but I couldn't find some of the files specified in the video - namely the /UNRAID one, so I followed this helpful guide by Arcaeus and then it started working. The image attached shows my current config and should work at time of writing for anyone setting it up (17/11/2020). The only thing I couldn't get working was the /FLASH section. I'll investigate and update this thread later.
The major one for speed improvements, remove the parity drive before starting. Stopping the 'sync' in the 'Main' menu doesn't work. You have to stop the array, remove any parity drives you may have and start the array again before copying. **Please note, removing the parity drive(s) will remove any protection of your data, so I would only recommend doing this on a virgin build where you are transferring large amounts of data for the first time**. When doing this, my write speeds changed from between 20MB/s and 60MB/s to between 150MB/s and 180MB/s. To put this into perspective, I have 20TB of data to transfer from two external USB HDDs. At 20MB/s it would have taken me 11 days to transfer. At 60MB/s it would have taken me 4 days to transfer. At 150MB/s it will take me just under 2 days to transfer.
Obviously that 150MB/s is a 'per disk' figure and, because I've removed parity (at least I think it's because I've removed parity), I've often seen at least two disks being written to simultaneously at that 150MB/s figure. With parity (and, again, I think it's because of the parity disk), you're limited to the speed of the single parity disk (roughly between 150MB/s and 180MB/s but this depends on the speed of your disk).
All of the above equates to a MAJOR reduction in the amount of time it takes to transfer large amounts of data and I would recommend this to anyone just starting out. I estimate that removing the parity drive has reduced my transfer time from between 11 and 4 days to about 13 hours.
Once your data is transferred, stop the array, add the parity disk, and let it rebuild. Once the parity has been built, you can then remove the other drives you are using as a store, shuck them out of the cases, and then add them to your array (at least that's what I plan on doing).
I also enabled Turbo-Write by going into Settings -> Disk Settings, and changing the "Tunable (md_write_method)" to "reconstruct write". However, I'm not sure what difference this has really made to the speed of the transfer as I did it at the same time as point 2 and point 2 made such a huge difference, any improvements are being masked by it. Turbo-write makes no difference in the transfer of data to the array. It only makes a difference when creating the parity drive. It's probably worth while putting on the first time you create your parity drive, then turning it off afterwards to save power/your disk longevity. (Thanks to Jorgen for this info).
I have found that setting the "Use Cache" option for the Share to 'No' actually improves throughput over the duration of the large transfer. Not sure why this is, and there's still a few questions around it below, but I paused my transfer in Krusader, let 'Mover' move everything remaining, then changed my option in the Share from 'Yes' to 'No' in the "Use Cache" option, then started the transfer up again. In this circumstance, I'm seeing a slower initial transfer (as it's not using the much faster SSD in the cache), but it's more consistent in my experience and it's actually using the 3 disks simultaneously. My guess for this is that the 'Mover' process isn't as efficient as it could be at transferring data from the cache to the array which, adding in the fact that it can't be set to 'on' permanently for a set period, reduces the longer-term throughput of the whole transfer. But this is just a guess at this point.
Ongoing Questions / Issues
Not sure why the /FLASH section isn't working. I'll post a screenshot when my data has finished transferring. I don't want to upset it.
I wish there was an option to set the 'Mover' for continuous use. i.e. whenever it sees data in the cache that should be in the array, it moves it automatically and it keeps doing that until the only data left in the cache is what should be there. So far I've only seen an option to schedule it every hour, but my cache fills up *way* quicker than that. Sometimes I've noticed that it isn't working and I have to manually set it to work, any idea if it can be set to 'always on' for a specific period of time or if this feature can be implemented?
The theoretical max throughput of the 3 disks in my array without parity is around 600MB/s (going off 200MB/s for a 7200RPM disk x 3 disks), but I very rarely see that getting maxed out. What is the reason behind this? I understand that there is likely overhead in terms of creating new directories and starting the copying process etc, but I'm rarely getting 400MB/s? The intermediary source shouldn't be a problem as it's a SATA SSD (cache drive) and I'm generally seeing about 300-400MB/s on that when it's capable of a sustained 550MB/s read and 520MB/s write (although I'm not sure if it's capable of both simultaneously and that could account for some of the problem?) EDIT: Please see the first section for update.
My Share is set to 'Yes' with regard to 'Use Cache', which should mean that, once the cache drive is full, it automatically starts sending data to the array instead. That doesn't appear to be happening. My transfer dialogue boxes in Krusader pop up with a 'This drive is full' notification asking me to 'cancel', 'retry', etc. I can retry after a short while once Mover has transferred some files to the array, but this doesn't appear to be working as per the description in the hint section. Any ideas what this could be? Is it that it's using the 'docker' share option rather than my user share option? This, combined with points 2 and 3 means that transferring large amounts of data initially is taking longer than it should. Is it work simply disabling the use of the cache to start with? EDIT: Please see the first section for update.
I have 2 x 500GB Samsung 860 EVO SSDs in my cache drive, but I'm only seeing about 500MB of available storage. What is going on here? It's like the two are in RAID 1 or something. Is there any way this can be changed? I'd rather it be RAID 0 for the initial transfer and then change it back to RAID 1 afterwards. Appreciate it may not actually be *RAID* in this instance, but the premise is similar.
Thanks for reading my essay.