dd を並列化するにはどうすればいいですか?

dd を並列化するにはどうすればいいですか?

私は現在、ddスパースファイルを入力(if)として、ファイルを出力(of)として呼び出す に問題を抱えていますconv=sparseddはCPUの1つのコア(Intel(R) Core(TM) i7-3632QM CPU @ 2.20GHz4つのコア+ 4つのIntelハイパースレッド)のみを使用しているようです(1つのコアの100%)ので、 を並列化できるかどうか疑問に思っていますdd

  • 調べてみるinfo ddと、man ddcorutils 8.23のバージョンには組み込み関数があるようです
  • sgp_ddパッケージから確認したところsg3-utils(自分のニーズに合っているかどうかはわかりませんが)、スパースファイルを処理できないようです
  • dcfldd並列化機能がないようです

私の知る限り

  • 複数のスレッドでプログラム部分を内部的に処理する拡張バージョン/フォーク(コンテキストの変更によるI/Oパフォーマンスの低下を避ける)が推奨されます。
  • parallelGNUをローカルで実行するソリューションは、
  • カスタム(おそらくテストされていない)コードスニペット

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

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

答え1

Bashでテスト済み:

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

答え2

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=厳密には必要ありません。

関連情報