No momento, estou tendo problemas com a dd
chamada de um arquivo esparso como input ( if
) e um arquivo como output ( of
) com conv=sparse
. dd
parece estar usando apenas um núcleo da CPU ( Intel(R) Core(TM) i7-3632QM CPU @ 2.20GHz
4 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 dd
eman dd
parece haver função interna na versão do corutils 8.23 - verificação
sgp_dd
dosg3-utils
pacote (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
parallel
execuçã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).
fonte
dd
monopoliza a CPU por padrão devido ao tamanho pequeno do bloco. torná-lo maior, comobs=1M
.Respostas:
Testado no Bash:
Você provavelmente precisa ajustar 1000.
fonte
Um fragmento de código personalizado, não testado, será lançado:
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 ocount=
parâmetro não é estritamente necessário.fonte
conv=notrunc
conv=notrunc
está implícitoseek=
com um valor positivo.