web-dev-qa-db-ja.com

ddを並列化する方法は?

入力としてスパースファイル(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には並列化機能がないようです

私の知る限り

  • 複数のスレッドでのプログラムパーツの内部処理を備えた拡張バージョン/フォーク(I/Oパフォーマンスを低下させるコンテキスト変更を回避する)が推奨されます
  • GNU parallelをローカルで実行するソリューションが優先されます
  • カスタム(テストされていない可能性がある)コードスニペット

I/Oを集中的に使用する操作のボトルネックとなるCPUを回避するにはどうすればよいですか? Linux 3.13を搭載したUbuntu 14.04でコマンドを実行し、スパースファイルをサポートする任意のファイルシステムでスパースファイルのディスクイメージを処理します(少なくとも、ソリューションは特定の1つのファイルシステムにバインドされるべきではありません)。

背景:私は、zfsに11 TBのスパースファイル(約2 TBのデータを含む)のコピーを作成しようとしています(zfsonlinux 0.6.4不安定バージョン、バグが多く、CPUボトルネックの原因(最終的には低速のホール検索))。 (非常に一般的な方法で)ddを並列化する方法の問題については、何も変更すべきではありません。

8
Karl Richter

バッシュでテスト:

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を調整する必要があります。

3
Ole Tange

未テストのカスタムコードスニペットが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=パラメータは必須ではありません。