web-dev-qa-db-ja.com

ddが使用するメモリの量を制限するにはどうすればよいですか?

ddを使用して、使用可能なメモリが少量(〜400MB)のクラッシュカーネルで大きなカーネルコアファイル(4GB〜12GB)を転送しています。

問題は、ddがvmcoreの大きなチャンクをソケットにダンプするだけで、システムがOOMを実行する可能性があるため、OOMパニックでクラッシュする可能性があることです。

私の質問は、使用可能なメモリに基づいてddの速度を調整したり、バッファサイズを制限したりするにはどうすればよいですか?

ありがとう。

1
hebbo

Nocacheオプションを試すことができます。

dd oflag=nocache if=infile of=outfile bs=4096 
1
Sam

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

ddの1回の呼び出しを、それを停止させずに最大メモリ使用量に制限するためにできることはあまりありません。ただし、ファイルをブロックごとにコピーするようにスクリプトを作成するのは非常に簡単です。上記のスクリプトは、最初の引数を一度に1メガバイトずつ2番目の引数にコピーし、基本的な進行状況インジケーターを提供します(これは、forループでの非常識な外観のecho呼び出しが行うことです)。 busyboxを使用すると、1.5MBのユーザースペースで使用可能なメモリで問題なく動作します。通常のbashとGNU coreutilsを使用すると、4MB未満のメモリ使用量を維持することに問題はありません。ブロックサイズを減らすこともできます(bsize value)メモリ使用量をさらに削減します。

0