Escrever em meu pen drive USB 3 (SanDisk Extreme SDCZ80-064G-FFP) é muito lento no Linux: 1 GB leva mais de 200 segundos. Usando o Windows (inicialização dupla no mesmo computador), o mesmo arquivo de 1 GB pode ser copiado em cerca de 8s. O stick está formatado em FAT (veio pré-formatado e não mudei) e gostaria de mantê-lo assim já que estou usando no Windows também,
Como posso consertar isso? Que etapas posso executar para diagnosticar o que está causando isso?
Estou executando o Manjaro/Arch com kernel versão 4.5.4-1.
Editar:
Primeiro de tudo: percebi que a unidade está formatada em FAT (não em NTFS, como afirmei originalmente na pergunta) quando tentei montá-la com -o big_writes
. Desculpe-me pelo erro!
Estou adicionando as saídas dos comandos mencionados nos comentários. Não vejo problema em nada disso.
Saída de journalctl -f
quando conecto o drive, monto-o e gravo 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
Saída 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 montagem e escrita:
$ 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:Tentei dois outros kernels: 4.4.11 e 4.6.0. A escrita ainda é lenta 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:Fiz alguns benchmarking em um sistema Ubuntu 16.04 Live. Os resultados são muito melhores (embora ainda não 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: obtenho velocidades de transferência de cerca de 10 MB/s (cerca de 100s para 1 GB). No entanto, isso ainda é muito mais lento que o Windows.
Editar 5:Finalmente encontrei tempo para voltar a esse assunto. Executando o kernel Manjaro atual Linux janmanjaro 5.4.74-1-MANJARO #1 SMP PREEMPT Sun Nov 1 13:43:13 UTC 2020 x86_64 GNU/Linux
, obtenho 15 - 30 MB/s (geralmente mais próximo de 15 MB/s). Montagem com sudo mount -o async,flush /dev/sdc1 /mnt/
(conforme sugerido emVelocidade extremamente lenta ao gravar em unidade USB FAT32 no Linux) melhora a velocidade em aproximadamente 5 MB/s. Isso é ridiculamente mais lento que o Windows e também muito mais lento que o Ubuntu.
Também corri 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
conforme sugerido por @Mikko Rantalainen. Os resultados são:
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
Ainda não executei isso no Ubuntu.
Responder1
Você realmente precisa de GORDURA? 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. Tenho visto uma melhoria de desempenho de 10x em alguns dispositivos flash quando formatados como ext4.
Considerando que o link que você forneceu nos comentários (http://www.beginninglinux.com/home/machine-related/sandisk-extreme-64-usb-3-speed-test-benchmark-review) estava testando velocidades de leitura e gravação sem partições, pode ser que seu dispositivo flash tenha desempenho ruim quando acessado pelo driver Linux FAT. Se isso for verdade, também deverá ter um desempenho de IO aleatório ruim em geral.
Você pode testar o desempenho do dispositivo com fio
. Mude para algum diretório dentro do dispositivo que deseja testar e execute o seguinte comando para testar o desempenho com desempenho misto de leitura/gravação aleatória 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 então começa a ler e gravar em blocos aleatórios de 4 KB com profundidade de fila de 1. Aumente o size
caso seu dispositivo tenha um cache interno enorme. Este teste tem tempo máximo de execução de 60 segundos. Considere este o pior cenário para o seu dispositivo. Um dispositivo flash bastante 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 ioprofundidade=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 bastante 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, se você realmente deseja pontuações altas, você deve fazer uma leitura sequencial com alta profundidade de io. Isso deve estar próximo 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 bastante 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 está aquém da folha de especificações (cerca de 2 GB/s) porque configurei a latência mais baixa possível do agendador de E/S ( deadline
agendador 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 (cerca de 1470 MB/s).
Responder2
Como não há resposta melhor, gostaria apenas de observar que seus valores são muito bons para uma unidade flash em geral e estão dentro da faixa esperada para sua unidade flash específica.
Valores de marketing como velocidade de gravação de 190 MB/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 refletem o desempenho real do flash) e só são verdadeiros para gravações sequenciais. Assim que um sistema de arquivos é envolvido, a velocidade diminui consideravelmente. As velocidades de gravação de acesso aleatório costumam ser <1 MB/s, mesmo em unidades USB rápidas de alta qualidade, portanto, apenas algumas gravações aleatórias (como os sistemas de arquivos normalmente exigem) podem destruir o desempenho de gravação.
Você pode tentar usar um sistema de arquivos mais amigável ao flash, como o f2fs (recomenda-se um kernel 4.4 ou mais recente), que faz um bom trabalho na redução de gravações aleatórias, para ver se isso ajuda.
Responder3
Vou lhe oferecer uma migalha de esperança aqui. Estou olhando para cartões SD UHS-II e leitores USB e observo o seguinte na guia de benchmarking do miniaplicativo "Discos" do Ubuntu:
- Ubuntu 14.04 - kernel 4.4 - leitura ~ 140 MB/s, gravação ~ 50 MB/s
- Ubuntu 17.04 - kernel 4.10 - leitura ~270MB/s gravação ~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.
O re-benchmarking de comentários usuais se aplica, no entanto, nosso aplicativo interno atinge cerca de 10% mais rápido do que os tempos de benchmarking, portanto, eles são uma representação muito boa de muitos casos de uso.
Os discos rígidos externos USB podem, na verdade, usar um driver alternativo ao driver genérico de armazenamento em massa, portanto você nem sempre pode compará-los diretamente.
Responder4
Eu sei que isso é um pouco desatualizado, mas
Fiquei extremamente frustrado ao fazer backup de um servidor Ubuntu 20.04 em uma unidade de expansão Seagate 12T por USB 3. As velocidades de transferência foram relatadas em kilobytes com mais frequência. e a cada 20 segundos tudo paralisava por 10 a 15 segundos. Algum tipo de gravação em cache, eu suspeito.
Soluções? Eu tentei mais do que alguns na web nos últimos meses, incluindo alterar o formato NTFS para ext4, mexer nas configurações de cache, alterar cabos, etc. Nada ajudou.
Ontem tirei o HDD do case. Foi rotulado como Barracuda. Coloquei o disco em um dock USB 3 em meu PC de mesa e iniciei um backup rsync pela LAN. Bingo - ótimas velocidades de transferência contínua
Fui levado a concluir que o problema é o controlador no caso de expansão da Seagate, não o Linux. O bom desempenho do HDD de expansão quando conectado ao Windows 10 sugere que ele também pode ser otimizado para esse sistema.
Agora mudei a docking station para uma porta USB 3 no servidor Ubuntu, onde atualmente está fazendo backup a aproximadamente 50 MB/s
Eu posso viver com isso.