Quem sou eu e o que este blog.

segunda-feira, 4 de novembro de 2019

Lendo 2 cartões ao mesmo tempo com o Kingston FCR-HS4

Este texto trata de problemas consequências de tentar ler dois cartões ao mesmo tempo no leitor de cartões Kingston FCR-HS4.

Para ler este texto antes tem que ler o artigo "Vale a pena usar leitor de cartões USB 3.0?".

Ele está com um nível alto de "nerdice", portanto leiam por sua conta e risco.

O Kingston FCR-HS4 é leitor múltiplo, e o curioso é que foi reconhecido pelo sistema como se fossem várias unidades independentes, e não só um leitor.

Abaixo como o FreeBSD reconheceu a o leitor. Leigos podem pular esta parte. (Eu sei, tem uma mensagem estranha referente ao da4.)

ugen0.6: <Kingston Multi-Reader> at usbus0
umass1 on uhub0
umass1: <Bulk-In, Bulk-Out, Interface> on usbus0
umass1:  SCSI over Bulk-Only; quirks = 0xc000
umass1:11:1: Attached to scbus11
(probe0:umass-sim1:1:0:0): REPORT LUNS. CDB: a0 00 00 00 00 00 00 00 00 10 00 00
(probe0:umass-sim1:1:0:0): CAM status: SCSI Status Error
(probe0:umass-sim1:1:0:0): SCSI status: Check Condition
(probe0:umass-sim1:1:0:0): SCSI sense: ILLEGAL REQUEST asc:24,0 (Invalid field in CDB)
(probe0:umass-sim1:1:0:0): Error 22, Unretryable error
da4 at umass-sim1 bus 1 scbus11 target 0 lun 0
da4: < Multi-Reader  -0 1.00> Removable Direct Access SPC-4 SCSI device
da4: Serial Number 08738174603015
da4: 400.000MB/s transfers
da4: Attempt to query device size failed: NOT READY, Medium not present
da4: quirks=0x2<NO_6_BYTE>
sysctl_warn_reuse: can't re-use a leaf (kern.cam.da.4.delete_method)!
sysctl_warn_reuse: can't re-use a leaf (kern.cam.da.4.delete_max)!
sysctl_warn_reuse: can't re-use a leaf (kern.cam.da.4.minimum_cmd_size)!
sysctl_warn_reuse: can't re-use a leaf (kern.cam.da.4.zone_mode)!
sysctl_warn_reuse: can't re-use a leaf (kern.cam.da.4.zone_support)!
sysctl_warn_reuse: can't re-use a leaf (kern.cam.da.4.optimal_seq_zones)!
sysctl_warn_reuse: can't re-use a leaf (kern.cam.da.4.optimal_nonseq_zones)!
sysctl_warn_reuse: can't re-use a leaf (kern.cam.da.4.max_seq_zones)!
sysctl_warn_reuse: can't re-use a leaf (kern.cam.da.4.error_inject)!
sysctl_warn_reuse: can't re-use a leaf (kern.cam.da.4.unmapped_io)!
sysctl_warn_reuse: can't re-use a leaf (kern.cam.da.4.rotating)!
sysctl_warn_reuse: can't re-use a leaf (kern.cam.da.4.sort_io_queue)!
da5 at umass-sim1 bus 1 scbus11 target 0 lun 1
da5: < Multi-Reader  -1 1.00> Removable Direct Access SPC-4 SCSI device
da5: Serial Number 08738174603015
da5: 400.000MB/s transfers
da5: Attempt to query device size failed: NOT READY, Medium not present
da5: quirks=0x2<NO_6_BYTE>
da6 at umass-sim1 bus 1 scbus11 target 0 lun 2
da6: < Multi-Reader  -2 1.00> Removable Direct Access SPC-4 SCSI device
da6: Serial Number 08738174603015
da6: 400.000MB/s transfers
da6: Attempt to query device size failed: NOT READY, Medium not present
da6: quirks=0x2<NO_6_BYTE>
da7 at umass-sim1 bus 1 scbus11 target 0 lun 3
da7: < Multi-Reader  -3 1.00> Removable Direct Access SPC-4 SCSI device
da7: Serial Number 08738174603015
da7: 400.000MB/s transfers
da7: Attempt to query device size failed: NOT READY, Medium not present
da7: quirks=0x2<NO_6_BYTE>


Quando colocado um cartão no leitor SD padrão, ele foi reconhecido em uma unidade, e quando foi colocado no leitor de Micro SD ele foi reconhecido como em outra unidade.

Será que dá para ler mais de um cartão ao mesmo tempo?

Dúvida interessante, e se a resposta for sim, já que uma boa parte dos meus cartões são Micro SD com adaptador, em caso de pressa eu poderia tirar um deles do adaptador e usar a porta Micro SD do leitor, e o outro ler na porta SD padrão.

Para o teste eu peguei o segundo mais rápido cartão que eu tenho, um Kingston SD10V/32GB.

