USB 3 写入速度慢

USB 3 写入速度慢

在 Linux 上写入我的 USB 3 拇指驱动器 (SanDisk Extreme SDCZ80-064G-FFP) 非常慢:1 GB 需要超过 200 秒。使用Windows(同一台计算机上的双启动),可以在大约8秒内复制相同的1GB文件。该棒采用 FAT 格式(它已预先格式化,我没有更改它),我想保持这种方式,因为我也在 Windows 上使用它,

我该如何修复它?我可以执行哪些步骤来诊断导致此问题的原因?

我正在运行内核版本为 4.5.4-1 的 Manjaro/Arch。

编辑: 首先:当我尝试使用-o big_writes.抱歉!

我正在添加评论中提到的命令的输出。我认为这些都没有问题。

journalctl -f连接驱动器、安装驱动器并写入一些数据时的输出:

Mai 23 20:32:37 manjaro kernel: usb 2-6: USB disconnect, device number 7
Mai 23 20:32:39 manjaro dbus[608]: [system] Activating via systemd: service name='org.freedesktop.Avahi' unit='dbus-org.freedesktop.Avahi.service'
Mai 23 20:32:39 manjaro dbus[608]: [system] Activation via systemd failed for unit 'dbus-org.freedesktop.Avahi.service': Unit dbus-org.freedesktop.Avahi.service not found.
Mai 23 20:32:41 manjaro kernel: usb 2-6: new SuperSpeed USB device number 8 using xhci_hcd
Mai 23 20:32:41 manjaro kernel: usb-storage 2-6:1.0: USB Mass Storage device detected
Mai 23 20:32:41 manjaro kernel: scsi host12: usb-storage 2-6:1.0
Mai 23 20:32:41 manjaro mtp-probe[3627]: checking bus 2, device 8: "/sys/devices/pci0000:00/0000:00:14.0/usb2/2-6"
Mai 23 20:32:41 manjaro mtp-probe[3627]: bus: 2, device: 8 was not an MTP device
Mai 23 20:32:42 manjaro kernel: scsi 12:0:0:0: Direct-Access     SanDisk  Extreme          0001 PQ: 0 ANSI: 6
Mai 23 20:32:42 manjaro kernel: sd 12:0:0:0: [sdc] 122544516 512-byte logical blocks: (62.7 GB/58.4 GiB)
Mai 23 20:32:42 manjaro kernel: sd 12:0:0:0: [sdc] Write Protect is off
Mai 23 20:32:42 manjaro kernel: sd 12:0:0:0: [sdc] Mode Sense: 53 00 00 08
Mai 23 20:32:42 manjaro kernel: sd 12:0:0:0: [sdc] Write cache: disabled, read cache: enabled, doesn't support DPO or FUA
Mai 23 20:32:42 manjaro kernel:  sdc: sdc1
Mai 23 20:32:42 manjaro kernel: sd 12:0:0:0: [sdc] Attached SCSI removable disk
Mai 23 20:32:43 manjaro dbus[608]: [system] Activating via systemd: service name='org.freedesktop.Avahi' unit='dbus-org.freedesktop.Avahi.service'
Mai 23 20:32:43 manjaro dbus[608]: [system] Activation via systemd failed for unit 'dbus-org.freedesktop.Avahi.service': Unit dbus-org.freedesktop.Avahi.service not found.
Mai 23 20:32:52 manjaro sudo[3667]: user : TTY=pts/1 ; PWD=/home/user ; USER=root ; COMMAND=/usr/bin/mount /dev/sdc1 /mnt/
Mai 23 20:32:52 manjaro sudo[3667]: pam_unix(sudo:session): session opened for user root by (uid=0)
Mai 23 20:32:52 manjaro sudo[3667]: pam_unix(sudo:session): session closed for user root
Mai 23 20:33:11 manjaro sudo[3676]: user : TTY=pts/1 ; PWD=/home/user ; USER=root ; COMMAND=/usr/bin/dd bs=1M count=1024 if=/dev/zero of=/mnt/test conv=fdatasync status=progress
Mai 23 20:33:11 manjaro sudo[3676]: pam_unix(sudo:session): session opened for user root by (uid=0)
Mai 23 20:35:01 manjaro anacron[2235]: Job `cron.daily' started
Mai 23 20:35:03 manjaro anacron[2235]: Job `cron.daily' terminated
Mai 23 20:35:45 manjaro sudo[3676]: pam_unix(sudo:session): session closed for user root

