Como posso limitar a quantidade de memória usada pelo dd?

1

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.

    
por hebbo 20.04.2018 / 10:21

2 respostas

1

Você pode tentar a opção nocache, por exemplo,

dd oflag=nocache if=infile of=outfile bs=4096 
    
por 20.04.2018 / 11:00
0

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.

    
por 20.04.2018 / 21:09

Tags