我提到的问题已经在互联网上的其他地方讨论过:
- https://www.reddit.com/r/linuxquestions/comments/sbpt23/usb_flash_drive_read_speed_much_slower_in_linux/
- https://forums.linuxmint.com/viewtopic.php?t=328360
- https://www.youtube.com/watch?v=AbNNs-oyuTQ
- https://www.reddit.com/r/linuxquestions/comments/ujwlmn/slow_read_speed_with_samsung_fit_plus_drive_on/
然而,似乎没有人找到解决方案。
我相当确定这不是“Windows 在撒谎/Linux 在说真话”之类的问题。这不是驱动器健康问题,因为同一驱动器在 Windows 下的运行速度比在同一台计算机上、同一端口上的 Linux 上运行速度快 5 倍。
我也不认为这与驱动器格式化的文件系统有关,原因如下所示。
我认为 Linux(和/或驱动程序)与这些驱动器通信的方式存在问题,导致它们无法充分发挥其功能。
在我的特定情况下,驱动器是三星 USB Type-C™ 闪存盘 128GB (MUF-128DA/AM)。
在 Windows 中,使用 CrystalDiskMark,可以获得大约 400MB/s 的顺序读取速度:
在 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
彻底解决这个问题的最佳方法是什么?