输出dmesg

[ 2507.302345] usb 2-6: new SuperSpeed USB device number 8 using xhci_hcd
[ 2507.317395] usb-storage 2-6:1.0: USB Mass Storage device detected
[ 2507.317758] scsi host12: usb-storage 2-6:1.0
[ 2508.319922] scsi 12:0:0:0: Direct-Access     SanDisk  Extreme          0001 PQ: 0 ANSI: 6
[ 2508.333123] sd 12:0:0:0: [sdc] 122544516 512-byte logical blocks: (62.7 GB/58.4 GiB)
[ 2508.333353] sd 12:0:0:0: [sdc] Write Protect is off
[ 2508.333362] sd 12:0:0:0: [sdc] Mode Sense: 53 00 00 08
[ 2508.333634] sd 12:0:0:0: [sdc] Write cache: disabled, read cache: enabled, doesn't support DPO or FUA
[ 2508.346488]  sdc: sdc1
[ 2508.347918] sd 12:0:0:0: [sdc] Attached SCSI removable disk

挂载和写入使用的命令:

$ sudo mount /dev/sdc1 /mnt/
$ sudo dd bs=1M count=1024 if=/dev/zero of=/mnt/test conv=fdatasync status=progress
1024+0 records in
1024+0 records out
1073741824 bytes (1,1 GB, 1,0 GiB) copied, 154,158 s, 7,0 MB/s

输出lsusb -t

/:  Bus 04.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/2p, 5000M
/:  Bus 03.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/2p, 480M
/:  Bus 02.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/10p, 5000M
    |__ Port 6: Dev 8, If 0, Class=Mass Storage, Driver=usb-storage, 5000M
/:  Bus 01.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/16p, 480M
    |__ Port 9: Dev 2, If 0, Class=Human Interface Device, Driver=usbhid, 1.5M
    |__ Port 10: Dev 3, If 0, Class=Human Interface Device, Driver=usbhid, 1.5M
    |__ Port 10: Dev 3, If 1, Class=Human Interface Device, Driver=usbhid, 1.5M

编辑2:我尝试了另外两个内核:4.4.11 和 4.6.0。他们俩的写作仍然很慢。此外,问题似乎与驱动器有关,因为我使用外部 USB 3 硬盘获得了更高的传输速度(90 MB/秒)。

编辑3:我在 Ubuntu 16.04 Live 系统上做了一些基准测试。结果好多了(尽管仍然不是很好):

ubuntu@ubuntu:/media/ubuntu/274D-D62C$ dd bs=1M count=1024 if=/dev/zero of=./test conv=fdatasync status=progress
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB, 1.0 GiB) copied, 12.2623 s, 87.6 MB/s
ubuntu@ubuntu:/media/ubuntu/274D-D62C$ dd bs=1M count=1024 if=/dev/zero of=./test conv=fdatasync status=progress
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB, 1.0 GiB) copied, 64.5742 s, 16.6 MB/s
ubuntu@ubuntu:/media/ubuntu/274D-D62C$ dd bs=1M count=1024 if=/dev/zero of=./test conv=fdatasync status=progress
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB, 1.0 GiB) copied, 83.6521 s, 12.8 MB/s
ubuntu@ubuntu:/media/ubuntu/274D-D62C$ dd bs=1M count=1024 if=/dev/zero of=./test conv=fdatasync status=progress
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB, 1.0 GiB) copied, 21.842 s, 49.2 MB/s
ubuntu@ubuntu:/media/ubuntu/274D-D62C$ dd bs=1M count=1024 if=/dev/zero of=./test conv=fdatasync status=progress
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB, 1.0 GiB) copied, 16.3149 s, 65.8 MB/s

