为什么我的闪存驱动器速度在复制时会变慢?

为什么我的闪存驱动器速度在复制时会变慢?

复制几分钟后,速度就越来越慢。为什么?

例如,它以 20 MByte/sec 开始,并且当它结束时,它的速度为 @10 MByte/s。

各种文件,大、小等等。

更新:问题涉及各种操作系统,因此这是一个“一般问题”

答案1

这种现象并非闪存驱动器所特有,硬盘驱动器也会出现这种情况。这与大多数操作系统和磁盘为加快小写入速度而采用的缓存机制有关。

您看到的 20mb/s 是写入磁盘缓存(通常速度很快但内存较小)的数据。一旦此缓存已满,就必须将其刷新到磁盘 - 现在您正受到较慢磁盘的瓶颈。

示例 1:当您拥有一个带有大缓存的控制器(例如好的 RAID5 控制器)时,效果非常明显,其中~500mb 的数据可以在必须刷新到磁盘之前快速缓存。

示例 2:如果您在文件复制“完成”的同时拔出闪存驱动器,则可以看到缓存在起作用。此时,您的文件在磁盘和缓存之间拆分 - 因此就操作系统而言,复制已“完成”,但磁盘控制器仍需要将缓存中剩余的内容写入磁盘。如果您将闪存驱动器放回原处并检查文件,您会发现它并不全部存在。

免责声明:如果您的操作系统/磁盘中未启用写入缓存,则这些示例将不起作用。

此外,如果不是磁盘缓存正在工作,那么您看到的很可能是碎片化的影响。随着磁盘越来越满,可用的连续可用空间越来越少,文件系统必须更加努力地寻找放置文件的位置。

答案2

虽然缓存确实会导致部分问题,但它并不是唯一因素。如果缓存是唯一因素,那么我们预计写入速度会迅速从几百 MB/s 降至驱动器的实际写入速度,并在写入的其余时间保持在该速度。然而,在执行大量数据往返磁盘传输(例如刻录启动映像)时,我并没有观察到这种情况。相反,我观察到的是,速度在整个操作过程中逐渐降低。

这种速度减慢是由于用于存储数据的闪存芯片上的数据残留导致的,因此需要多次写入某些块。

闪存芯片内部有一块可以写入的数据块。写入时,计算机只能做两件事:擦除整个块,或将块中的部分(或全部)位从 0 更改为 1。

但是,有些块比其他块好,尤其是在质量较差的闪存驱动器中,因此在向其中写入新数据时,某些位有时会在写入后自行切换回 0,并且不会发生变化。因此,在向某个块写入数据时,操作系统需要检查以确保所有数据都已正确写入,如果不正确,则必须通过将相同的数据写入同一个块两到三次来重做该块,直到数据保留下来。

因此,当您的计算机将大量数据写入闪存驱动器时,这里有一个(不完全准确,但足够好的)解释,说明它如何做到这一点:

  1. 取出第一组要写入的块,并将它们全部写入。
  2. 读回我们刚刚写的所有块,并列出不匹配的块
  3. 写下一组块,以及上次未正确写入的块。
  4. 重复 2-3,直到所有块均已正确写入。

当计算机向驱动器写入数据时,它会报告首次向驱动器写入数据块的速率。由于它还必须同时重写较早的数据块,因此随着需要进行的重写次数增加,可用于原始数据块的总吞吐量会下降。因此,表观写入速度会随着时间的推移而降低。

答案3

我在 OSX 上遇到了这个问题,但后来设法显著改善了这个问题。首先,我阻止了 Spotlight Index 尝试索引目标驱动器。然后,我停止了目标驱动器上的缩略图生成(复制 55K 张图片)

最后我放弃了使用 GUI,转而使用 rsync -a source target 命令行

您可能可以针对其他操作系统执行类似的操作。

答案4

当文件写入驱动器(无论是闪存 USB 驱动器还是硬盘驱动器)时,不会/永远不会读回数据以查看其是否匹配。这将花费很长时间。写入验证由硬件完成(循环冗余校验),如果发生错误,则硬件检测到错误,并将错误发回应用程序。发生的停滞和减慢(甚至暂停)是由于 CPU 写入速度快于设备处理速度造成的。您不会发现这种情况发生在内置硬盘驱动器上。您永远不会看到 Windows 操作系统上真正发生了什么,但在 Linux 上,您实际上可以看到 CPU 暂停,直到 USB 硬件说可以继续。

相关内容