並列ファイルコピー


9

Linuxシステムにコピーする必要があるファイルのリストがあります。各ファイルのサイズは10〜100GBです。

ローカルファイルシステムにコピーしたいだけです。これを並行して行う方法はありますか- 単純な方法で複数のプロセスがそれぞれファイルをコピーする責任がありますか?

これを行うマルチスレッドプログラムを簡単に作成できますが、これを行うための低レベルのLinuxメソッドがあるかどうかを調べたいと思っています。


1
並列ファイルコピーは大幅なスピードアップをもたらしません。(少なくとも理論的にはそうすべきではありません。)
TarnayKálmán2010


1
@TarnayKálmán(クラスター化された、オーバーレイ、RAID、または「unraid」スタイルのファイルシステム、または比較的レイテンシが高い、またはビジーなネットワーク上に上記のいずれかがある場合を除く)。または、ファイルごとのレイテンシがそのファイルのコピー時間の重要な部分であるワークロード(1e5 +非常に小さなファイル、コンテンツアドレス指定されたバックエンドなど)。このような状況では、並行処理は非常に役立ちます。
右辺値2016年

回答:


11

あなたのシステムがそれによってスラッシングされていない場合(たとえば、ファイルがキャッシュにある場合)、GNU Parallel http://www.gnu.org/software/parallel/があなたのために働くかもしれません:

find . -print0 | parallel -0 -j10 cp {} destdir

これにより、10個のが同時に実行されますcp

プロ:それは読むのが簡単です。

短所:GNU Parallelはほとんどのシステムで標準ではないので、おそらくインストールする必要があります。

詳細については、紹介ビデオをご覧ください:http : //www.youtube.com/watch?v=OpaiGYxkSuQ

並列ディスクI / Oの説明については、https://oletange.wordpress.com/2015/07/04/parallel-disk-io-is-it-faster/も参照してください


3

非常に単純な理由で、これには低レベルのメカニズムはありません。これを行うと、システムのパフォーマンスが低下します。プラッタードライブでは、書き込みごとにヘッドの配置が競合し、大量のI / O待機が発生します。SSDを使用すると、システムバスの1つ以上が飽和状態になり、他の問題が発生します。


現在、単一のcpには当てはまらないように見えるエラー、I / Oチャネルが完全に飽和状態にならない複数の並列「cp」の幸せな媒体があると確信しています...
ジョン

1
飽和バスは幸せなバスです。アイドル帯域幅は無駄な帯域幅です。
右辺値2016年

3

前述のように、これはひどい考えです。しかし、私は誰もが彼ら自身の恐ろしい計画を実行することができるはずだと思います...

for FILE in *;do cp $FILE <destination> &;done

アスタリスクは、ファイルの正規表現で置き換えることができます。または$(cat <listfile>)、テキストドキュメントにすべてを含めることができます。アンパサンドはバックグラウンドでコマンドを開始するため、ループが続行され、より多くのコピーが生成されます。

言及したように、これはあなたのIOを完全に消滅させます。だから...私は本当にそれをすることをお勧めしません。

-クリストファー・カレル


3

マシンの応答性を損なうことのない唯一の答えは、「コピー」ではありませんが、非常に高速です。新しい場所または古い場所にあるファイルを編集しない場合、ハードリンクは事実上コピーのようであり、同じファイルシステム上にいる場合のみ、非常に高速に作成されます。

チェックしてcp -l、それがあなたのために働くかどうかを確認してください。


2

ファイルをチャンクアップし、すべてのチャンクを並列にコピーする分散/並列分散ファイルコピーツールを次に示します。それはおそらく、複数のストリームをサポートするSSD、または複数のディスクヘッドを備えたある種のセットアップを使用している場合にのみ役立ちます。

https://github.com/hpc/dcp


1

それが良い考えではないと思う人にとっては、それは頼りになると思います。1つのcpプロセスが処理できるよりも本当に優れたパフォーマンスを提供する大きなraidシステムまたは並列ファイルシステムを使用できます。次に、「並列ツール」を使用する必要があります。

この例を見てみましょう:

timeout 10 strace -e write -c cp /dev/zero /dev/null
strace: Process 24187 detached
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
100.00    0.655188           4    166222           write
------ ----------- ----------- --------- --------- ----------------
100.00    0.655188                166222           total

次にこれ

timeout 0.01 strace -e write  cp /dev/zero /dev/null
write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 65536) = 65536
write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 65536) = 65536
write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 65536) = 65536
write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 65536) = 65536
write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 65536) = 65536
write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 65536) = 65536
write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 65536) = 65536
strace: Process 24567 detached

したがって、この場合の「cp」によって行われる各システムコール書き込みは64KiBであり、システムで10秒間この帯域幅を提供できます:65536 * 166222/10 = 1089352499 =〜1,08GB / s

ここで、2つのプロセスでこのワークロードを起動してみましょう(私は4つのコアを持っていますが、私のデスクトップは他のものに使用されており、ここでは単なる例です):

timeout 10 strace -e write -c cp /dev/zero /dev/null & timeout 10 strace -e write -c cp /dev/zero /dev/null &  wait
[1] 26106
[2] 26107
strace: Process 26113 detached
strace: Process 26112 detached
% time     seconds  usecs/call     calls    errors syscall
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
------ ----------- ----------- --------- --------- ----------------
100.00    0.624108           4    162616           write
100.00    0.638468           4    162451           write
------ ----------- ----------- --------- --------- ----------------
100.00    0.624108                162616           total
100.00    0.638468                162451           total
------ ----------- ----------- --------- --------- ----------------
[1]-  Exit 124                timeout 10 strace -e write -c cp /dev/zero /dev/null

したがって、2コアを使用してこれを起動することで、パフォーマンスをほぼ2倍にすることができます。

したがって、1xHardドライブと1xHardドライブではなく、RAIDアレイ(または複数のNVMeなので、最も一般的なケースではないが、私はこれに毎日取り組んでいます)のコンテキストにいる場合、複数の一般的な平行。


-1

あなたはこれを試す必要があります:

    $ seq 3 | パラレルcp -v / etc / passwd passwd {}

これにより、ファイルpasswdが/ etc /ディレクトリから$ HOMEに3回コピーされます。

または、ファイルがホームディレクトリにある場合

    $ seq 3 | パラレルcp -v passwd {、{}}

これにより、passwdファイルが$ HOMEに3回コピーされます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.