Como paralelizar dd?

10

No momento, estou tendo problemas com a ddchamada de um arquivo esparso como input ( if) e um arquivo como output ( of) com conv=sparse. ddparece estar usando apenas um núcleo da CPU ( Intel(R) Core(TM) i7-3632QM CPU @ 2.20GHz4 núcleos + 4 Intel Hyperthreads) (100% de 1 núcleo), por isso fiquei pensando se é possível paralelizar dd. eu estive

  • olhando para dentro info dde man ddparece haver função interna na versão do corutils 8.23
  • verificação sgp_dddo sg3-utilspacote (sem entender se atende às minhas necessidades), mas não parece capaz de lidar com arquivos esparsos
  • dcfldd parece não ter recursos de paralelização

Até onde sei

  • é preferível uma versão / bifurcação aprimorada com manipulação interna de partes do programa em vários encadeamentos (evitar alterações de contexto que prejudiquem o desempenho de E / S)
  • uma solução com o GNU em parallelexecução localmente é preferível
  • um snippet de código personalizado (possivelmente não testado)

Como evitar que a CPU seja o gargalo de uma operação intensiva de E / S? Eu gostaria de executar o comando no Ubuntu 14.04 com Linux 3.13 e manipular imagens de disco de arquivos esparsos com ele em qualquer sistema de arquivos que suporte arquivos esparsos (pelo menos a solução não deve estar vinculada a um sistema de arquivos específico).

Antecedentes: Estou tentando criar uma cópia do arquivo esparso de 11 TB (contendo cerca de 2 TB de dados) em um zfs (versão instável do zfsonlinux 0.6.4, possivelmente com bugs e a causa do gargalo da CPU (eventualmente, busca lenta do furo)). Isso não deve mudar nada na questão de como paralelizar o dd (de uma maneira muito genérica).

Karl Richter
fonte
Não vejo o que você poderia obter com isso, pois esta operação é vinculada a E / S, exceto em casos extremos. Na minha opinião, a melhor opção seria um programa com pouco conhecimento, por exemplo, algo como xfs_copy . Sua página de manual menciona: "No entanto, se o arquivo for criado em um sistema de arquivos XFS, ele consumirá aproximadamente a quantidade de espaço realmente usada no sistema de arquivos de origem pelo sistema de arquivos e pelo log XFS. A economia de espaço ocorre porque o xfs_copy procura por blocos livres ao invés de copiá-los e o sistema de arquivos XFS suporta arquivos esparsos eficientemente. ".
Cristian Ciupitu 10/10
@mikeserv Eu não entendo o seu comentário ...
Karl Richter
@CristianCiupitu Bem, no meu caso, a CPU é o gargalo - não me pergunte por que, porque não sei. Sua resposta me fez perceber que a solução deve suportar múltiplos sistemas de arquivos (capaz de lidar com arquivos esparsos) (editado)
Karl Richter
Qual CPU e sistema de arquivos você possui? Qual é o tamanho do arquivo (comprimento e blocos)?
Cristian Ciupitu 10/10
4
ddmonopoliza a CPU por padrão devido ao tamanho pequeno do bloco. torná-lo maior, como bs=1M.
Frostschutz 10/10

Respostas:

4

Testado no Bash:

INFILE=in
seq 0 1000 $((`stat --format %s $INFILE` /100000 )) |
  parallel -k dd if=$INFILE bs=100000 skip={} conv=sparse seek={} count=1000 of=out

Você provavelmente precisa ajustar 1000.

Ole Tange
fonte
2

Um fragmento de código personalizado, não testado, será lançado:

dd if=oldf conv=sparse bs=1k                 count=3000000000                 of=newf &
dd if=oldf conv=sparse bs=1k skip=3000000000 count=3000000000 seek=3000000000 of=newf &
dd if=oldf conv=sparse bs=1k skip=6000000000 count=3000000000 seek=6000000000 of=newf &
dd if=oldf conv=sparse bs=1k skip=9000000000 count=3000000000 seek=9000000000 of=newf &
wait

Isso deve particionar logicamente o arquivo em quatro blocos de 3 TB e processá-los em paralelo. ( skip=pula os blocos de entrada; seek=procura os blocos de saída.) O quarto comando, é claro, lerá até o final do arquivo antigo, portanto o count=parâmetro não é estritamente necessário.

G-Man diz que 'restabelece Monica'
fonte
Também pensei em algo assim, mas não consegui descobrir como torná-lo uma solução genérica para arquivos de tamanho arbitrário (o pano de fundo da pergunta não deveria ter influenciado minha solicitação de uma solução genérica)
Karl Richter,
Eu não entendo o que você está dizendo. Acabei de pegar o tamanho indicado do seu arquivo e dividido pelo número de núcleos. Isso pode ser feito trivialmente por um script.
G-Man diz 'Reinstate Monica'
3
provavelmente também precisaconv=notrunc
frostschutz 10/10
@frostschutz: Talvez apenas o primeiro. Embora não consiga encontrar isso documentado, meus testes indicam que isso conv=notruncestá implícito seek=com um valor positivo.
G-Man diz 'Reinstate Monica'
1
não, procurar não implica não estar incorreto.
Frostschutz 1/11