从某些 USB 3 闪存驱动器读取数据时,Linux 上的性能比 Windows 上的性能差

从某些 USB 3 闪存驱动器读取数据时,Linux 上的性能比 Windows 上的性能差

我提到的问题已经在互联网上的其他地方讨论过:

然而,似乎没有人找到解决方案。

我相当确定这不是“Windows 在撒谎/Linux 在说真话”之类的问题。这不是驱动器健康问题,因为同一驱动器在 Windows 下的运行速度比在同一台计算机上、同一端口上的 Linux 上运行速度快 5 倍。

我也不认为这与驱动器格式化的文件系统有关,原因如下所示。

我认为 Linux(和/或驱动程序)与这些驱动器通信的方式存在问题,导致它们无法充分发挥其功能。

在我的特定情况下,驱动器是三星 USB Type-C™ 闪存盘 128GB (MUF-128DA/AM)

在 Windows 中,使用 CrystalDiskMark,可以获得大约 400MB/s 的顺序读取速度:

闪存驱动器的 CrystalDiskMark 基准测试

在 Linux 中,这是我可以获得的最佳读取速度:

$ dd iflag=direct if=/dev/sda of=/dev/null bs=128k count=1500
1500+0 records in
1500+0 records out
196608000 bytes (197 MB, 188 MiB) copied, 2.3547 s, 83.5 MB/s

我尝试了各种块大小和数量。我也尝试过fio并且hdparm.两者返回的速度相似,约为 84 MB/s。另请注意,这是直接从 /dev/sda 读取,而不是驱动器上的分区甚至文件(不过,从文件读取时,我得到了类似的速度)。

以下是该驱动器的一些详细信息:

$ lsusb -t
...
    |__ Port 1: Dev 2, If 0, Class=Mass Storage, Driver=usb-storage, 5000M

$ lsusb -d 090c:1000 -v

Bus 002 Device 002: ID 090c:1000 Silicon Motion, Inc. - Taiwan (formerly Feiya Technology Corp.) Flash Drive
Device Descriptor:
  bLength                18
  bDescriptorType         1
  bcdUSB               3.10
  bDeviceClass            0
  bDeviceSubClass         0
  bDeviceProtocol         0
  bMaxPacketSize0         9
  idVendor           0x090c Silicon Motion, Inc. - Taiwan (formerly Feiya Technology Corp.)
  idProduct          0x1000 Flash Drive
  bcdDevice           11.00
  iManufacturer           1 Samsung
  iProduct                2 Type-C
  iSerial                 3 xxxxxxxxxxxxxxxx
  bNumConfigurations      1
  Configuration Descriptor:
    bLength                 9
    bDescriptorType         2
    wTotalLength       0x002c
    bNumInterfaces          1
    bConfigurationValue     1
    iConfiguration          0
    bmAttributes         0x80
      (Bus Powered)
    MaxPower              304mA
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        0
      bAlternateSetting       0
      bNumEndpoints           2
      bInterfaceClass         8 Mass Storage
      bInterfaceSubClass      6 SCSI
      bInterfaceProtocol     80 Bulk-Only
      iInterface              0
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x01  EP 1 OUT
        bmAttributes            2
          Transfer Type            Bulk
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0400  1x 1024 bytes
        bInterval               0
        bMaxBurst               8
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x82  EP 2 IN
        bmAttributes            2
          Transfer Type            Bulk
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0400  1x 1024 bytes
        bInterval               0
        bMaxBurst               8
Binary Object Store Descriptor:
  bLength                 5
  bDescriptorType        15
  wTotalLength       0x0016
  bNumDeviceCaps          2
  USB 2.0 Extension Device Capability:
    bLength                 7
    bDescriptorType        16
    bDevCapabilityType      2
    bmAttributes   0x00000002
      HIRD Link Power Management (LPM) Supported
  SuperSpeed USB Device Capability:
    bLength                10
    bDescriptorType        16
    bDevCapabilityType      3
    bmAttributes         0x00
    wSpeedsSupported   0x000c
      Device can operate at High Speed (480Mbps)
      Device can operate at SuperSpeed (5Gbps)
    bFunctionalitySupport   2
      Lowest fully-functional device speed is High Speed (480Mbps)
    bU1DevExitLat           4 micro seconds
    bU2DevExitLat           4 micro seconds
can't get debug descriptor: Resource temporarily unavailable
Device Status:     0x000c
  (Bus Powered)
  U1 Enabled
  U2 Enabled

彻底解决这个问题的最佳方法是什么?

相关内容