编辑4:我刚刚使用最新的 Arch/Manjaro 内核 (4.11.1) 再次尝试,结果好一点:我得到的传输速度约为 10 MB/s(因此 1GB 约为 100 秒)。然而,这仍然比 Windows 慢得多。

编辑5:我终于抽出时间来回到这个问题了。运行当前的 Manjaro 内核Linux janmanjaro 5.4.74-1-MANJARO #1 SMP PREEMPT Sun Nov 1 13:43:13 UTC 2020 x86_64 GNU/Linux,我得到 15 - 30 MB/s(通常接近 15 MB/s)。安装sudo mount -o async,flush /dev/sdc1 /mnt/(如建议的在 Linux 中写入 USB FAT32 驱动器时速度极慢)将速度提高了大约 5 MB/s。这比 Windows 慢得离谱,也比 Ubuntu 慢得多。

我也sudo fio --name TEST --eta-newline=5s --filename=test.img --rw=randrw --size=500m --io_size=10g --blocksize=4k --ioengine=libaio --iodepth=1 --direct=1 --numjobs=1 --runtime=60 --group_reportin按照@Mikko Rantalainen 的建议跑步。结果是:

Run status group 0 (all jobs):
   READ: bw=3444KiB/s (3527kB/s), 3444KiB/s-3444KiB/s (3527kB/s-3527kB/s), io=202MiB (212MB), run=60001-60001msec
   WRITE: bw=3432KiB/s (3514kB/s), 3432KiB/s-3432KiB/s (3514kB/s-3514kB/s), io=201MiB (211MB), run=60001-60001msec

我还没有在 Ubuntu 上运行过这个。

答案1

你真的需要FAT吗?根据我的经验,FAT 驱动程序的 Linux 实现似乎按顺序访问设备,导致某些设备的性能非常差。我发现某些闪存设备在格式化为 ext4 时性能提高了 10 倍。

