A gravação de dd na unidade flash USB causa leituras massivas

A gravação de dd na unidade flash USB causa leituras massivas

Atualmente estou restaurando um pendrive com uma imagem dd que criei anteriormente. No entanto, nota-se uma velocidade de gravação muito baixa em torno de ~7 MB/s, embora o stick seja geralmente muito mais rápido.

Depois de olhar um pouco, percebi que muitos dados estão sendo lidos na unidade USB, o que explica o baixo desempenho de gravação. Nada além de dd está acessando o dispositivo naquele momento.

Linha editada atop:

sdd: busy 101% | read 18020 | write 613 | MBr/s 7.04 | MBw/s 7.1

Percebi um comportamento semelhante ao escrever diretamente em meu array MD usando dd. No entanto, ao gravar em um sistema de arquivos montado com dd, isso não acontece.

Então, minha pergunta é por que é lido no pendrive ao gravar diretamente no dispositivo de bloco e se isso pode ser evitado para melhorar o desempenho de gravação?

Responder1

Portanto, não está 100% claro o que pode estar acontecendo, mas minha suspeita é que você está gravando pequenos blocos (512 bytes) no USB e, em seguida, dd verifica se o byte está escrito corretamente - levando a MUITA leitura e escrever, e ler e escrever.

Ajustar o tamanho do bloco para o tamanho "certo" não é trivial, mas existem algumas regras básicas sobre como fazer isso. Em geral, descobri que um tamanho de bloco de 64kB é um bom compromisso na maioria das frentes - mas seus sistemas de arquivos podem gerar alterações nisso, se você estiver executando algo exótico (como zfs, por exemplo).

Tente algo assim: lbzcat image-dd.bz2 | dd of=/deb/sdX bs=64k

Para uma discussão mais longa, confiraesta postagem.

Responder2

Para mim, ddusa o cache de páginas por padrão. Acho que isso é normal em sistemas com cache de páginas. O cache de página precisa que o dispositivo de armazenamento seja lido, o que pode causar velocidade de gravação lenta.

Para mim, existem três maneiras de contornar isso e obter velocidade total:

  1. Defina ddo tamanho do bloco como 4096 ou um múltiplo. (sem leituras)
  2. Defina ddo tamanho do bloco para um número suficientemente grande. Para mim, isso foi cerca de 1 milhão ou mais. Atingi velocidade total em cerca de 1 milhão. (poucas leituras)
  3. Não use cache de página fornecendo ddparâmetro oflags=direct. Defina ddo tamanho do bloco para um múltiplo suficientemente grande de 512. Para mim, isso foi acima bs=120k. (sem leituras)

Algo a ser observado no meu sistematamanho do blocopara todos os dispositivos de armazenamento etamanho da páginasão 4096 bytes. Encontrado com:

blockdev --getbsz /dev/sd?
getconf PAGESIZE

Tambémtamanho do setoré 512 bytes. fdiske talvez partedpossa dizer o tamanho do setor.

informação relacionada