dd
現在、スパースファイルをinput(if
)として使用し、ファイルをoutput()として使用of
して呼び出すのに問題がありますconv=sparse
。dd
CPUコア1個( Intel(R) Core(TM) i7-3632QM CPU @ 2.20GHz
4コア+インテルハイパースレッディング4個)(1コア100%)のみ使用しているようで、並列化が可能かどうか疑問に思いますdd
。私はそこに行きました。
- 見てみると、corutilsバージョン8.23に組み込み機能があるようです
info dd
。man dd
sgp_dd
私はパッケージで確認しましたがsg3-utils
(私の要件に合っているかどうかわかりません)、まれなファイルを処理していないようです。dcfldd
並列化機能がないようです。
AFAIK
- マルチスレッドのプログラムの一部の内部処理よりも改善されたバージョン/分岐(コンテキスト変更によってI / Oパフォーマンスが低下するのを防ぐため)
- GNUをローカルで実行するためのソリューションは、次の方が
parallel
優れています。 - カスタム(テストされていない)コードスニペット
I/O 集中的な作業により、CPU がボトルネックを引き起こすのを防ぐ方法は? Linux 3.13がインストールされているUbuntu 14.04でこのコマンドを実行し、スパースファイルをサポートするすべてのファイルシステムのスパースファイルディスクイメージで使用したいと思います(少なくとも1つの特定のファイルシステムにソリューションを接続してはいけません)。
背景:zfs(zfsonlinux 0.6.4不安定なバージョン、バグがあり、CPUボトルネックが発生する可能性がある(最終的に遅いホール検索))で、11TBのスパースファイル(〜2TBのデータを含む)のコピーを作成しようとしています。これは、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
テストされていないカスタムコードがすぐに表示されます。
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=
必要ではありません。