Linuxシステムにコピーする必要があるファイルのリストがあります。各ファイルのサイズは10〜100GBです。
ローカルファイルシステムにコピーしたいだけです。これを並行して行う方法はありますか- 単純な方法で複数のプロセスがそれぞれファイルをコピーする責任がありますか?
これを行うマルチスレッドプログラムを簡単に作成できますが、これを行うための低レベルのLinuxメソッドがあるかどうかを調べたいと思っています。
Linuxシステムにコピーする必要があるファイルのリストがあります。各ファイルのサイズは10〜100GBです。
ローカルファイルシステムにコピーしたいだけです。これを並行して行う方法はありますか- 単純な方法で複数のプロセスがそれぞれファイルをコピーする責任がありますか?
これを行うマルチスレッドプログラムを簡単に作成できますが、これを行うための低レベルのLinuxメソッドがあるかどうかを調べたいと思っています。
回答:
あなたのシステムがそれによってスラッシングされていない場合(たとえば、ファイルがキャッシュにある場合)、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/も参照してください。
前述のように、これはひどい考えです。しかし、私は誰もが彼ら自身の恐ろしい計画を実行することができるはずだと思います...
for FILE in *;do cp $FILE <destination> &;done
アスタリスクは、ファイルの正規表現で置き換えることができます。または$(cat <listfile>)
、テキストドキュメントにすべてを含めることができます。アンパサンドはバックグラウンドでコマンドを開始するため、ループが続行され、より多くのコピーが生成されます。
言及したように、これはあなたのIOを完全に消滅させます。だから...私は本当にそれをすることをお勧めしません。
-クリストファー・カレル
マシンの応答性を損なうことのない唯一の答えは、「コピー」ではありませんが、非常に高速です。新しい場所または古い場所にあるファイルを編集しない場合、ハードリンクは事実上コピーのようであり、同じファイルシステム上にいる場合のみ、非常に高速に作成されます。
チェックしてcp -l
、それがあなたのために働くかどうかを確認してください。
ファイルをチャンクアップし、すべてのチャンクを並列にコピーする分散/並列分散ファイルコピーツールを次に示します。それはおそらく、複数のストリームをサポートするSSD、または複数のディスクヘッドを備えたある種のセットアップを使用している場合にのみ役立ちます。
それが良い考えではないと思う人にとっては、それは頼りになると思います。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なので、最も一般的なケースではないが、私はこれに毎日取り組んでいます)のコンテキストにいる場合、複数の一般的な平行。
あなたはこれを試す必要があります:
$ seq 3 | パラレルcp -v / etc / passwd passwd {}
これにより、ファイルpasswdが/ etc /ディレクトリから$ HOMEに3回コピーされます。
または、ファイルがホームディレクトリにある場合
$ seq 3 | パラレルcp -v passwd {、{}}
これにより、passwdファイルが$ HOMEに3回コピーされます。