Existe uma maneira de determinar o valor ideal para o parâmetro bs para dd?

71

Na ocasião, vi comentários on-line ao longo das linhas de "certifique-se de definir 'bs =' porque o valor padrão levará muito tempo" e minhas próprias experiências extremamente não científicas de ", bem que pareceu levar mais tempo do que o outro tempo na semana passada "parece confirmar isso. Portanto, sempre que eu uso 'dd' (normalmente no intervalo de 1-2 GB), certifique-se de especificar o parâmetro bytes. Na metade do tempo, uso o valor especificado em qualquer guia on-line do qual estou copiando; o resto do tempo, selecionarei um número que faça sentido na lista 'fdisk -l', pois suponho que a mídia seja mais lenta (por exemplo, o cartão SD para o qual estou escrevendo).

Para uma determinada situação (tipo de mídia, tamanhos de barramento ou o que mais importa), existe uma maneira de determinar um "melhor" valor? É fácil determinar? Caso contrário, existe uma maneira fácil de obter 90 a 95% do caminho até lá? Ou é "apenas escolher algo maior que 512", mesmo a resposta correta?

Pensei em tentar o experimento, mas (além de muito trabalho) não tenho certeza de quais fatores afetam a resposta, por isso não sei como projetar um bom experimento.

Drewbenn
fonte
gravar no mesmo meio de armazenamento é diferente de gravar em um meio de armazenamento diferente e exigiria configurações ótimas diferentes, existem muitas variáveis ​​que serão diferentes para todos, dependendo do tipo de dispositivo, velocidade, cache e assim por diante. Na minha máquina bs = 256M é o ideal.

Respostas:

27

dddata de quando era necessário converter fitas antigas de mainframe IBM, e o tamanho do bloco tinha que coincidir com o usado para gravar a fita ou os blocos de dados seriam ignorados ou truncados. (As fitas de 9 faixas eram exigentes. Fique feliz por estarem mortas há muito tempo.) Atualmente, o tamanho do bloco deve ser múltiplo do tamanho do setor do dispositivo (geralmente 4KB, mas em discos muito recentes pode ser muito maior e em um polegar muito pequeno). as unidades podem ser menores, mas 4KB é um meio termo razoável, independentemente) e quanto maior, melhor o desempenho. Costumo usar tamanhos de bloco de 1 MB com discos rígidos. (Temos muito mais memória para usar nos dias de hoje também.)

geekosaur
fonte
Discos rígidos ou dispositivos de armazenamento em massa USB são 512 ou 4096 (mais recentes) bytes. A mídia flash de acesso óptico e direto tem 2048 bytes. Não pode dar errado com 4096 bytes.
LawrenceC
3
Por que o tamanho do bloco do programa de cópia deve ter algo a ver com as características do dispositivo subjacente (exceto as fitas)? O kernel faz seu próprio buffer (e às vezes pré-busca) de qualquer maneira.
Gilles 'SO- stop be evil'
11
Minimizar buffers fracionários; em geral, as coisas ficam mais rápidas quando você usa buffers alinhados porque o kernel pode iniciar leituras / gravações de buffer no setor (ou melhor, faixa ou cilindro, mas acho que as unidades modernas mentem sobre isso) e limites de buffer do kernel, porque o kernel não está tendo para pular coisas ou ler coisas extras ou gerenciar buffers parciais. Certamente você pode deixar o kernel lidar com tudo, mas se você estiver copiando gigabytes de dados, esse trabalho extra poderá reduzir consideravelmente o tempo de cópia.
Geekosaur
Você (geralmente) precisa incluir @Gillesse deseja que eu seja notificado da resposta do seu comentário, consulte Como funcionam os comentários @ respostas? . Desde que eu estava passando: o kernel vai lidar com tudo de qualquer maneira. Sua afirmação de que “esse trabalho extra pode reduzir consideravelmente o tempo de cópia” não concorda com meus benchmarks, mas sistemas diferentes podem ter comportamentos diferentes, portanto, contribua com os horários também!
Gilles 'SO- stop be evil'
@ Gilles: desculpe, eu tinha confundido você com o autor original.
Geekosaur 17/03
60

Existe apenas uma maneira de determinar o tamanho ideal do bloco, e isso é uma referência. Acabei de fazer uma referência rápida. A máquina de teste é um PC executando o Debian GNU / Linux, com o kernel 2.6.32 e o coreutils 8.5. Ambos os sistemas de arquivos envolvidos são ext3 em volumes LVM em uma partição do disco rígido. O arquivo de origem é de 2 GB (2040000kB, para ser mais preciso). O cache e o buffer estão ativados. Antes de cada execução, esvaziei o cache sync; echo 1 >|/proc/sys/vm/drop_caches. Os tempos de execução não incluem uma final syncpara liberar os buffers; a final syncleva na ordem de 1 segundo. As sameexecuções eram cópias no mesmo sistema de arquivos; as diffexecuções eram cópias para um sistema de arquivos em um disco rígido diferente. Por consistência, os tempos relatados são os tempos de relógio de parede obtidos com otimeutilitário, em segundos. Eu executei cada comando apenas uma vez, então não sei quanta variação existe no tempo.

             same   diff