Os testes para ele foram:

root:SUPER[1219] dd if=/dev/da5 of=/dev/null bs=1048576
^C490+0 records in
490+0 records out
513802240 bytes transferred in 9.438603 secs (54436259 bytes/sec)


goffredo:SUPER[980] iostat -c 1000 -d da5
             da5
  KB/t tps  MB/s
 112.58   0  0.00
 128.00 414 51.73
 128.00 418 52.25
 128.00 415 51.88
 128.00 419 52.37
 128.00 414 51.72
 128.00 418 52.23
^C 128.00 424 53.02


A taxa de leitura foi de 51.9 MB/s, segundo o dd que foi coerente com o iostat.

Este cartão ficará na porta SD padrão, e o outro mencionado neste texto ficará na porta Micro SD do leitor.

Olhando nas mensagens do sistema pude ver que os dois cartões foram reconhecidos.

Com um pouco de trabalho foi possível iniciar e terminar os testes em tempos bem perto, humanamente falando, na leitura dos cartões.

As saídas foram:

root:SUPER[1220] dd if=/dev/da5 of=/dev/null bs=1048576
^C770+0 records in
770+0 records out
807403520 bytes transferred in 24.999385 secs (32296935 bytes/sec)

root:SUPER[1046] sleep 1 ;dd if=/dev/da7 of=/dev/null bs=1048576
^C716+0 records in
716+0 records out
750780416 bytes transferred in 23.773739 secs (31580241 bytes/sec)

goffredo:SUPER[983] iostat -c 1000 -d da5 da7
             da5              da7
  KB/t tps  MB/s   KB/t tps  MB/s
 108.44   0  0.00  75.20   0  0.00
 128.00 236 29.48  128.00 234 29.23
 128.00 235 29.35  128.00 236 29.47
 128.00 236 29.53  128.00 234 29.28
 128.00 234 29.25  128.00 237 29.63
 128.00 236 29.50  128.00 234 29.25
 128.00 235 29.37  128.00 237 29.62
 128.00 236 29.50  128.00 234 29.25
 128.00 235 29.35  128.00 237 29.60
 128.00 236 29.50  128.00 233 29.13
 128.00 234 29.27  128.00 237 29.64
 128.00 236 29.48  128.00 233 29.10
 128.00 235 29.37  128.00 237 29.62
 128.00 236 29.53  128.00 235 29.40
 128.00 235 29.37  128.00 237 29.62
 128.00 236 29.50  128.00 234 29.25
 128.00 237 29.63  128.00 239 29.88
^C 128.00 234 29.21  128.00 229 28.62


Sim, as taxas de leitura dos dois cartões caíram. A soma das duas ficou a abaixo do cartão mais rápido, mas acima do cartão menos rápido entre os dois. Isto faz pensar se valeria a pena dependendo da taxa de leitura dos cartões. Em alguns casos valeria apena e em outros não.

Testando com um outro cartão Sony igual. Primeiro o teste individual do cartão:

root:SUPER[1223] dd if=/dev/da5 of=/dev/null bs=1048576
^C627+0 records in
627+0 records out
657457152 bytes transferred in 9.512849 secs (69112539 bytes/sec)


goffredo:SUPER[986] iostat -c 1000 -d da5
             da5
  KB/t tps  MB/s
 93.89   0  0.00
 128.00 492 61.46
 128.00 541 67.65
 128.00 537 67.14
 128.00 544 67.96
 128.00 537 67.15
 128.00 544 67.98
 128.00 534 66.81
^C 128.00 543 67.92


Estranhamente este parece ser um pouco mais lento do que o outro cartão Sony, mas ainda assim é um cartão rápido.

Tentando com dois cartões Sony iguais inseridos,

root:SUPER[1225] dd if=/dev/da5 of=/dev/null bs=1048576
^C660+0 records in
660+0 records out
692060160 bytes transferred in 19.428538 secs (35620804 bytes/sec)


root:SUPER[1047] sleep 1 ; dd if=/dev/da7 of=/dev/null bs=1048576
^C675+0 records in
675+0 records out
707788800 bytes transferred in 19.597369 secs (36116522 bytes/sec)


goffredo:SUPER[988] iostat -c 1000 -d da5 da7
             da5              da7
  KB/t tps  MB/s   KB/t tps  MB/s
 124.35   0  0.00  111.07   0  0.00
 128.00 251 31.35  128.00 252 31.47
 128.00 272 33.99  128.00 271 33.86
 128.00 270 33.77  128.00 272 34.02
 128.00 273 34.11  128.00 270 33.74
 128.00 270 33.75  128.00 273 34.13
 128.00 273 34.13  128.00 270 33.75
 128.00 270 33.75  128.00 273 34.12
 128.00 272 34.01  128.00 269 33.64
 128.00 268 33.49  128.00 270 33.74
 128.00 272 34.00  128.00 270 33.75
 128.00 270 33.75  128.00 272 34.00
