私は大学院生であり、私が働いているグループはLinuxクラスターを管理しています。クラスタの各ノードには独自のローカルディスクがありますが、これらのローカルディスクは比較的小さく、自動バックアップが装備されていません。そのため、グループは、多くのTBのストレージスペースを備えたファイルサーバーを所有しています。私は比較的Linuxの初心者なので、速度やネットワーク機能などの点でファイルサーバーの仕様はわかりません。ローカルディスクはI / Oの点でファイルサーバーよりも大幅に高速であることを経験から知っています。 。約12人ほどがファイルサーバーを使用しています。
cp
を使用してファイルサーバーからローカルディスクの1つに最大20GBのファイルをコピーするには、平均してリアルタイムで約11.5分かかります(
)。このcp
操作はあまり効率的ではないことを知っています。(1)time
は、このようなコピーのシステム時間は〜 45秒; (2)コピー中にtop
を調べると、%CPU 非常に低いです(検査によると、平均しておよそ 0-10%)。
cp
を使用して、同じ〜20 GBのファイルをローカルディスクのあるフォルダから同じローカルディスクの別のフォルダにコピーするのにかかる時間は短く、約9リアルタイムで数分(time
によると、システム時間で最大51秒)。したがって、ファイルサーバーは予想どおりローカルディスクよりも多少遅いようですが、それほど遅くはないかもしれません。ローカルから同じローカルへのコピーが9分以内であることに驚いています。
ファイルサーバーからローカルディスクの1つに、最大200個の大きなファイル(それぞれ最大20 GB)をコピーする必要があります。したがって、私の質問は次のとおりです。 Linuxで大きなファイルをコピーするためのcp
のより高速な代替手段はありますか?(または、cp
内に、コピーを高速化するために使用できるフラグがありますか?)このコピー時間をなんとかして短縮できたとしても、それは
新しい高速のハードウェアディスクを購入することは間違いありませんが、そのようなリソースにアクセスすることはできません。私はシステム管理者でもありません。私は(初心者の)ユーザーです。 -そのため、ディスクにかかる負荷に関する詳細情報にアクセスできません。毎日約12人がファイルサーバーを使用していますが、この特定のノード/ローカルディスクを使用しているのは私だけです。
コメント
回答
%CPU はコピー中は低くする必要があります。 CPUは、ディスクコントローラに「セクターX〜YからZのメモリバッファにデータを取得する」ように指示します。次に、それは行って何か他のことをします(または他に何もない場合はスリープします)。データがメモリ内にある場合、ハードウェアは割り込みをトリガーします。次に、CPUはそれを数回コピーする必要があり、ネットワークカードに「メモリ位置A、B、およびCでパケットを送信する」ように指示します。その後、何か他のことをすることに戻ります。
あなたは最大240mbpsをプッシュしています。ギガビットLANでは、少なくとも800 mbpsを実行できる必要がありますが、次のようになります。
- ファイルサーバー(および場合によってはスイッチ間の接続など)を使用するすべてのユーザー間で共有されます
- これは、ファイルサーバーが書き込みを処理できる速度によって制限されます。ディスクI / O帯域幅は、それを使用するすべてのユーザーによって共有されることに注意してください。
- 方法を指定していません。ファイルサーバー(NFS、CIFS(Samba)、AFSなど)にアクセスしています。ネットワークマウントを調整する必要があるかもしれませんが、最近の半分では、デフォルトは通常かなり正気です。
ボトルネックを追跡するには、iostat -kx 10
は便利なコマンドになります。 「ローカルハードディスクでの使用率が表示されます。ファイルサーバーで実行できる場合は、ファイルサーバーのビジー状態が表示されます。
一般的な解決策は次のとおりです。そのボトルネックをスピードアップします。もちろん、予算はありません。ただし、より高速なアプローチを見つけることができる特別なケースがいくつかあります。
- ファイルが圧縮可能である場合、 CPUが高速であるため、最小の圧縮をオンザフライで実行する方が速い場合があります。
lzop
や。 - あちこちで数ビットだけ変更してからファイルを送り返す場合は、デルタのみを送信する方がはるかに高速です。残念ながら、
rsync
は、デルタを見つけるために両側でファイルを読み取る必要があるため、ここでは実際には役に立ちません。代わりに、ファイルを変更するときにデルタを追跡するものが必要です…ここでのほとんどのアプローチはアプリ固有です。ただし、デバイスマッパー(新しい dm-era target を参照)やbtrfsなどで何かを調整できる可能性があります。 - 同じデータを複数のマシンにコピーする場合は、udpcastなどを使用して、すべてのマシンに一度に送信できます。
そして、あなたは「システム管理者ではない」と言っているので、それはあなたがシステム管理者を持っていることを意味していると思います。または少なくともファイルサーバー&ネットワークの責任者です。おそらく彼に尋ねるべきです/彼女/彼らは、あなたのセットアップの詳細にもっと精通している必要があります。あなたのシステム管理者は、少なくともあなたが合理的に期待できる転送速度を教えてくれるはずです。
コメント
- +1 for iostat -kx 10 🙂
回答
これはおそらくより高速な代替手段であり、2日間ネットワークを詰まらせることはありません。1つまたは2つの大きなUSB(USB 3がある場合)またはFireWireディスクを取り、に接続します。サーバーとファイルをディスクにコピーします。ディスクをローカルマシンに運びます。ファイルをマシンにコピーします。
コメント
- スニーカーネット( en.wikipedia.org/ wiki /スニーカーネット)は非常に高速である可能性があります。高速道路を疾走するテープでいっぱいのステーションワゴンの帯域幅を過小評価しないでください。
回答
SSH(またはSFTP)に直接アクセスできる場合(sysadminに問い合わせる)、圧縮を使用してscp
を使用できます(-C
):
scp -C you@server:/path/to/yourfile .
もちろん、これはファイルが圧縮可能である場合にのみ役立ちます。これにより、CPU時間が長くなります。暗号化(SSH経由であるため)と圧縮を使用します。
コメント
- この場合、無効にすると便利です。暗号化。コピーを高速にしようとしていることを忘れないでください。
- @lgeorget暗号化のオーバーヘッドは重要ではないと思います’ 、ハードドライブの速度を考慮します。
-c none
について何か追加することを検討しましたが、そのは非標準のようです。 - ‘最大20Gのファイルを処理しているため、必要がない場合に暗号化を使用するのは かなり非効率的です。
- @lgeorget暗号化は’のスループットよりもはるかに高速に実行されるため、’速度が低下することはありません。ただし、ここでSSHを使用する必要はないようです。圧縮が必要な場合は、他のツールがありますか?
- @Thomas SSHの利点は、’がリモートサーバーにアクセスできることです。次に、’はほぼ確実にSSHを実行しています。もう1つのオプションは、ファイルをローカルで圧縮してサーバーにコピーしてから、
ssh
で解凍して解凍することです。
回答
効率の定義は逆です。より効率的な実装は、少ない CPU時間を浪費します。ローカルコピーでは、平均して約74 MB / sのスループット(読み取り+書き込み)が得られます。これは、1台のハードディスクが取得するのとほぼ同じです。
コメント
- おっと。”効率的、”と言ったとき、私は”高速を意味しました。”
回答
cp
実装はおそらくボトルネックではありません。サーバーとクラスターノードの両方で、iotop
を介してIOの使用状況を観察してみてください。これにより、パフォーマンスを向上させることができる場所がわかります。
もう1つのヒントは、同じホストから同じデータをコピーしないようにすることです。たとえば、ネットワークを介してファイルサーバーからすべてのクラスターノードに配布する同一の20Gファイルがある場合、1つのサーバーからすべてのクライアントにではなく、ピアツーピアの方法でファイルをコピーする場合よりもはるかに高速に動作します。実装は少し複雑ですが、直接接続ハブのようなコマンドラインp2pを使用することもできます。
その20Gファイル内で、一部が一般的で、一部がクラスターノード固有である場合は、検討してください。共通部分と特定部分に分割し、共通部分をp2p方式で配布します。
コメント
- ‘ LANを使用している場合は、ピアツーピアではなくマルチキャストを実行できる必要があります。これにより、ネットワークの負荷が軽減され、高速になります。
回答
これらのファイルの性質/内容によって、多少の違いが生じる可能性があります。あるコンピューターから別のコンピューターに、それぞれ最大20GBの200個のファイルをコピーする必要があることを理解しました。 、それはそれですか?
これらのファイルが圧縮可能であるか、類似/同一の部分である場合、2つのアプローチがあります:
-
コピーする前にそれらを圧縮するか、 zipが有効になっているコンピューター間のトンネルなので、ネットワークがボトルネックである場合は、少し速くなりますr
-
ファイルが非常に類似している場合、またはファイル間で共通のコンテンツの一部を共有している場合は、 rsync aを使用してみてください>。ファイル間で共通するものを見つけるのにしばらく時間がかかり、共通するものに基づいて再構築するため、文字通りコピーする必要はありません。
編集
これらのファイルを何度もコピーする必要がありますか??(コピーのように->これらのファイルを使用する->ファイル内の何かを変更するコンピューターAで->ファイルをコンピューターBに再度コピーします)
その場合、rsyncは「バージョン間で等しいものを検出しようとし、変更されていないものはコピーしない」ため、役に立ちます。
そして3番目の方法:上記が正しければ(ファイルを変更してから、すべてのファイルを2台目のコンピューターに再度コピーする)、binary diff
を試してみてください。 2番目のコンピューターでの変更最初のコンピューターで変更されたもの。
回答
ここに次のように表示されますが、暗号化は転送するデータの量が増える可能性があるため、お勧めします。
2つのシステム間でコピーする場合、ボトルネックはもちろんtです。サーバー間の接続。
ローカルでコピーしている場合は、プロセスがどのように進行するかを確認してください。シングルスレッドであるため、標準のLinuxユーティリティは次を使用します。
- for all blocks in a file read a block write a block
この操作に並行性はありません。
処理速度を上げるには、次のようなものを使用できます。
buffer -i infile -o outfile -m size-of-shared-memory-default-1MByte
詳細については、buffer(1)のmanページを参照してください。
bufferコマンドは、コピープロセスを同時に実行する2つのプロセスを設定します。1つは読み取り用、もう1つは書き込み用であり、共有メモリバッファーを使用して2つのプロセス間でデータを通信します。共有メモリバッファは、未書き込みのデータの上書きやすでに書き込まれたデータの書き込みを防ぐ、従来の循環バッファです。私はこのプログラムを使用して、ディスクからテープへの転送でコピー時間の約10〜20%を削減しました。
コメント
- 実際には、 “ブロックを書き込む/ブロックを書き込む” “ブロックを書き込む”の同時実行div id = “a8068dc6c4”>
は実際にはそれをカーネル’のバッファに入れるだけで、カーネルは実際のブロック書き込みをバックグラウンドで処理します(少なくともあなたがRAMが不足し始めます)。または、何らかの理由でO_DSYNC / O_SYNCを使用している場合。
回答
P2P伝播アルゴリズムを試してみませんか、クラスター全体を同時に更新する必要がある場合は?
https://github.com/lg/murder はTwitterが使用するもの
BTSync も試すことができます。
回答
同じファイルのセットをローカルコンピューターからサーバーに頻繁にコピーし、あちこちで小さな変更を加えている場合。 rsyncまたはDVCS(hgやgitなど)を使用して転送を高速化できます。
gitまたはhgは、デルタを追跡および検出し、それらのデルタのみを転送できます。 gitを使用する場合、両側にリポジトリの完全な履歴があるため、デルタを把握するのは非常に安価です。
rsyncは、ローリングチェックサムアルゴリズムの形式を使用して、反対側の内容を事前に知らなくてもデルタを検出します。rsyncがデルタを計算するにはより多くの作業が必要ですが、全体を保存する必要はありません。ファイル履歴。
回答
すべてのファイルを単一のアーカイブにパッケージ化してみてください(圧縮する必要はありません)。私の経験では、その1つのアーカイブをコピーする方が、多数の個別のファイルをコピーするよりも高速です
コメント
- 一般的な観察結果は良好ですが、質問にあるように「〜200個の大きなファイル-それぞれ〜20 GB」、’これがこの問題に対する実際の答えと見なすことができるとは思いません。
- @manatwork ah ..私は’はっきりと読んでいませんでした。彼には合計20GBのファイルが200個あると思いました
回答
bbcp を試してください。私たちの環境でテストしたところ、cpになんらかの種類があることがわかりました。 fビルトインガバナー。ガバナーを外すと、サーバーに赤線が引かれ、停止する可能性があるため、注意してください。私たちの場合、コピーを行うためにサーバーをオフラインにしていたので、速い方が良かったです。これにより、転送時間が数時間改善されました。
回答
ターゲットを確認してくださいファイルはコピーする前に存在しません。
同じホスト(ネットワークが関与していない)にコピーするだけでも、驚くほどの時間がかかることがあります。
別のcpの質問に対する私の回答を参照してください。簡単に言うと、既存のファイルを上書きする方が、最初にファイルを切り捨てたりリンクを解除したりするよりもはるかに時間がかかります。後者は1.2GBファイルの場合8倍高速です。
と
rsync
で、どちらが環境でより高速に動作するかを比較しますdd
はまだ試していませんが、rsync
を試しました。time
によると、リアルタイムは約11.5分、システム時間は約1.5分でした。/dev/sda1
から/dev/sdb1
へのコピーは、/dev/sda1
の1つの場所からコピーするよりも高速になります。ハードドライブが勝ったため、/dev/sda1
の別の場所または/dev/sda
の別のパーティションに移動します’ t読み取りと書き込みの間に追加のシークを実行する必要があります(回転するディスクと移動するヘッドを備えた従来のハードドライブを想定しています。SSDは明らかに異なります)。