web-dev-qa-db-ja.com

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

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

どうすれば修正できますか?これを引き起こしている原因を診断するためにどのような手順を実行できますか?

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

編集:まず、-o big_writesでマウントしようとしたときに、ドライブがFAT(NTFSではなく、NTFSではない)でフォーマットされていることに気付きました。間違えました!

コメントに記載されているコマンドの出力を追加しています。これらのいずれにも問題はありません。

ドライブを接続してマウントし、データを書き込むと、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ライブシステムでベンチマークを行いました。結果ははるかに良くなります(ただし、あまり良くはありません)。

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 /秒(つまり、約100秒)です。 1GBの場合)。ただし、これはWindowsよりもはるかに低速です。

7
JPW

ここで希望のクラムを提供します。私はUHS-II SDカードとUSBリーダーを見ていて、Ubuntuの「ディスク」アプレットのベンチマークタブから以下を観察します。

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

これらは、従来の「usb大容量記憶装置ドライバー」を使用します。カーネルでこれらの2つのポイントの間に何かが変更され、大容量記憶装置ドライバーが加速しています。

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

USB外付けハードディスクは、実際には一般的な大容量記憶装置ドライバーの代替ドライバーを使用する場合があるため、常に直接比較することはできません。

2
Greg

より良い答えはないので、私はあなたの値が一般的にフラッシュドライブにとって非常に良好であり、あなたの特定のフラッシュドライブの期待される範囲内にあることを述べたかっただけです。

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

F2fs(4.4以降のカーネルをお勧めします)などのよりフラッシュにやさしいファイルシステムを使用して、randomw ritesを削減することで、効果があるかどうかを確認します。

1
Remember Monica

本当にFATが必要ですか?私の経験では、FATドライバーのLinux実装は、一部のデバイスのパフォーマンスを非常に低下させるシーケンスでデバイスにアクセスするようです。代わりに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

これにより、test.imgという500 MBのテストファイルが作成され、キューの深さが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
...

これはスペックシート(約2 GB /秒)に達していないことに注意してください。I/ Oスケジューラーで可能な最小のレイテンシ(deadline I/Oスケジューラーを1 > ../queue/iosched/fifo_batch50 > ../queue/iosched/read_expireで構成しているためです。 。

ワーストケースシナリオ(約17 MB /秒)とベストケースシナリオ(約1470 MB /秒)の大きな違いに注意してください。

1