入力としてスパースファイル(dd
)を使用してif
を呼び出し、_conv=sparse
_を使用して出力(of
)としてファイルを呼び出すと、問題が発生します。 dd
はCPUの1つのコア(Intel(R) Core(TM) i7-3632QM CPU @ 2.20GHz
4コア+ 4インテルハイパースレッド)のみを使用しているようです(1コアの100%)ので、並列化が可能かどうか疑問に思っていましたdd
。行ったことがある
info dd
_と_man dd
_を調べたところ、corutils 8.23のバージョンには組み込み関数があるようです。sgp_dd
_パッケージから_sg3-utils
_をチェックします(それが私のニーズに合っているかどうかは理解していません)が、スパースファイルを処理できないようですdcfldd
には並列化機能がないようです私の知る限り
parallel
をローカルで実行するソリューションが優先されますI/Oを集中的に使用する操作のボトルネックとなるCPUを回避するにはどうすればよいですか? Linux 3.13を搭載したUbuntu 14.04でコマンドを実行し、スパースファイルをサポートする任意のファイルシステムでスパースファイルのディスクイメージを処理します(少なくとも、ソリューションは特定の1つのファイルシステムにバインドされるべきではありません)。
背景:私は、zfsに11 TBのスパースファイル(約2 TBのデータを含む)のコピーを作成しようとしています(zfsonlinux 0.6.4不安定バージョン、バグが多く、CPUボトルネックの原因(最終的には低速のホール検索))。 (非常に一般的な方法で)ddを並列化する方法の問題については、何も変更すべきではありません。
バッシュでテスト:
INFILE=in
seq 0 1000 $((`stat --format %s $INFILE` /100000 )) |
parallel -k dd if=$INFILE bs=100000 skip={} conv=sparse seek={} count=1000 of=out
おそらく1000を調整する必要があります。
未テストのカスタムコードスニペットが1つ登場します。
dd if=oldf conv=sparse bs=1k count=3000000000 of=newf &
dd if=oldf conv=sparse bs=1k skip=3000000000 count=3000000000 seek=3000000000 of=newf &
dd if=oldf conv=sparse bs=1k skip=6000000000 count=3000000000 seek=6000000000 of=newf &
dd if=oldf conv=sparse bs=1k skip=9000000000 count=3000000000 seek=9000000000 of=newf &
wait
これにより、ファイルが4つの3TBチャンクに論理的に分割され、並列に処理されます。 (skip=
入力ブロックをスキップします。 seek=
は出力ブロックをシークします。)当然、4番目のコマンドは古いファイルの最後まで読み取ります。したがって、count=
パラメータは必須ではありません。