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

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

LinuxでUSB 3サムドライブ(SanDisk Extreme SDCZ80-064G-FFP)に書き込むのは非常に遅いです。 1GBは200秒以上かかります。 Windows(同じコンピュータでデュアルブート)を使用すると、同じ1GBファイルを約8秒以内にコピーできます。スティックは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:私は2つの異なるカーネル4.4.11と4.6.0を使ってみました。どちらもまだゆっくりと書いています。また、外付けUSB 3ハードドライブを使用すると転送速度(90MB /秒)が速くなるため、問題はドライブに関連しているようです。

編集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)を使ってもう一度試しましたが、結果は少し良くなりました。約10MB/s(約100秒に1GB)の転送速度を得ました。しかし、これはまだWindowsよりはるかに遅いです。

編集5:私はついにこの質問に戻りました。現在 Manjaro カーネルを実行すると、Linux janmanjaro 5.4.74-1-MANJARO #1 SMP PREEMPT Sun Nov 1 13:43:13 UTC 2020 x86_64 GNU/Linux15 - 30MB/s (通常 15MB/s に近い) が得られます。インストールsudo mount -o async,flush /dev/sdc1 /mnt/(推奨事項LinuxでUSB FAT32ドライブへの書き込み速度が非常に遅い)速度が約5MB / 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
...

ベストプラクティスをテストするには、ブロックサイズを大きくしてiolength = 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
...

可能な限り低い遅延時間のためにI / Oスケジューラーを構成したため、これは仕様シート(約2 GB / s)よりも低くなります(およびdeadline入っているI / Oスケジューラー)。1 > ../queue/iosched/fifo_batch50 > ../queue/iosched/read_expire

最悪の場合(約17MB / s)と最良の場合(約1470MB / s)の間の大きな違いに注意してください。

おすすめ記事