复制到U盘真的很慢吗?

Elo*_*off 60 usb

当我将文件复制到 USB 设备时,它比在 Windows(相同的 USB 设备,相同的端口)中花费的时间要长得多,它比 USB 1.0 的速度(1MB/s)快,但比 USB 2.0 的速度(12MB/s)慢得多。复制 1.8GB 需要我超过 10 分钟(应该是 < 3 分钟)。我有两个相同的 SanDisk Cruzer 8GB 记忆棒,我对两者都有相同的问题。我在邻近端口有一个超级天才 32GB USB SSD,它以预期的速度工作。

我似乎在 GUI 中看到的问题是进度条几乎立即进入 90%,完成到 100% 的速度稍慢,然后在那里挂了 10 分钟。此时中断复制似乎会导致文件尾端损坏。如果我等待它完成复制成功。

有任何想法吗?dmesg 输出如下:

[64059.432309] usb 2-1.2: new high-speed USB device number 5 using ehci_hcd
[64059.526419] scsi8 : usb-storage 2-1.2:1.0
[64060.529071] scsi 8:0:0:0: Direct-Access     SanDisk  Cruzer           1.14 PQ: 0 ANSI: 2
[64060.530834] sd 8:0:0:0: Attached scsi generic sg4 type 0
[64060.531925] sd 8:0:0:0: [sdd] 15633408 512-byte logical blocks: (8.00 GB/7.45 GiB)
[64060.533419] sd 8:0:0:0: [sdd] Write Protect is off
[64060.533428] sd 8:0:0:0: [sdd] Mode Sense: 03 00 00 00
[64060.534319] sd 8:0:0:0: [sdd] No Caching mode page present
[64060.534327] sd 8:0:0:0: [sdd] Assuming drive cache: write through
[64060.537988] sd 8:0:0:0: [sdd] No Caching mode page present
[64060.537995] sd 8:0:0:0: [sdd] Assuming drive cache: write through
[64060.541290]  sdd: sdd1
[64060.544617] sd 8:0:0:0: [sdd] No Caching mode page present
[64060.544619] sd 8:0:0:0: [sdd] Assuming drive cache: write through
[64060.544621] sd 8:0:0:0: [sdd] Attached SCSI removable disk
Run Code Online (Sandbox Code Playgroud)

ish*_*ish 33

为什么在 Linux 中复制到我的 USB 驱动器如此之慢(而在 Windows 中更快)?

原因 1. 文件缓存可以使写入看起来更慢或更快

我似乎在 GUI 中看到的问题是进度条几乎立即进入 90%,完成到 100% 的速度稍慢,然后在那里挂了 10 分钟。

您需要了解的一件事是文件缓存。Linux(和 Windows)将使用其他“空”RAM 来缓存读/写操作,并使它们在后续访问时更快。将复制操作缓存到慢速设备会导致您看到的行为——“快速完成”实际上是写入缓存,然后它变慢并停止,因为缓存中的数据(同步)实际刷新到慢速设备是需要很长时间。如果您在那时中止,则数据已损坏(如您所见),因为同步从未完成。

Windows 中的此类复制可能看起来更快(包括报告的 MB/秒速度),因为有时 Windows不会等待同步,并在数据写入缓存后立即声明作业已完成。

原因 2. 写入大量文件,尤其是小文件,速度很慢

复制 1.8GB

由于闪存和文件系统的工作方式,写入非常大的文件时可实现最快的吞吐量(速度)。写入大量小文件,甚至包含大量小文件的混合数据都会大大减慢进程速度。这也会影响硬盘驱动器,但影响程度较小。

原因3. U盘和SSD的写入速度无法比拟

我在邻近端口有一个超级天才 32GB USB SSD,它以预期的速度工作。

  • 花园式 U 盘通常由串行(顺序)写入的闪存芯片组成,并且没有任何自己的缓存。

  • 另一方面,SSD 包含一个控制器,该控制器可并行写入闪存芯片,从而使吞吐量比 USB 记忆棒提高 2 倍或更多。

    • 如果你的 32GB SSD 有 4x 8GB 芯片,它在任何写操作时仍然比 U 盘快 4 倍。
    • SSD包含 RAM 缓存(如硬盘),因此它可以快速将传入的数据存储在缓存中并告诉操作系统它已完成,同时它仍然必须实际将该数据写入闪存。
  • 因此,对于一个大文件,我们假设的 4x 结构的 32GB GB 的速度将是原来的 4 倍;对于许多小文件,它会快 10 倍或更多,因为它可以智能地将它们存储在其缓存中。


综上所述,这就是为什么文件复制到 U 盘在 Linux 中可能会显得较慢的原因。它实际上是因为硬件/驱动程序问题还是其他原因而变慢了....

