USB 3 の書き込み速度が遅い

USB 3 の書き込み速度が遅い

私の USB 3 サムドライブ (SanDisk Extreme SDCZ80-064G-FFP) への書き込みは Linux では非常に遅く、1 GB で 200 秒以上かかります。Windows (同じコンピューターでデュアルブート) を使用すると、同じ 1 GB のファイルを約 8 秒でコピーできます。スティックは FAT でフォーマットされています (事前にフォーマットされた状態で出荷され、変更していません)。Windows でも使用しているため、この形式のままにしておきたいのですが、

どうすれば修正できますか? 原因を診断するにはどのような手順を実行すればよいですか?

私はカーネルバージョン 4.5.4-1 で Manjaro/Arch を実行しています。

編集: まず、 でマウントしようとしたときに、ドライブが FAT でフォーマットされていることに気付きました (質問で最初に述べたように、NTFS ではありません) -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:他の 2 つのカーネル (4.4.11 と 4.6.0) を試してみましたが、どちらも書き込み速度が遅いままです。また、外付け USB 3 ハード ディスクでは転送速度が速い (90 MB/秒) ので、問題はドライブに関連しているようです。

編集3:Ubuntu 16.04 Live System でベンチマークを実行しました。結果ははるかに良好です (ただし、まだあまり良くありません)。

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/秒 (つまり 1 GB で約 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~30MB/秒(通常は15MB/秒に近い)になります。マウントsudo mount -o async,flush /dev/sdc1 /mnt/Linux で USB FAT32 ドライブに書き込むと速度が極端に遅くなる) は速度を約 5 MB/秒向上させます。これは 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 が必要ですか? 私の経験では、Linux の FAT ドライバー実装は、一部のデバイスのパフォーマンスを著しく低下させるシーケンスでデバイスにアクセスするようです。一部のフラッシュ デバイスでは、ext4 としてフォーマットすると 10 倍のパフォーマンス向上が見られました。

コメントで提供されたリンク(http://www.beginninglinux.com/home/machine-related/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
...

もちろん、本当に高いスコアが欲しい場合は、高い iodepth でシーケンシャル読み取りを行う必要があります。これは、デバイスの仕様書に記載されている数値に近いはずです (つまり、現実には決してそうではありません)。

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
...

I/O スケジューラのレイテンシを可能な限り低く設定しているため (およびdeadlineを使用した I/O スケジューラ)、これは仕様シート (約 2 GB/秒) を下回っていることに注意してください。1 > ../queue/iosched/fifo_batch50 > ../queue/iosched/read_expire

最悪のシナリオ (約 17 MB/秒) と最良のシナリオ (約 1470 MB/秒) の間には大きな違いがあることに注意してください。

答え2

これ以上の回答がないので、あなたの値はフラッシュ ドライブ全般にとっては非常に良好であり、あなたの特定のフラッシュ ドライブの予想範囲内であることを述べておきたいと思います。

190MB/秒の書き込み速度などのマーケティング値は、一般的には持続可能ではなく (内部バッファがいっぱいになるまでの数秒間有効であり、実際のフラッシュ パフォーマンスを反映していません)、シーケンシャル書き込みにのみ当てはまります。ファイル システムが関与するとすぐに、速度は大幅に低下します。ランダム アクセス書き込み速度は、高品質の高速 USB ドライブでも 1MB/秒未満になることが多いため、数回のランダム書き込み (ファイル システムで一般的に必要) で書き込みパフォーマンスが損なわれる可能性があります。

ランダム書き込みの削減に効果的な f2fs (4.4 以降のカーネルを推奨) などのフラッシュに適したファイル システムを使用して、効果があるかどうかを確認してください。

答え3

ここで一筋の希望を差し上げましょう。UHS-II SD カードと USB リーダーを調べていて、Ubuntu の「ディスク」アプレットのベンチマーク タブから次のことが分かりました。

  • Ubuntu 14.04 - カーネル 4.4 - 読み取り ~140MB/秒、書き込み ~50MB/秒
  • Ubuntu 17.04 - カーネル 4.10 - 読み取り ~270MB/秒、書き込み ~200MB/秒

これらは従来の「USB 大容量ストレージ ドライバー」を使用します。これら 2 つのポイント間でカーネルに何らかの変更が加えられ、大容量ストレージ ドライバーが高速化されました。

通常のコメントの再ベンチマークが適用されますが、当社の社内アプリケーションはベンチマーク時間よりも約 10% 高速化しているため、多くのユースケースをかなり適切に表しています。

USB 外付けハードディスクは、汎用の大容量ストレージ ドライバーに代わるドライバーを使用している可能性があるため、必ずしも直接比較できるとは限りません。

答え4

少し古い話かもしれませんが

USB 3 経由で Ubuntu サーバー 20.04 を 12T Seagate 拡張ドライブにバックアップするのに、極度にイライラしました。転送速度はほとんどの場合キロバイト単位で報告されます。そして、約 20 秒ごとにすべてが 10 ~ 15 秒間停止します。何らかのキャッシュ書き込みが原因であると思われます。

解決策は? ここ数か月、NTFS 形式を ext4 に変更したり、キャッシュ設定をいじったり、ケーブルを変更したりなど、Web 上でさまざまな方法を試しました。影響を受けている方は、すでに経験があると思います。何も役に立ちませんでした。

昨日、HDD をケースから取り出しました。Barracuda というラベルが貼ってありました。デスクトップ PC の USB 3 ドッキング ステーションにディスクを差し込み、LAN 経由で rsync バックアップを開始しました。ビンゴ - 素晴らしい連続転送速度です

問題は Linux ではなく、Seagate 拡張ケースのコントローラにあるという結論に至りました。拡張 HDD を Windows 10 に接続したときに正常に動作したことは、このシステムにも最適化されている可能性があることを示唆しています。

ドッキングステーションをUbuntuサーバーのUSB 3ポートに移動しました。現在、約50MB/秒でバックアップしています。

私はそれで生きていける。

関連情報