dd
を使用して、使用可能なメモリが少量(〜400MB)のクラッシュカーネルで大きなカーネルコアファイル(4GB〜12GB)を転送しています。
問題は、ddがvmcoreの大きなチャンクをソケットにダンプするだけで、システムがOOMを実行する可能性があるため、OOMパニックでクラッシュする可能性があることです。
私の質問は、使用可能なメモリに基づいてdd
の速度を調整したり、バッファサイズを制限したりするにはどうすればよいですか?
ありがとう。
Nocacheオプションを試すことができます。
dd oflag=nocache if=infile of=outfile bs=4096
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)メモリ使用量をさらに削減します。