我正在使用 1.5TB Seagate USB 驱动器,格式化为 NTFS,连接到 Linux 计算机。
我正在将一个 70GB 的文件复制到驱动器。
我注意到副本的文件大小开始以较低的速率增加。
一开始,文件以大约 19MB/s 的速度增长
现在,目标文件大小为 60GB,增长率约为 5MB/s
哪些因素可能导致这种情况?
答案1
我猜测它是缓存(或者如果你愿意的话,也可以是缓冲区)。
第一个数据块以非常快的速度写入缓存(尽量少写入磁盘)。缓存填满后,传输速率会下降到实际的磁盘传输速率(因为数据从缓存空间写入磁盘后,缓存中就会有可用空间)
您看到的速度逐渐降低可能是整个传输过程中的平均速度。传输时间越长,实际速度越低的传输百分比就越高,因此平均传输速率就越低。
都说一张图片胜过千言万语,这里就有一张。
蓝线是实际传输率,红线是自开始以来的平均值。(这些只是我凭空捏造的示例数字)。
答案2
嗯,很难说。
对源和/或目标执行其他操作,其中一个或另一个上存在碎片磁盘空间。它对每个副本的行为是否完全相同?
答案3
我发现这个问题,所有新的绿色和低功耗驱动器都喜欢时不时地停下来。
答案4
除了上述答案中提到的明显的缓存方面之外,Linux 处理 USB 存储设备的方式与处理本地存储设备的方式不同。
当您将数据传输到“经典”磁盘(通过 SATA 内部连接或通过 eSATA 外部连接)时,Linux 内核使用 DMA 模式,这意味着整个传输过程直接从 RAM 到磁盘控制器完成,而不涉及 CPU。
这就是 SATA/eSATA 传输速度很快的原因。
但是,当您通过 USB 连接同一磁盘时,每千字节的数据将被拆分为 64 字节数据包,这些数据包在您的计算机和 USB 磁盘盒中的 USB 控制器之间进行交换。这必须使用 CPU 来完成,因此不能在 DMA 模式下进行。
这就是 USB 速度较慢的原因。
你还应该意识到,Linux 在许多方面(不仅仅是磁盘/文件系统相关)和许多层面上缓存数据。有超过 100 种不同的缓存。
因此,您尝试发送到 USB 磁盘的文件越大,此过程中填充的缓存就越多。这正是传输速度非线性变慢的原因。