正确比较 Linux 和 Windows 之间的写入速度

  • 首先,忘记SSD,因为原因3。它就像橘子和苹果。
  • 要消除原因 1(缓存)和原因 2(小文件)的影响,您需要使用一个大文件进行测试,该文件大于测试系统上的 RAM 量。
  • 在 Linux 中,您可以使用 来创建它dd if=/dev/urandom of=largetest bs=1M count=7500,这会为您提供一个 7500 MB 的测试文件。假设您的系统内存不足 4GB 左右,这就足够了。将其复制到新格式化的 Sandisk 8GB 记忆棒,并计时。
  • 在 Windows 中重新启动,然后largetest从 USB 记忆棒复制到您的硬盘。再次重新启动(将其从缓存中删除)。然后格式化 U 盘(相同的 vfat/FAT32!),并largetest从硬盘复制到 U 盘。
  • 时代如何比较?

  • @zrajm 确实如此。然而,对于像我这样遇到同样问题的人来说,这是**非常**有帮助的。 (5认同)
  • cc:@Eloff Re *原因 1*:是的,缓存同步肯定会影响明显的写入时间。但是仅缓存会解释为什么它*挂在那里 10 分钟*??我认为我们需要来自 OP 的更多细节。Re *原因 2*:为什么您认为此传输包含许多小文件?我认为 OP 没有提供有关此 1.8GB 传输的任何详细信息,是吗?Re *原因 3*:是的,SSD 是一个不同的野兽。它也可能通过 SATA 而不是 USB 连接。我认为 OP 只是说错了,将 USB 记忆棒称为 SSD。但同样,除非我们从 OP 获得更多详细信息,否则无法知道。 (2认同)
  • 这个答案公然忽略了问题的制定方式。这个问题清楚地谈到了*一个大*文件,以及中断复制会导致文件损坏的事实。 (2认同)

Kri*_*lla 11

现在是 2019 年,我仍然遇到同样的问题。所以我想我在互联网上搜索解决方案。我发现以下页面建议一个:https : //gist.github.com/2E0PGS/f63544f8abe69acc5caaa54f56efe52f

它说:

在控制台中执行以下命令,看看它是否为您解决了问题。您可能需要sudo su首先获得所需的权限。

echo $((16*1024*1024)) > /proc/sys/vm/dirty_background_bytes
echo $((48*1024*1024)) > /proc/sys/vm/dirty_bytes
Run Code Online (Sandbox Code Playgroud)

如果它有效,您可以通过在/etc/rc.local文件末尾粘贴两行来使此更改在重新启动后保持不变。

对我来说,它有以下效果:

之前将大文件复制到 USB 驱动器会开始非常快(如 60 MB/s),然后变得越来越慢(< 10 MB/s),直到它看起来永远不会完成。

现在它开始较慢,但变得越来越快,并且比以前更快完成。所以它似乎确实“解决”了问题,或者至少有积极的影响。

  • 这些 `echo $((16*1024*1024)) &gt; /proc/sys/vm/dirty_background_bytes echo $((48*1024*1024)) &gt; /proc/sys/vm/dirty_bytes` 两个命令正好让复制变得非常快在 Ubuntu 18.04 中,x86_64 Linux 5.3.0-40-generic。 (2认同)
  • 在 ubuntu 中,由于 `/etc/rc.local` 不存在,您可以在 `/etc/sysctl.conf` 文件末尾添加这 **2 行**。第一行:`vm.dirty_bytes=50331648` 第二行:`vm.dirty_background_bytes=16777216` [来源](https://gist.github.com/2E0PGS/f63544f8abe69acc5caaa54f56efe52f#gistcomment-3541494) (2认同)

小智 9

找到修复我所做的只是卸载,移除驱动器,然后sudo modprobe ehci_hcd在终端中运行。sudo modprobe ehci_hcd当我插入驱动器时插入驱动器和agian 并且哇 20/mbs 认为我会分享。希望我不必每次都这样做……但这并不难……

https://bugs.launchpad.net/ubuntu/+source/linux/+bug/177235 说他们修复了这个错误。

  • @irrationalJohn 我没有提供答案,我只是清理了它。其次,仅仅因为错误报告是旧的,并不意味着它仍然有效。它正在根据 [this](https://bugs.launchpad.net/ubuntu/+source/linux/+bug/500069) 进行分类 (4认同)

小智 7

我认为这是端口问题的可能性非常低。这更有可能是 LINUX(或 linux 配置)问题 - 谷歌搜索,你会发现数以千计的关于 linux/ubuntu 中慢速 USB 的问题报告。对我来说,它几乎是 linux 的一个亮点——我现在有一个 Ubuntu 12.04 LTS 并且仍然有这个问题(所以我宁愿使用 Win7 设置——主要/仅因为这个)。这个问题(或具有类似症状的问题)已经存在好几年了,显然没有解决办法。在这段时间里,我尝试了几台带有几个不同 ubuntu 版本(默认配置)和 2-3 个不同 USB 记忆棒的物理 PC....


小智 6

umount如果设备已经自动挂载,只需将其手动挂载到/mnt/foldername.

就我而言,

umount /media/usb0
mount /dev/sdb1 /mnt/sam
Run Code Online (Sandbox Code Playgroud)

之后,它的应对速度非常快。

  • 这对我的情况没有任何影响。此外,如果没有一些关于*为什么*这应该有所作为的理论,这并不是一个真正的解决方案。 (21认同)