^C 128.00 268 33.47  128.00 264 32.98


As taxas foram  33.97 MB/s e 34.44 MB/s, que somadas dá 68.40 MB/s, que é aproximadamente a média dos dois cartões.

E se for usado um cartão lento e um rápido?

O cartão mais lento que tenho atualmente é o Eye-Fi. Abaixo o teste dele.

root:SUPER[1228] dd if=/dev/da5 of=/dev/null bs=1048576
^C73+0 records in
73+0 records out
76546048 bytes transferred in 7.623228 secs (10041160 bytes/sec)

goffredo:SUPER[992] iostat -c 1000 -d da5
             da5
  KB/t tps  MB/s
 41.95   0  0.00
 128.00  77  9.62
 128.00  78  9.75
 128.00  77  9.62
 128.00  79  9.83
 128.00  77  9.67
^C 128.00  81 10.07

A taxa de leitura dele é de 9.58 MB/s.

O resultado dos dois juntos foi o abaixo:

root:SUPER[1227] dd if=/dev/da5 of=/dev/null bs=1048576
^C142+0 records in
142+0 records out
148897792 bytes transferred in 16.153658 secs (9217590 bytes/sec)


root:SUPER[1049] sleep 1 ; dd if=/dev/da7 of=/dev/null bs=1048576
^C174+0 records in
174+0 records out
182452224 bytes transferred in 16.467414 secs (11079592 bytes/sec)


goffredo:SUPER[991] iostat -c 1000 -d da5 da7
             da5              da7
  KB/t tps  MB/s   KB/t tps  MB/s
 112.08   0  0.00  123.96   0  0.00
 128.00  72  9.00  128.00  70  8.75
 128.00  72  8.99  128.00  73  9.12
 128.00  70  8.76  128.00  69  8.63
 128.00  71  8.88  128.00  73  9.13
 128.00  71  8.86  128.00  69  8.61
 128.00  71  8.89  128.00  72  9.02
 128.00  71  8.87  128.00  70  8.75
 128.00  70  8.75  128.00  72  9.00
 128.00  71  8.88  128.00  69  8.63


O resultado foi completamente desastroso. O leitor controla a velocidade pelo cartão mais lento. Se os dois cartões são iguais, ou bem rápidos, pode valer a pena, mas se um for lento, este ditará a taxa de transferência. Em uma tentativa fracassada de teste isto ficou demonstrado.

goffredo:SUPER[990] iostat -c 1000 -d da5 da7
             da5              da7
  KB/t tps  MB/s   KB/t tps  MB/s
 65.14   0  0.00  22.40   0  0.00
 128.00  72  9.00  128.00  70  8.75
 128.00  71  8.92  128.00  73  9.16
 128.00  72  8.95  128.00  70  8.70
 128.00  72  9.00  128.00  74  9.25
 128.00  72  9.01  128.00  69  8.64
 128.00  71  8.87  128.00  74  9.24
 128.00  71  8.88  128.00  69  8.63
 128.00  72  9.00  128.00  74  9.25
 128.00  71  8.87  128.00  69  8.62
 128.00  72  9.00  128.00  74  9.25
 128.00  72  9.00  128.00  70  8.75
 125.02  43  5.25  128.00 267 33.38
  0.00   0  0.00  128.00 548 68.56
  0.00   0  0.00  128.00 550 68.80
  0.00   0  0.00  128.00 549 68.57
  0.00   0  0.00  118.15  13  1.51
  0.00   0  0.00   0.00   0  0.00


A leitura do cartão mais lento foi interrompida alguns segundos antes da leitura do mais rápido, e assim o mais rápido assumiu a responsabilidade de ditar a taxa de transferência.

Conclusões

A conclusão é que deve-se evitar ler dois cartões ao mesmo tempo, a não ser que os dois sejam muito rápidos ou, melhor ainda, iguais.

Outra coisa óbvia, desde o primeiro teste, é que não necessariamente as taxas de transferência se somam. Talvez com dois cartões lentos se somem (preciso de dois cartões Micro SD lentos iguais para testar, o que não tenho disponível).

Aviso final

Não recebi nenhum patrocínio, nenhum tipo de incentivo, de nenhum dos fabricantes de cartões SD e de leitores de cartões, nem do site Boa Dica, nem de representantes comerciais etc, para escrever este texto.

Todos cartões e os leitores mencionados foram comprados com dinheiro do meu bolso, e buscando segundo os critérios explicados.

Já recebi, faz alguns anos, algumas canetas do Boa Dica como agradecimento por ter informado um erro sério no cadastro deles. Faz uns 15 anos que uso o site deles para pesquisa de preços e de produtos, e já usava quando recebi o brinde. Foi usando o site deles, como normalmente uso, que percebi o erro de cadastro. Eu uso e falo deles por prestarem um grande serviço para quem compra produtos de informática e fotografia, mas acho que o site deles precisa de melhoras.

Nenhum comentário:

Postar um comentário