考虑到您在评论中提供的链接(http://www.beginninglinux.com/home/machine-lated/sandisk-extreme-64-usb-3-speed-test-benchmark-review)正在测试没有分区的读写速度,可能是你的闪存设备在linux FAT驱动程序访问时性能较差。如果这是真的,那么它的随机 IO 性能通常也很差。


您可以使用 测试设备性能fio。切换到要测试的设备内的某个目录,并运行以下命令来测试混合随机 4k 读/写性能的性能:

fio --name TEST --eta-newline=5s --filename=test.img --rw=randrw --size=500m --io_size=10g --blocksize=4k --ioengine=libaio --iodepth=1 --direct=1 --numjobs=1 --runtime=60 --group_reporting

这将创建 500 MB 的测试文件test.img,然后开始以队列深度为 1 的随机 4 KB 块进行读写。size如果您的设备具有巨大的内部缓存,请增加 。此测试的最长运行时间为 60 秒。请将此视为您设备的最坏情况。一个相当快的闪存设备(Intel SSD 910)在这里得到以下结果:

...
read : io=1041.4MB, bw=17773KB/s, iops=4443, runt= 60001msec
...
write: io=1038.5MB, bw=17723KB/s, iops=4430, runt= 60001msec
...

要测试最佳情况,您可以增加块大小并使用 iodepth=32 执行 2 个并行进程:

fio --name TEST --eta-newline=5s --filename=test.img --rw=randrw --size=500m --io_size=10g --blocksize=512k --ioengine=libaio --iodepth=32 --direct=1 --numjobs=2 --runtime=60 --group_reporting

一个相当快的闪存设备(Intel SSD 910)在这里得到以下结果:

...
read : io=10892MB, bw=457088KB/s, iops=892, runt= 24401msec
...
write: io=9588.0MB, bw=402365KB/s, iops=785, runt= 24401msec
...

当然,如果你真的想要高分,你应该用高io深度进行顺序阅读。这应该接近您在设备规格表中看到的数字(也就是说,在现实生活中永远不会):

fio --name TEST --eta-newline=5s --filename=test.img --rw=read --size=500m --io_size=10g --blocksize=512k --ioengine=libaio --iodepth=32 --direct=1 --numjobs=1 --runtime=60 --group_reporting

一个相当快的闪存设备(Intel SSD 910)在这里得到以下结果:

...
read : io=10240MB, bw=1468.8MB/s, iops=2937, runt=  6972msec
...

请注意,这低于规格表(大约 2 GB/s),因为我已将 I/O 调度程序配置为尽可能低的延迟(带有和 的deadlineI/O 调度程序)。1 > ../queue/iosched/fifo_batch50 > ../queue/iosched/read_expire

请注意最坏情况(约 17 MB/s)和最佳情况(约 1470 MB/s)之间的巨大差异。

答案2

由于没有更好的答案,我只是想指出,您的值对于一般闪存驱动器来说非常好,并且完全在您的特定闪存驱动器的预期范围内。

诸如 190MB/s 写入速度之类的营销值一般来说是不可持续的(它们最多有效几秒钟,直到内部缓冲区被填满,并且不反映实际的闪存性能),并且仅适用于顺序写入。一旦涉及文件系统,速度就会大大降低。即使在高级快速 USB 驱动器上,随机访问写入速度通常也低于 1MB/s,因此少量随机写入(如文件系统通常要求的那样)就会破坏写入性能。

您可以尝试使用对闪存更友好的文件系统,例如 f2fs(建议使用 4.4 或更高版本的内核),它在减少随机写入方面做得很好,看看是否有帮助。

答案3

我将在这里给你一点希望。我正在查看 UHS-II SD 卡和 USB 读卡器,并从 Ubuntu“磁盘”小程序基准测试选项卡中观察到以下内容:

  • Ubuntu 14.04 - 内核 4.4 - 读取 ~140MB/s,写入 ~50MB/s
  • Ubuntu 17.04 - 内核 4.10 - 读取 ~270MB/s 写入 ~200MB/s

它们使用传统的“USB 大容量存储驱动程序”。这两点之间内核发生了一些变化,加速了大容量存储驱动程序的速度。

通常的评论重新基准测试适用,但是我们的内部应用程序比基准时间快了大约 10%,因此它们很好地代表了许多用例。

USB 外部硬盘实际上可能使用通用大容量存储驱动程序的替代驱动程序,因此您不能总是直接比较它们。

答案4

我知道这有点过时了,但是

通过 USB 3 将 ubuntu 服务器 20.04 备份到 12T Seagate 扩展驱动器时,我感到非常沮丧。传输速度通常以千字节为单位报告。每隔 20 秒左右,一切就会停滞 10 到 15 秒。我怀疑是某种缓存写入。

解决方案?近几个月来,我在网络上尝试了多种方法,包括将 NTFS 格式更改为 ext4、修改缓存设置、更改电缆等。如果您受到影响,我相信您也遇到过这种情况。没有任何帮助。

昨天我把硬盘从机箱里拿出来了。它被标记为梭子鱼。我将磁盘放入台式电脑上的 USB 3 扩展坞中,并通过 LAN 启动 rsync 备份。 Bingo - 出色的连续传送速度

我得出的结论是,问题在于 Seagate 扩展机箱中的控制器,而不是 Linux。扩展硬盘在插入 Windows 10 时表现良好,这表明它也可能针对该系统进行了优化。

我现在已将扩展坞移至 Ubuntu 服务器上的 USB 3 端口,目前的备份速度约为 50MB/s

我可以忍受这一点。

相关内容