我发现许多与传输到 USB 存储性能不佳有关的问题,但没有一个符合我的情况。
我在两台不同的机器上运行双启动 Ubuntu 16.04/Windows 10(一台基于 AMD,一台基于 Intel)。我始终观察到 Ubuntu 中 USB 闪存驱动器的传输速率为 41 MB/s,而 Windows 10 上为 120MB/s。我进行了许多不同的测试,始终得到相同的结果。我测试了不同的文件系统格式、工具、文件大小等。
测试 1 - Ubuntu 使用 Gnome Disks 41.5 MB/s vs Windows 10 使用 Crystal Disk Mark 141.154 MB/s
Ubuntu 16.04 上的 Gnome 磁盘
Sample Size: 1000.0 MiB (1,048,576,000 bytes)
Average Read Rate: 213.5 MB/s (5 samples)
Average Write Rate: 41.5 MB/s (5 samples)
Average Access Time: 0.46 sec (1000 samples)
Windows 10 上的水晶磁盘标记
-------------------------------------------------------------------
CrystalDiskMark 5.2.0 x64 (UWP) (C) 2007-2016 hiyohiyo
Crystal Dew World : http://crystalmark.info/
-------------------------------------------------------------------
* MB/s = 1,000,000 bytes/s [SATA/600 = 600,000,000 bytes/s]
* KB = 1000 bytes, KiB = 1024 bytes
Sequential Read (Q= 32,T= 1) : 230.883 MB/s
Sequential Write (Q= 32,T= 1) : 141.154 MB/s
Sequential Read (T= 1) : 333.212 MB/s
Sequential Write (T= 1) : 125.621 MB/s
Test : 1024 MiB [D: 0.0% (0.0/29.8 GiB)] (x5) [Interval=5 sec]
Date : 2016/11/24 3:25:09
OS : Windows 10 [10.0 Build 10586] (x64)
测试 2 - 5 GiB 文件复制 - Ubuntu 40 MiB/s vs Windows 10 98-120 MiB/s
Ubuntu
我使用脚本刷新缓存,使用 dd 复制文件并再次刷新缓存。我使用 time 调用它以跟踪运行时间。
1024+0 records in
1024+0 records out
5368709120 bytes (5.4 GB, 5.0 GiB) copied, 102.44 s, 52.4 MB/s
real 2m7.042s
user 0m0.012s
sys 0m10.056s
5368709120÷127.042 = 42259324.632798602
42259324.632798602÷1024÷1024 = 40.301632531
~ 40 MiB/秒
Windows 10
我使用 powershell 脚本将同一个文件复制到 USB 闪存驱动器,然后弹出闪存驱动器。使用 measure-command 执行以记录执行时间。弹出调用立即返回,操作在后台运行,但在所有情况下,“安全删除”屏幕通知都会与测量结果同时显示。
PS > measure-command {.\test.ps1}
Days : 0
Hours : 0
Minutes : 0
Seconds : 42
Milliseconds : 381
Ticks : 423816672
TotalDays : 0.000490528555555556
TotalHours : 0.0117726853333333
TotalMinutes : 0.70636112
TotalSeconds : 42.3816672
TotalMilliseconds : 42381.6672
5368709120÷42.382 = 126674274.928035487
126674274.928035487÷1024÷1024 = 120.806002548
~ 120 MiB/秒
即使增加了 10 秒的时间来弹出(似乎是立即弹出):
5368709120÷52.382 = 102491487.915696232
102491487.915696232÷1024÷1024 = 97.743499675
~ 98 MiB/秒
额外细节
在 Ubuntu 中连接 USB 闪存驱动器的日志:
[ 350.460108] usb 2-1: new SuperSpeed USB device number 2 using xhci_hcd
[ 350.477525] usb 2-1: New USB device found, idVendor=05dc, idProduct=a212
[ 350.477532] usb 2-1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[ 350.477537] usb 2-1: Product: USB Flash Drive
[ 350.477540] usb 2-1: Manufacturer: Lexar
[ 350.477543] usb 2-1: SerialNumber: xxxxxxxxxxxxxxxxxxxxx
[ 350.501276] usb-storage 2-1:1.0: USB Mass Storage device detected
[ 350.502121] scsi host8: usb-storage 2-1:1.0
[ 350.502218] usbcore: registered new interface driver usb-storage
[ 350.503430] usbcore: registered new interface driver uas
[ 351.501106] scsi 8:0:0:0: Direct-Access Lexar USB Flash Drive PMAP PQ: 0 ANSI: 6
[ 351.502007] sd 8:0:0:0: Attached scsi generic sg0 type 0
[ 351.503962] sd 8:0:0:0: [sda] 62586880 512-byte logical blocks: (32.0 GB/29.8 GiB)
[ 351.504490] sd 8:0:0:0: [sda] Write Protect is off
[ 351.504501] sd 8:0:0:0: [sda] Mode Sense: 2b 00 00 08
[ 351.505598] sd 8:0:0:0: [sda] Write cache: disabled, read cache: enabled, doesn't support DPO or FUA
[ 351.638276] sda: sda1
[ 351.640491] sd 8:0:0:0: [sda] Attached SCSI removable disk
[ 351.818131] [EXFAT] trying to mount...
[ 351.824012] [EXFAT] mounted successfully
Ubuntu 测试脚本:
测试.sh:
#!/bin/bash
sudo sh -c "sync && echo 3 > /proc/sys/vm/drop_caches"
time ./cmd.sh
命令:
#!/bin/bash
dd if=./lf of=/media/flashdrive/lf bs=5M
sudo sh -c "sync && echo 3 > /proc/sys/vm/drop_caches"
Windows 测试脚本:
测试.ps1:
cp lf D:/.
$driveEject = New-Object -comObject Shell.Application
$driveEject.NameSpace(17).ParseName("D:").InvokeVerb("Eject")
答案1
在测试 Ubuntu 时,您是否尝试过在 dd 中使用不同的块大小?我发现在许多系统(计算机硬件 + 软件)中,bs=4096 运行良好。我注意到,您使用了很大的块大小,bs=5M。
也许使用较小的块大小效果会更好,可能是 4096,也可能是某个“介于我的和你的”之间的值。您也可以尝试使用其他工具(不是 dd,而是例如 cp,它会自动选择块大小)。
历史也很重要。为了进行公平比较,最好先从空白的 U 盘开始,将其中所有存储单元都写入零。请参阅此链接