Why does my flash drive speed slow down when copying?
This behaviour is not specific to your flash drive, you can see this with hard drives as well. It has to do with the caching mechanism most operating systems and disks employ to speed up small writes.
The 20mb/s you see is the data being written to the disk cache (usually quick but small memory). Once this cache is full it must be flushed to disk - and now you're being bottlenecked by the slower disk.
Example 1: The effect is really pronounced when you have a controller with a large cache (like good RAID5 controller) where ~500mb of data can be cached quickly before it must be flushed to the disk.
Example 2: You can see the cache at play if you pull the flash drive out at the same time the file copy "finished". At this point in time your file is split between the disk and the cache - so the copy is "finished" as far as the operating system is concerned but the disk controller still needs to write what's left in the cache to the disk. If you put the flash drive back in and inspect the file you'll see it's not all there.
Disclaimer: These examples won't work if you don't have write caching enabled in your operating system/on the disk.
Further, if it's not disk caching at work then it's likely that what you're seeing is an effect of fragmentation. As the disk gets fuller and fuller less contiguous free space is available and the file system has to work harder to find places to put your files.
While caching does cause some of this, it is not the only factor. If caching were the only factor, then we would expect the write speed to quickly drop from several hundred MB/s to the drive's actual write speed very rapidly, and stay there for the rest of the write. However, this is not what I have observed when performing large transfers to and from the disk (e.g. burning boot images). Instead, what I observe is that the speed gradually decreases over the course of the entire operation.
This slowdown is caused by data remanence on the flash chip(s) used to store the data necessitating that some of the blocks be written to more than once.
Inside a flash chip, there are block of data that can be written to. When writing, there are only two things that the computer can do: it can erase an entire block, or change some (or all) of the bits in a block from 0 to 1.
However, some of those block are better than others, especially so in lower-quality flash drives, and as a result when writing new data to it, some of the bits can sometimes switch back to 0 by themselves right after being written, and don't change. Thus, when writing to a block, the OS needs to check to make sure that all of the data was written correctly, and if it wasn't it has to redo the block by writing the same data to the same block two or three times until the data sticks.
So, when your computer is writing a bunch of data to the flash drive, here is a (not completely accurate, but good enough) explanation for how it does that:
- Take the first set of blocks to be written, and write them all.
- Read back all of the blocks we just wrote, and make a list of the ones that don't match
- Write the next set of blocks, along with the ones that weren't written correctly last time.
- Repeat 2-3 until all of the blocks have been written correctly.
When the computer is writing to the drive, it is reporting the rate at which it is writing blocks to the drive for the first time. Since it will also have to rewrite earlier blocks at the same time, the total throughput that can be used for virgin blocks goes down as the number of rewrites that also need to happen increases. Thus, the apparent write speed decreases over time.