Melhore a velocidade de gravação do cartão SD

3

Estou usando caixas ARM rodando o Linux 2.6 (eu estou preso com esta versão do kernel, infelizmente). As caixas saem de um cartão SD e usam um cartão SD secundário para armazenamento. As caixas têm aproximadamente 256MB de memória.

Ambos os cartões SD são criptografados com dm-crypt, mas não acredito que isso tenha um grande impacto no desempenho de leitura / gravação, porque o desempenho foi bem ruim antes de implementar a criptografia de disco. Eu não tenho números exatos para fazer o backup dessa afirmação, mas apenas como um exemplo, escrever 1GB para um cartão SD levaria mais de uma hora, sem o uso de crypt-dm.

Em uso normal, as velocidades de leitura / gravação são boas o suficiente. No entanto, certas tarefas, como a criação de software a partir do código-fonte, tendem a bloquear as operações de E / S, bloqueando por alguns minutos de cada vez. Especificamente, acredito que as operações de gravação são aquelas que bloqueiam por um longo tempo. Eu finalmente descobri sobre a ferramenta iostat, que forneceu algumas informações úteis.

Enquanto um programa (exemplo: script de configuração) está bloqueando, posso executar watch iostat . Observar o campo Blk_wrtn parece confirmar que o gargalo que causa travamentos é a operação de gravação. Especificamente, durante uma operação de gravação de bloqueio, o dispositivo dm-1 (segunda partição desbloqueada do cartão SD) tem N blocos escritos para ele, enquanto o mmcblk1 (segundo cartão SD) tem M blocos escritos para ele, onde M < N. M aumenta com o passar do tempo, até que eventualmente seja igual a N, ponto em que a operação de gravação está completa e o programa continua em execução. Ao escrever isso, o Blks_wrtn / s é aproximadamente 10 para mmcblk1 e dm-1.

Concluo dessa observação que os blocos são gravados no pseudo-dispositivo dm-1 imediatamente e depois são liberados para o disco físico; algo sobre esta operação de descarga está demorando mais do que deveria.

Estas são as opções que tentei / tentei melhorar o desempenho de gravação do cartão SD:

  1. Atualize para um novo kernel com melhores drivers / desempenho: eu adoraria ter um kernel mais novo, mas estamos presos ao que o fabricante oferece. Ainda estou tentando descobrir se seria possível usar um kernel mais novo.
  2. Use um agendador de IO diferente para o cartão SD: tentei alternar entre prazo, CFQ e noop, sem nenhuma diferença perceptível no desempenho.
  3. Use cartões SD de classe superior: não tenho certeza de qual classe os cartões SD fornecidos pelo fabricante são, mas tentei mudar para cartões SD classe 4, com o mesmo desempenho. Eu não acho que o cartão SD em si é o gargalo; é possível que os próprios leitores sejam o gargalo, mas eu não sei como verificar isso.
  4. Use um sistema de arquivos diferente nos cartões SD: Atualmente estou usando o Ext4. Um sistema de arquivos diferente faria uma grande diferença aqui?

Há algo que eu possa fazer para melhorar a velocidade ao gravar em cartões SD?

    
por millinon 15.08.2017 / 20:31

1 resposta

1

Se você tem bastante RAM livre, você pode executar o / tmp da RAM.

Ele lhe dará um aumento de desempenho durante a compilação ou com daemons que usam sockets temporários em / tmp.

Outra estratégia é instruir o syslog a não registrar de maneira alguma (não a melhor das idéias) ou, melhor ainda, enviar logs para um servidor remoto. Idem para possíveis bancos de dados baseados em disco.

Esteja ciente dos arquivos de log, dependendo do daemon do syslog e das configurações, uma gravação de linha em alguns arquivos syslog pode acionar / forçar um fsync desse arquivo.

Veja também se há daemons desnecessários, ou com essa baixa RAM, pode ser de, por exemplo, parar um servidor web quando não é necessário.

Sobre os cartões, os preços caíram o suficiente para usar um cartão Classe 10.

    
por 15.08.2017 / 22:36