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

我可以忍受這一點。

相關內容