Slow USB 3 velocidade de gravação

6

Escrever no pen drive USB 3 (SanDisk Extreme SDCZ80-064G-FFP) é muito lento no Linux: 1 GB demora mais de 200s. Usando o Windows (dual-boot no mesmo computador), o mesmo arquivo de 1 GB pode ser copiado em cerca de 8s. O stick é formatado em FAT (ele veio pré-formatado e eu não o alterei) e gostaria de mantê-lo assim desde que eu o usei no Windows,

Como posso corrigir isso? Quais etapas posso executar para diagnosticar o que está causando isso?

Estou executando o Manjaro / Arch com a versão 4.5.4-1 do kernel.

Editar: Primeiro de tudo: eu percebi que a unidade está formatada em FAT (não em NTFS, como afirmei originalmente na pergunta) quando tentei montá-lo com -o big_writes . Desculpe pelo erro!

Estou adicionando as saídas dos comandos mencionados nos comentários. Eu não vejo problema algum com isso.

Saída de journalctl -f quando conecto a unidade, monto e escrevo alguns dados:

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

Ouput de 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

Comandos usados para montar e escrever:

$ 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

Saída de 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

Editar 2: Eu tentei dois outros kernels: 4.4.11 e 4.6.0. Escrever ainda é lento com os dois. Além disso, o problema parece estar relacionado à unidade, pois obtenho velocidades de transferência mais altas (90 MB / s) para um disco rígido USB 3 externo.

Editar 3: Eu fiz alguns benchmarking em um Ubuntu Live System 04.04. Os resultados são muito melhores (embora ainda não sejam muito bons):

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

Editar 4: Eu tentei mais uma vez usando um kernel Arch / Manjaro recente (4.11.1) e o resultado é um pouco melhor: eu obtenho velocidades de transferência de cerca de 10 MB / s ( então ~ 100s por 1GB). Isto é, no entanto, ainda muito mais lento que o Windows.

    
por JPW 22.05.2016 / 19:30

3 respostas

1

Vou lhe oferecer uma migalha de esperança aqui. Eu estou olhando para cartões SD e leitores USB UHS-II e observe o seguinte na guia de benchmarking do applet "Discos" do Ubuntu:

  • Ubuntu 14.04 - kernel 4.4 - leia ~ 140MB / s, escreva ~ 50MB / s
  • Ubuntu 17.04 - kernel 4.10 - leia ~ 270MB / s escreva ~ 200MB / s

Eles usam o tradicional "driver de armazenamento em massa usb". Algo mudou no kernel entre esses dois pontos que acelera o driver de armazenamento em massa.

Comentários usuais para re-benchmarking se aplicam, no entanto, nosso aplicativo interno atinge cerca de 10% mais rápido do que os tempos de referência, então eles são uma boa representação de muitos casos de uso.

Os discos rígidos externos USB podem, na verdade, usar um driver alternativo para o driver genérico de armazenamento em massa, de modo que nem sempre é possível compará-los diretamente.

    
por 27.04.2017 / 10:46
1

Você realmente precisa do FAT? Na minha experiência, a implementação do driver FAT no Linux parece acessar o dispositivo com uma sequência que faz com que alguns dispositivos tenham um desempenho realmente ruim. Eu vi 10x melhoria de desempenho de alguns dispositivos flash quando formatado como ext4.

Considerando que o link fornecido nos comentários ( link ) estava testando velocidades de leitura e gravação sem partições, pode ser que o seu dispositivo flash tenha baixo desempenho quando acessado pelo driver FAT do Linux. Se isso for verdade, ele também deve ter desempenho ruim de IO aleatório em geral.

Você pode testar o desempenho do dispositivo com fio . Mude para algum diretório dentro do dispositivo que você deseja testar e execute o seguinte comando para testar o desempenho com um desempenho de leitura / gravação aleatório de 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

Isso cria um arquivo de teste de 500 MB chamado test.img e, em seguida, começa a ler e gravar blocos aleatórios de 4 KB com profundidade de fila de 1. Aumente o size caso seu dispositivo tenha um enorme cache interno. Este teste tem duração máxima de 60 segundos. Considere este o pior cenário possível com o seu dispositivo. Um dispositivo flash muito rápido (Intel SSD 910) obtém os seguintes resultados aqui:

...
read : io=1041.4MB, bw=17773KB/s, iops=4443, runt= 60001msec
...
write: io=1038.5MB, bw=17723KB/s, iops=4430, runt= 60001msec
...

Para testar o melhor caso, você pode aumentar o tamanho do bloco e fazer 2 processos paralelos com iodepth = 32:

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

Um dispositivo flash muito rápido (Intel SSD 910) obtém os seguintes resultados aqui:

...
read : io=10892MB, bw=457088KB/s, iops=892, runt= 24401msec
...
write: io=9588.0MB, bw=402365KB/s, iops=785, runt= 24401msec
...

É claro que, se você realmente quiser pontuações altas, você deve fazer uma leitura sequencial com alto iodepth. Isso deve estar perto dos números que você vê nas folhas de especificações do dispositivo (ou seja, nunca na vida real):

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

Um dispositivo flash muito rápido (Intel SSD 910) obtém os seguintes resultados aqui:

...
read : io=10240MB, bw=1468.8MB/s, iops=2937, runt=  6972msec
...

Observe que isso fica aquém da folha de especificações (em torno de 2 GB / s) porque configurei a latência mais baixa possível do planejador de E / S ( deadline planejador de E / S com 1 > ../queue/iosched/fifo_batch e 50 > ../queue/iosched/read_expire ).

Observe a enorme diferença entre o pior cenário (cerca de 17 MB / s) e o melhor cenário (por volta de 1470 MB / s).

    
por 16.05.2017 / 15:24
0

Como não há uma resposta melhor, eu só queria observar que seus valores são muito bons para um flash drive em geral, e dentro do intervalo esperado para o seu flash drive específico.

Valores de marketing como velocidade de gravação de 190MB / s não são, em geral, sustentáveis (eles são válidos por no máximo alguns segundos, até que o buffer interno seja preenchido, e não reflitam o desempenho real do flash) e são verdadeiros para sequenciais escreve. Assim que um sistema de arquivos está envolvido, a velocidade diminui consideravelmente. As velocidades de gravação de acesso aleatório são frequentemente < 1MB / s, mesmo em unidades USB rápidas de alta qualidade, portanto, apenas algumas gravações de rasndom (como os sistemas de arquivos normalmente exigem) podem detester o desempenho de gravação.

Você pode tentar usar um sistema de arquivos mais amigável, como o f2fs (um kernel 4.4 ou mais recente é recomendado), que faz um bom trabalho na redução de ritos aleatórios, para ver se isso ajuda.

    
por 11.07.2016 / 19:34