Você pode tentar a opção nocache, por exemplo,
dd oflag=nocache if=infile of=outfile bs=4096
Estou usando o dd
para transferir um arquivo grande do núcleo do kernel (4GB ~ 12GB) em um kernel que possui uma pequena quantidade de memória disponível (~ 400MB).
O problema é que o dd pode travar com o pânico do OOM, uma vez que apenas despeja um grande pedaço do vmcore no soquete, o que pode fazer com que o sistema execute o OOM.
Minha pergunta é: como eu posso acelerar a velocidade de dd
com base na memória disponível ou limitar seu tamanho de buffer?
Obrigado.
Você pode tentar a opção nocache, por exemplo,
dd oflag=nocache if=infile of=outfile bs=4096
Poderia sugerir usar algo assim em vez de apenas chamar dd
?
#!/bin/sh
bsize=1048576
fsize='stat -c %s ${1}'
count=$((${fsize}/${bsize}))
if [ $((${fsize}%${bsize})) -ne 0 ] ; then
count=$((${count}+1))
fi
echo "About to copy ${fsize} bytes in ${count} chunks."
for i in 'seq 0 $((${count}-1))' ; do
dd if=${1} of=${2} bs=1048576 conv=sparse,notrunc count=1 seek=${i} skip=${i} status=none
/bin/echo -e -n "\e[2K\e[0G[$((${i}+1))/${count}]"
done
echo
Não há muito o que fazer para limitar uma única invocação de dd
a algum uso máximo de memória sem causar a sua morte. Você pode, no entanto, rotulá-lo facilmente para copiar o arquivo bloco por bloco. O script acima irá copiar o primeiro argumento para o segundo, um megabyte de cada vez, enquanto fornece um indicador de progresso rudimentar (é isso que essa procura louca de echo
no loop for faz). Usando o busybox, será executado com apenas 1,5 MB de memória utilizável do espaço do usuário. Usando o regular bash
e o GNU coreutils, não deve haver nenhum problema em manter abaixo de 4MB de uso de memória. Você também pode reduzir o tamanho do bloco (diminuindo o valor bsize
) para reduzir ainda mais o uso da memória.