dd bs=64M    71.1   51.3
dd bs=1M     73.9   41.8
dd bs=4k     79.6   48.5
dd bs=512    85.3   48.9
cat          76.2   41.7
cp           77.8   45.3

Conclusão: um grande tamanho de bloco (vários megabytes) ajuda, mas não drasticamente (muito menos do que eu esperava para cópias na mesma unidade). E cate cpnão executam tão mal. Com esses números, não acho que ddvalha a pena se preocupar. Vá com cat!

Gilles 'SO- parar de ser mau'
fonte
Eu recomendaria que o OP fizesse seu próprio benchmarking, mas de qualquer maneira, boa resposta!
Njalj 17/03
5
@ Nikhil >|é o mesmo que, >exceto que set -o noclobber, em baixo , o shell reclamará que o arquivo existe se você usar >.
Gilles 'SO- stop be evil'
2
@ Masi Sim, se eu quiser clonar um disco inteiro, usarei cat. Por que você está procurando uma maneira melhor? O que há de errado cat?
Gilles 'SO- stop be evil'
5
O @Masi catapenas copia sua entrada para sua saída. Se você deseja copiar de mídia não confiável e pular partes ilegíveis ou tentar várias vezes, esse é um problema diferente, para o qual ddrescuefunciona muito bem.
Gilles 'SO- stop be evil'
11
@sudo Você pode obter a quantidade de dados copiados lsof. A velocidade instantânea não é muito relevante com uma cópia em disco, porque é uniforme, para que você possa dividir os bytes transferidos pelo tempo decorrido; se você quiser algo melhor, você pode usar pv.
Gilles 'SO- stop be evil'
8

Concordo com o geekosaur que o tamanho deve ser múltiplo do tamanho do bloco, que geralmente é de 4K.

Se você deseja encontrar o tamanho do bloco, stat -c "%o" filenameprovavelmente é a opção mais fácil.

Mas diga que sim dd bs=4K, isso significa que sim read(4096); write(4096); read(4096); write(4096)...

Cada chamada do sistema envolve uma opção de contexto, que envolve alguma sobrecarga e, dependendo do agendador de E / S, leituras com gravações intercaladas podem fazer com que o disco faça muitas buscas. (Provavelmente não é um grande problema com o agendador do Linux, mas, no entanto, algo para se pensar.)

Portanto, se o fizer bs=8K, permita que o disco leia dois blocos de cada vez, que provavelmente estão próximos no disco, antes de procurar outro local para fazer a gravação (ou fazer a manutenção da E / S para outro processo).

Por essa lógica, bs=16Ké ainda melhor, etc.

Então, o que eu gostaria de saber é se existe um limite superior em que o desempenho começa a piorar ou se é limitado apenas pela memória.

Mikel
fonte
4
Perfil, não especule!
Gilles 'SO- stop be evil'
11
A interface de programação do Linux concorda comigo. Consulte o Capítulo 13 - Buffer de E / S de arquivo.
Mikel
4
Curiosamente, seus benchmarks sugerem que há pouco benefício acima de 4K.
Mikel
4
Além disso, aparentemente, a janela de leitura antecipada do arquivo padrão é 128 KB, portanto esse valor pode ser benéfico.
Mikel
6
Eu tenho acesso a um RAID50 de 24 unidades aqui, onde bs = 8K obtém-me 197MB / s, mas bs = 1M obtém 2,2 GB / s, o que está próximo da taxa de transferência teórica do RAID. Então bs importa muito. No entanto, usando bs = 10M, recebo apenas 1,7 GB / s. Portanto, parece piorar acima de algum limite, mas não sei por que.
Joseph Garvin
5

Como Gilles diz, você pode determinar o parâmetro ideal para a opção bs para dd comparando. Isso, no entanto, levanta a questão: como você pode comparar convenientemente esse parâmetro?

Minha resposta provisória a esta pergunta é: use o dd-opt , o utilitário em que recentemente comecei a trabalhar para resolver exatamente esse problema :)

sampablokuper
fonte
11
Qual é a sensibilidade da saída? 90-95% ou> 95%? Não acho que você possa mudar isso.
Léo Léopold Hertz,
11
@ Masi, tenho medo de não trabalhar dd-opthá muito tempo. No entanto, é um software livre licenciado sob o AGPLv3 . Portanto, fique à vontade para aprimorá-lo e avaliar sua sensibilidade / precisão!
Sampablokuper
0

Otimizei para o leitor de sdcard usb2.0, que parece funcionar melhor bs=10M. Eu tentei 4k, em até 16M, depois de 8-10M, nenhuma melhoria. Você pode ver como a medição da taxa de transferência se degrada ... provavelmente devido ao carregamento dos buffers no dispositivo e aguardando a transferência do dispositivo para o meio real.

angstrom/sdcard# dd if=/dev/zero of=/dev/sdb bs=10M
123+0 records in
123+0 records out
1289748480 bytes (1.3 GB) copied, 21.4684 s, 60.1 MB/s
341+0 records in
341+0 records out
3575644160 bytes (3.6 GB) copied, 117.636 s, 30.4 MB/s
816+0 records in
816+0 records out
8556380160 bytes (8.6 GB) copied, 326.588 s, 26.2 MB/s
955+0 records in
955+0 records out
10013900800 bytes (10 GB) copied, 387.456 s, 25.8 MB/s
Wwright
fonte