2台のコンピューター間で大量のデータを送信する最速の方法は何ですか?[閉まっている]


111

これは私が頻繁にいる状況です:

  • 内部に320GBのハードドライブと16GBのRAMを備えたソースサーバーがあります(正確な仕様はここ入手できますが、これは他のマシンでも頻繁に遭遇する問題であるため、 「合理的な」Linuxマシン)
  • 数テラバイトのハードドライブ領域を備えたバックアップサーバーがあります(正確な仕様はこちら、上記の免責事項を参照)

ソースサーバーからターゲットサーバーに320 GBのデータ(具体的にはからのデータ/dev/sda)を転送したい。

  1. 2台のコンピューターは物理的に隣り合っているので、ケーブルを接続できます。
  2. 私はLAN上にいて、新しいルーターを使用しています。これは、ネットワーク速度が「理想的には」1000Mビットであるべきだということです。
  3. セキュリティは問題ではありません。私はローカルネットワーク上にあり、ルーターを含むネットワーク上のすべてのマシンを信頼ています。
  4. (オプション)データの署名付きチェックサムは必ずしも必要ではありませんが、基本的なエラーチェック(ドロップされたパケットやドライブが読み取れなくなるなど)は、出力に消えるのではなく、検出する必要があります。

この質問をオンラインで検索し、いくつかのコマンドをテストしました。最も頻繁に表示されるのはこれです:

ssh user@192.168.1.100 'dd bs=16M if=/dev/sda | gzip' > backup_sda.gz

このコマンドは遅すぎることが判明しました(1時間実行し、データで約80GBしか得られませんでした)。1GBのテストパケットには約1分22秒かかり、圧縮されていない場合は2倍の速度になりました。また、転送されたファイルがソースシステムのRAM容量よりも少ないという事実によって、結果が歪められた可能性があります。

さらに(これは1GBのテストピースでテストされました)、gzipコマンドとdd; を使用すると問題が発生します。結果ファイルは、直接パイプされた場合とは異なり、ターゲットで抽出されたときとは異なるチェックサムを持ちます。私はまだこれが起こっている理由を解明しようとしています。



4
/dev/sda画像として転送するのか、ファイルだけを転送するのか。rsyncにオプションがないのはなぜですか?され/dev/sda、あなたがしながら、マウントdd編?
ジョッカレモン

15
パフォーマンスデータ(1GB / 80sec、80GB / 1h)は、100MBitで予想されるものと完全に一致します。ハードウェアを確認してください。...そしてgerritは正しい、320​​GBは大きいかもしれませんが、「大量のデータ」は間違った期待を引き起こします。
blafasel

8
「ディスクでいっぱいの貨物列車の帯域幅を過小評価しないでください。」..スループット、レイテンシー、またはその2つの組み合わせについて質問していますか?
ケシュラム

8
私の友人はいつも「トラック上のハードドライブの山の帯域幅を過小評価しないでください」と言っていました。
アマダノン株式会社

回答:


139

サーバーは物理的に隣り合っており、コメントで言及しているように、サーバーに物理的にアクセスできるため、最速の方法は、最初のコンピューターからハードドライブを取り出し、2番目に設置して、ファイルを転送することですSATA接続を介して。


15
+1:物理的な転送は、どこかから大きな外付けハードドライブを取得することを意味する場合でも、最速のルートのようです。それは約40ポンドであり、おそらくあなたはすでにそれだけの時間を費やしているでしょう。
deworde

3
ギガビットネットワーク全体で最高速度が得られる場合、私はこの考えに完全に反対します。HP Gen 7マイクロサーバーとPentium G630マシン間のZyxelギガビットスイッチでNFS / SMBを介してテストすると、約100MB / sの転送が可能です。(ドライブプラッターの外側のエッジを離れるまで。)だから、現実的には3時間以内に完了すると思います。SSDまたは非常に高性能なドライブ/ストレージを使用している場合を除き、2つのコピーが100MB /秒のスループットを生成することはないと思います。
ファイゼズ

3
@Phizes:明らかに一時ファイルにコピーしません。それはdewordの悪い考えであり、他の誰もが話していることではありません。ソースドライブをターゲットマシンに接続するポイントは、SATA-> SATA with dd(またはファイルシステムツリーのコピー)です。
ピーターコーデス

10
「ハードドライブでいっぱいのトラックの帯域幅を決して過小評価しないでください。レイテンシーの1つの地獄」
ケビン

3
@Kevin:はい、私のポイントは、同じコンピューター内のディスク間の直接コピーは、少なくとも他の可能な方法と同じくらい速いということでした。実際の帯域幅の数値を表示して、gizeを超えることはOPの古いドライブでは問題ないが、新しいドライブではボトルネックになるというPhizeのポイントを確認しました。(1台のコンピュータの両方のドライブがある一つのケースではない最良のオプションは、ソースとdestのメタデータをキャッシュするために彼らのRAMを使用して、別のコンピュータを持つことは、ファイルの数十億のrsyncのために、たとえば、重要な場合です。)
ピーター・コルド

69

netcat セキュリティが問題にならないこのような状況に最適です:

# on destination machine, create listener on port 9999
nc -l 9999 > /path/to/outfile

# on source machine, send to destination:9999
nc destination_host_or_ip 9999 < /dev/sda
# or dd if=/dev/sda | nc destination_host_or_ip 9999

ddGNU coreutilsから使用している場合はSIGUSR1、プロセスに送信すると、stderrに進行状況が出力されることに注意してください。BSDのdd場合は、を使用しますSIGINFO

pvは、コピー中の進行状況をレポートするのにさらに役立ちます。

# on destination
nc -l 9999 | pv > /path/to/outfile

# on source
pv /dev/sda | nc destination_host_or_ip 9999
# or dd if=/dev/sda | pv | nc destination_host_or_ip 9999

2
第二の例では、されてddも、必要な、またはすることができますpv/ nc治療/dev/sda自分でうまく?(そのような特別なファイル、または0x00バイトのあるファイルを読み取ろうとすると、いくつかのコマンドが「スローアップ」することに気付きました)
-IQAndreas

5
@ user1794469圧縮は役立ちますか?私は、ネットワークはボトルネックがある場所ではないと考えています。
IQAndreas

17
netcatとの間でそれぞれパイピングする代わりに、IP ポートIP ポートのリダイレクトをbash使用できることを忘れないでください。> /dev/tcp//< /dev/tcp//
Incnis MRSI

5
いい答えだ。多くの場合、ギガビットイーサネットはハードドライブの速度よりも速いため、圧縮は役に立ちません。複数のファイルを転送するにはtar cv sourcedir | pv | nc dest_host_or_ip 9999、とを検討してくださいcd destdir ; nc -l 9999 | pv | tar xv。多くのバリエーションが可能です。たとえば.tar.gz、コピーではなく宛先側に保持したい場合があります。ディレクトリをディレクトリにコピーする場合、安全性を高めるために、たとえばdestからrsyncを後で実行できます。rsync --inplace -avP user@192.168.1.100:/path/to/source/. /path/to/destination/.これにより、すべてのファイルが実際に正確なコピーであることが保証されます。
ステファンゴーリチョン

3
IPv4を使用する代わりに、IPv6のペイロードが大きいため、IPv6を使用することでスループットを向上させることができます。マシンがIPv6対応している場合でも、それを設定していない彼らはおそらくすでにIPv6リンクローカルアドレスを持っている
デヴィッド・コスタ

33
  1. 高速圧縮を使用してください

    • 転送メディア(特にネットワークまたはusb)が何であれ、読み取り、キャッシュ、書き込みのデータバーストを処理します、これらは正確には同期されません。
    • ディスクファームウェア、ディスクキャッシュ、およびカーネル/ラムキャッシュに加えて、あなたはまたごとに交換されるデータの量に集中するために、何らかの形でのシステムのCPUを採用することができるならば、バーストを、あなたがそうする必要があります
    • 圧縮アルゴリズムは、入力のスパース実行を可能な限り高速で自動的に処理しますが、ネットワークスループットで残りを処理するものはほとんどありません。
    • lz4 ここであなたの最良のオプションです:

      LZ4は非常に高速なロスレス圧縮アルゴリズムであり、コアあたり400 MB / sの圧縮速度を提供し、マルチコアCPUで拡張可能です。また、コアあたり数GB /秒の速度を備えた非常に高速なデコーダーを備えており、通常はマルチコアシステムでRAMの速度制限に達します。

  2. 不必要にシークないでください

    • これを測定することは困難です。
    • コピー元のデバイスに多くの空き領域があり、デバイスが最近ゼロ化されていないが、すべてのソースファイルシステムをコピーする必要がある場合は、まず最初に行う価値があります。何かのようなもの:

      </dev/zero tee >empty empty1 empty2; sync; rm empty*
    • しかし、それはソースを読むべきレベルに依存します。通常/dev/some_disk、ファイルシステムレベルでの読み取りには、ディスクを前後にシーケンシャルにシークする必要があるため、デバイスを最初から最後までデバイスファイルから読み取ることが望ましいです。したがって、読み取りコマンドは次のようになります。

      </dev/source_device lz4 | ...
    • ただし、ソースファイルシステム全体を転送する必要がない場合は、ファイルシステムレベルでの読み取りはかなり避けられないため、入力コンテンツをストリームにまとめる必要があります。paxその場合、一般的には最良かつ最も単純なソリューションですがmksquashfs、同様に考慮することもできます。

      pax -r /source/tree[12] | lz4 | ...
      mksquashfs /source/tree[12] /dev/fd/1 -comp lz4 | ...
      
  3. 暗号化ないでくださいssh

    • 信頼できるメディアに暗号化オーバーヘッドを追加する必要はありません。また、データの読み取りには2回の読み取りが必要なため、持続的な転送速度に重大な悪影響を与える可能があります。
    • PRNGは、読み出しデータを必要とする、またはその少なくとも一部は、ランダム性を維持します。
    • そしてもちろん、データも転送する必要があります。
    • また、暗号化オーバーヘッド自体を転送する必要があります。つまり、バーストごとに転送されるデータ量が少なく、より多くの作業が必要になります。
    • むしろ、他の場所で提案されているように、単純なネットワークコピーにnetcatまたは、私が好むようにnmapプロジェクトの能力が高いほどncat)使用する必要があります。

      ###  on tgt machine...
      nc -l 9999 > out.lz4
      ###  then on src machine...
      ... lz4 | nc tgt.local 9999
      

1
素晴らしい答え。1つの小さな文法的なポイント-「バーストごとに交換する必要のあるデータの量を減らす」ただし、バーストごとに転送される情報は異なる場合があります。
エンジニアドレリー

@EngineerDollery-はい、それは愚かでした。良いと思う
-mikeserv

@IQAndreas-この答えを真剣に検討します。個人的にはpigzを使用していますが、速度の向上は驚くべきものです。並列処理は大きな勝利です。CPUはデータパイプラインの他の部分よりもはるかに高速であるため、並列圧縮によって速度が低下することは疑わしい(gzipは並列化できません)。これを十分に速く見つけて、ハードドライブをジャグリングするインセンティブがない場合があります。これが全体的に高速であれば(ディスクスワップ時間を含めて)驚かないでしょう。圧縮の有無にかかわらずベンチマークを実行できます。いずれにせよ、BlueRajaのディスクスワップの回答か、これがあなたの受け入れられた回答でなければなりません。
マイクS

高速圧縮は優れたアドバイスです。ただし、データが適度に圧縮可能である場合にのみ役立つことに注意してください。これは、たとえば、データが既に圧縮形式であってはならないことを意味します。
ウォルタートロス

@WalterTrossは-かどうかは助ける任意の入力があれば、圧縮ジョブが転送ジョブを凌駕として、関係なく、比圧縮可能です。最新の4コアシステムでは、lz4ジョブは広く開かれたGIGeでさえ簡単に歩調を合わせるはずであり、USB 2.0はチャンスに耐えません。また、lz4必要なときにのみ動作するように設計されました-圧縮をいつ試行すべきか、実行すべきでないことがわかっているため、部分的に高速です。また、デバイスファイルが転送される場合、ソースファイルシステムに断片化があると、事前に圧縮された入力でさえ多少圧縮される可能性があります。
mikeserv

25

転送速度を制限している可能性のあるいくつかの制限があります。

  1. 1Gbpsパイプには固有のネットワークオーバーヘッドがあります。通常、これにより実際のスループットは900 Mbps以下に低下します。次に、これは双方向トラフィックであり、900Mbps未満の大幅なダウンが予想されることを覚えておく必要があります。

  2. 「新しいルーター」を使用している場合でも、ルーターが1Gbpsをサポートしていると確信していますか?すべての新しいルーターが1Gbpsをサポートしているわけではありません。また、エンタープライズグレードのルーターでない限り、ルーターへの追加の送信帯域幅が非効率になる可能性があります。以下で見つけたものに基づいていますが、100Mbpsを超えているようです。

  3. ネットワークを共有している他のデバイスからネットワークが混雑している可能性があります。あなたができると言ったように、直接接続されたケーブルを使ってみましたか?

  4. 使用しているディスクIOの量は?おそらく、ネットワークによってではなく、ディスクドライブによって制限されています。ほとんどの7200rpm HDDは、約40MB / sしか取得しません。まったく空襲を使用していますか?SSDを使用していますか?リモートエンドで何を使用していますか?

バックアップのためにこれを再実行することが予想される場合は、rsyncを使用することをお勧めします。ssh / http / https / ftp接続を並列化するため、反対側のfilezillaなどのダウンローダーを使用してscp、ftp(s)、またはhttpを使用することもできます。これにより、他のソリューションが単一のパイプ上にあるため、帯域幅を増やすことができます。シングルパイプ/スレッドは、シングルスレッドであるという事実により制限されます。つまり、CPUにバインドされることさえあります。

rsyncを使用すると、ソリューションの複雑さを大幅に排除するだけでなく、圧縮、許可の保存、部分的な転送を許可できます。他にもいくつかの理由がありますが、一般的に大企業の推奨バックアップ方法(またはバックアップシステムの実行)です。Commvaultは、バックアップの配信メカニズムとして、実際にソフトウェアの下でrsyncを使用します。

80GB / hの指定例に基づいて、約177Mbps(22.2MB / s)を取得しています。2つのボックス間の専用イーサネット回線でrsyncを使用すると、これを簡単に倍増できると思います。これは、rsync over gigabitを使用した独自のテストでこれを達成できたためです。


12
+1 rsync初めて実行する場合は高速ではないかもしれませんが、それ以降は必ず実行されます。
Skrrp

4
>ほとんどの7200rpm HDDは、約40MB / sしか取得できません。IMEの場合、最新のドライブ(およびこれには〜5kドライブが含まれます)で100MB / sを超えるシーケンシャルが表示される可能性が高くなります。ただし、これは古いディスクの可能性があります。
ボブ

2
@Bob:現代人は今でも毎分5400の円形トラックしか読むことができません。各トラックには1メガバイトを超えるため、これらのディスクは依然として高速です。つまり、それらは非常に大きなディスクでもあることを意味します。小さな320 GBのディスクは、トラックごとに多くのキロバイトを保持できないため、必然的に速度が制限されます。
–MSalters

1
40MB / sは、過去10年間に作成されたドライブのシーケンシャルリードに対して非常に悲観的です。ボブが言うように、現在の7200RPMドライブは100MB / sを超えることができます。
ホッブズ

3
ギガビットイーサネットは1000 mbps 全二重です。各方向で 1000mbps(または、実際には約900mbps)を取得します。第二に...現在、ハードドライブは通常100MB /秒を取得しています。これが10年前のドライブでない限り、40MB /秒は遅いです。
デロバート

16

これは定期的に対処しています。

私たちが使用する傾向がある2つの主な方法は次のとおりです。

  1. SATA / eSATA /スニーカーネット
  2. ダイレクトNFSマウント、ローカルcpまたはrsync

1つ目は、ドライブを物理的に再配置できるかどうかによって異なります。これは常にそうではありません。

2番目は驚くほどうまく機能します。一般的に、直接NFSマウントではかなり簡単に1gbps接続を最大化します。scp、dd over ssh、または同様のものを使用しても、これに近い場所には到達しません(100mpbsに疑わしいほどの最大レートが得られることがよくあります)。非常に高速なマルチコアプロセッサでも、2台のマシンのうち最も遅いマシンの1つのコアの最大暗号化スループットのボトルネックにぶつかります。これは、暗号化されていないネットワークマウントのフルボアcpまたはrsyncと比べて圧倒的に遅いです。時折、IOPSの壁にぶつかり、より一般的な〜110MB / sではなく〜53MB / s程度でスタックすることがありますが、ソースまたは宛先が実際にない限り、通常は短命です単一のドライブの場合、ドライブ自体の持続速度によって制限されることになります(実際に試してみるまでわからないランダムな理由で十分に変化します)。

NFSは、なじみのないディストリビューションにある場合、セットアップするのが少し面倒ですが、一般的に言えば、可能な限りパイプをいっぱいにする最も速い方法です。前回10gbps以上でこれを行ったとき、接続を最大にしたかどうかは実際にはわかりませんでした。コーヒーをつかんでから戻ってくる前に転送が終わったためです。送信元と送信先の間にいくつかのネットワークデバイスがある場合、ネットワークのスリンキー効果による若干の遅延または一時中断が発生する可能性がありますが、通常、これはオフィス全体(他のトラフィックがそれを混乱させることなく)またはデータセンターの一端からもう1つ(何らかの種類のフィルタリング/検査が内部で発生している場合を除き、この場合、すべてのベットはオフになります)。

編集

圧縮に関するおしゃべりに気付きました... 接続を圧縮しないでください。暗号化レイヤーと同じように速度が低下します。接続を圧縮すると、ボトルネックは常に単一のコアになります(そのコアのバスを特に有効に利用することさえできません)。状況でできる最も遅いことは、1gbps以上の接続で隣り合って座っている2台のコンピューター間で暗号化された圧縮チャネルを使用することです。

将来の証明

このアドバイスは2015年半ばの時点で有効です。これは、ほぼ間違いなく、もう何年もの間そうではありません。したがって、すべてを一粒の塩で取り、このタスクに定期的に直面する場合は、理論上の最適値に近いものを得るのでなく、実際の負荷でさまざまな方法を試してくださいトラフィックの多くはテキストです(ヒント:バルク転送は通常、主に画像、音声、ビデオ、データベースファイル、バイナリコード、オフィスファイル形式などで構成されており、既に圧縮されています独自の方法で、さらに別の圧縮ルーチンを実行してもほとんどメリットはありません。その圧縮ブロックサイズは、すでに圧縮されたバイナリデータと整合しないことがほぼ保証されています...)。

将来、SCTPのような概念はより興味深い場所に運ばれ、そこでは結合接続(または内部結合によるスペクトルチャネライズドファイバ接続)が一般的であり、各チャネルは他のチャネルから独立したストリームを受信でき、ストリームは並行して圧縮/暗号化などができます。それは素晴らしいことです!しかし、2015年の今日はそうではありません。空想と理論化は素晴らしいことですが、ほとんどの場合、Wootsonの回答を生成するBlue Gene / Qの内部に直接データを供給する低温チャンバー内で実行されるカスタムストレージクラスターはありません。それは現実ではありません。また、データペイロードを徹底的に分析して、圧縮が良いアイデアかどうかを判断する時間もありません。分析を完了する前に転送自体は終了するでしょう。

しかし...

時代は変わり、圧縮と暗号化に対する私の推奨は成り立たなくなります。私はこのアドバイスが典型的なケースですぐに覆されることを本当に望んでいます。それは私の人生を楽にするでしょう。


1
@jofelネットワーク速度プロセッサの圧縮スループットより遅い場合のみ-1gpbs以上の接続では決して当てはまりません。ただし、典型的なケースでは、ネットワークがボトルネックであり、圧縮によって効果的に速度が向上しますが、OPが説明するケースではありません。
zxq9

2
lz4ボトルネックのgigEを発生させないほど高速ですが、コピーをどのように処理するかによっては、非圧縮にする必要がある場合があります。lzopもかなり高速です。私のi5-2500k Sandybridge(3.8GHz)では、〜180MB lz4 < /dev/raid0 | pv -a > /dev/null/ s入力、〜105MB / s出力で、gigEにちょうど適しています。受信側での解凍は、CPUでさらに簡単です。
ピーターコーデス

1
また、3.8GHzは、ほとんどのサーバープロセッサ(または、少なくとも私が見慣れている多くのビジネスグレードのシステム)よりもかなり高速です。データセンターでは、はるかに低いクロック速度で非常に多くのコアカウントを確認することが一般的です。転送負荷の並列化は長い間問題になっていないため、ほとんどの場合、単一コアの最大速度に固執していますが、クロック速度は一般的に最大になりますが、ネットワーク速度には依然として最大値に達するまでの長い道のり。
zxq9

2
圧縮に関するあなたのコメントには完全に同意しません。データの圧縮性に完全に依存します。99.9%の圧縮率が得られる場合、そうしないのは愚かなことです。100MBの転送で逃げることができるのに、なぜ100GBを転送するのでしょうか。このレベルの圧縮がこの質問のケースであることを示唆しているのではなく、これはケースバイケースで検討する必要があり、絶対的なルールがないことを示しています。
エンジニアドレリー

1
@EngineerDolleryこれは、実際の世界はバルク転送ではまったく機能しません。私はこれをほぼ毎日行い、さまざまな方法と設定をテストしました。一般的なケースでは、未知のデータの大バルク転送(あなたは上の圧縮チューニングテストを実行する時間を持っていないもの-実際には、ほぼすべてのデータセンター内のすべてのもの、企業のインフラ、中小企業のサーバー、またはホームネットワークを意味する)されている多くの 1gbps以上の接続で高速。やってみてください。通常、テキストは圧縮に最適です。テキストは、典型的なバルク転送ペイロードのごく一部を構成します。
zxq9

6

私は過去に使用した気の利いたツールですbbcp。ここに見られるように:https://www.slac.stanford.edu/~abh/bbcp/

http://pcbunn.cithep.caltech.edu/bbcp/using_bbcp.htmも参照してください

このツールを使用すると、転送速度が非常に速くなりました。


1
この回答の2番目のリンクでは、カーネルパラメーターを調整して高速化する方法を説明しています。そこの著者は、10Gリンクで毎秒800メガバイトを取得しましたが、1Gbpsリンクに適用できるものもあります。
ステファンゴーリチョン

5

何らかの方法で(ワイヤ/スニーカーネット/その他を介して)最初のパスを取得した場合、rsync後続の転送を大幅に高速化できる特定のオプションを検討できます。非常に良い方法は次のとおりです。

rsync -varzP sourceFiles destination

オプションは、冗長、アーカイブモード、再帰、圧縮、部分的な進行です。


2
Rsyncはnetcatよりも信頼性が高いですが、アーカイブは再帰を意味するため、rは冗長です。
タナス

また、-zCPUと処理しているデータによっては、非常に遅くなる可能性があります。圧縮を無効にすると、転送速度が30 MB / sから125 MB / sになることがあります。
リンデ

4

zackseの答えへのコメントに元のポスターの主張を追加しましたそれが典型的な状況で最速かどうかはわかりません。

bash特別なリダイレクト構文があります:
出力用:      > /dev/tcp/IP /ポート
入力用:       < /dev/tcp/IP /ポート
IPはドット付き10進IPまたはホスト名のいずれかを禁止します。 port banは、10進数またはからのポート名のいずれか/etc/servicesです。

実際の/dev/tcp/ディレクトリはありません。これはbash、TCPソケットを作成し、指定された宛先に接続し、通常のファイルリダイレクトと同じことを行う(つまり、それぞれの標準ストリームをdup2(2)を使用してソケットに置き換える)ように命令する特別な構文上のクラッジです。

したがって、ソースマシンからddまたはtarTCP経由で直接ソースマシンにデータをストリーミングできます。または、逆に、tarTCPを介してデータを直接または同様にストリーミングします。いずれの場合でも、1つの余分なnetcatが排除されます。

netcatに関する注意

ある古典のnetcatとGNUのnetcatとの構文で矛盾が。慣れ親しんだ古典的な構文を使用します。置き換え-lp-lはGNU netcatをのために。

また、GNU netcatが-qスイッチを受け入れるかどうかもわかりません。

ディスクイメージの転送

(zackseの答えに沿って。)
目的地で:

nc -lp 9999 >disk_image

ソースで:

dd if=/dev/sda >/dev/tcp/destination/9999
 

tar.gzアーカイブを作成します。 tar

目的地で:

nc -lp 9999 >backup.tgz

ソースで:

tar cz files or directories to be transferred >/dev/tcp/destination/9999

交換する.tgz.tbzしてczしてcjもらうためにbzip2-compressedアーカイブを。

ファイルシステムへの即時拡張を伴う転送

またtar
目的地で:

cd backups
tar x </dev/tcp/destination/9999

ソースで:

tar c files or directories to be transferred |nc -q 1 -lp 9999

なし-q 1でも機能しますが、データが終了するとnetcatはスタックします。の構文と注意事項については、tar(1)を参照してくださいtar。高い冗長性(低エントロピー)を持つ多くのファイルがある場合には、圧縮(例えば、czxzの代わりに、cx)試みることができますが、ファイルが典型的であり、ネットワークが十分に高速であれば、それだけで、プロセスを遅らせるだろう。圧縮の詳細については、mikeservの回答を参照してください。

代替スタイル(宛先はポートをリッスンします)

目的地で:

cd backups
nc -lp 9999 |tar x

ソースで:

tar c files or directories to be transferred >/dev/tcp/destination/9999

bashは実際にソケットを「リッスン」することはできません。ファイルunix.stackexchange.com/questions/49936/を待って受信するために、接続の少なくとも半分に別の何かを使用する必要があります。 ...
ロジャードパック


2

パッケージを必要とするこのスクリプトを使用しsocatます。

ソースマシンで:

tarnet -d wherefilesaretosend pass=none 12345 .

ターゲットマシン:

tarnet -d wherefilesaretogo pass=none sourceip/12345

場合vbufパッケージ(Debianの、Ubuntuの)があるし、ファイル送信側はデータの進行状況が表示されます。ファイル受信者は、受信したファイルを表示します。pass =オプションは、データが公開される可能性がある(遅い)場合に使用できます。

編集:

-nCPUがボトルネックである場合、圧縮を無効にするオプションを使用します。


2

予算が主な関心事ではない場合は、Intel Xeon E5 12コア「ドライブコネクタ」でドライブを接続してみてください。このコネクタは通常非常に強力であるため、現在のサーバーソフトウェアを実行することもできます。両方のサーバーから!

これは楽しい答えのように見えるかもしれませんが、サーバー間でデータを移動している理由と、共有メモリとストレージを備えた大きなデータがより意味があるかどうかを本当に考慮する必要があります。

現在の仕様についてはわかりませんが、低速転送はネットワークではなくディスク速度によって制限される可能性がありますか?


1

ハードドライブのバイトコピーごとではなく、バックアップのみが必要な場合は、backupPCをお勧めします。http://backuppc.sourceforge.net/faq/BackupPC.htmlセットアップするのは少し苦痛ですが、すぐに転送されます。

約500Gのデータの最初の転送時間は約3時間でした。後続のバックアップは約20秒で行われます。

バックアップに興味はないが、同期しようとしている場合は、rsyncまたはunisonがニーズに合っています。

ハードディスクのバイトコピーのバイトは、通常、バックアップ目的のための恐ろしいアイデアです(増分、スペース節約、ドライブは使用できません。「空のスペース」をバックアップする必要があり、ゴミをバックアップする必要があります) (16 Gスワップファイルまたは200 Gのコアダンプなど)。rsync(またはbackuppcまたはその他)を使用して、「スナップショット」を時間内に作成できるため、「30分前のファイルシステムの外観」に移動できます。オーバーヘッドはほとんどありません。

つまり、バイトコピーのためにバイトを本当に転送したい場合、問題は、ドライブからのデータの取得ではなく、転送にあります。400GのRAMを使用すると、320Gのファイル転送には非常に長い時間がかかります。暗号化されていないプロトコルを使用することはオプションですが、何があっても、そこに座って数時間(ネットワーク経由で)待つ必要があります。


1
400GのRAMはどのようにデータ転送を高速化しますか?
スカペレン

これが意図かどうかは定かではありませんが、「RAMをRAMに転送するよりも遅いメディアは少し時間がかかる」と読みました。「400 GBのRAMを購入すると、HDDからHDDへの転送が速くなります」。
MichaelS

うん、ラムはあなたのためにバッファリングします、そしてそれはより速く見えるでしょう。RAMバッファリングを使用してHDからHDへの転送を行うことができ、非常に高速に見えます。また、ディスクにフラッシュするにはかなりの労力が必要ですが、HD to RAM to RAM to HDはHD to HDよりも高速です。(とにかくHD to RAM to RAM to HDをしなければならないが、RAMの転送サイズ全体よりも少ない場合は、セグメントで「フラッシュ」する必要があることに
注意してください

別の言い方をすれば、ソースドライブ全体を圧縮したり送信したりするだけでも、RAMに読み込む必要があります。一度に収まらない場合は、セグメントの読み取り、送信、セグメントの破棄、シーク、セグメントの読み取りなどを行う必要があります。一度に収まる場合は、一度にすべてを読み取る必要があります。宛先でも同じです。
coteyr

1
HD to RAM to RAM to HDはHD to HDよりも高速です。
AL

1

プログラムに関係なく、私は通常、ネットワークを介した「プル」ファイルが「プッシュ」よりも高速であることを発見しました。つまり、移行先コンピューターにログインして読み取りを行う方が、移行元コンピューターにログインして書き込みを行うよりも高速です。

また、中間ドライブを使用する場合は、これを考慮してください。USBではなくeSATAを使用する外部ドライブ(パッケージとして、またはドッキングステーションにプラグインされた別のドライブ)を入手します。次に、2台のコンピューターのそれぞれに、eSATAポートを備えたカードを取り付けるか、内部SATAポートの1つを外部eSATAコネクターに接続する簡単なアダプターケーブルを入手します。次に、ドライブをソースコンピューターに接続し、ドライブの電源を入れて、自動マウントされるまで待ちます(手動でマウントできますが、これを繰り返し行う場合は、fstabファイルに入れることもできます)。次にコピーします。内蔵ドライブと同じ速度で書き込みます。次に、ドライブをアンマウントし、電源を切り、他のコンピューターに接続し、電源を入れ、自動マウントを待ってから読み取ります。


2
ファイルを「プル」する方法の詳細を提供できますか?どのユーティリティを使用していますか?また、この効果を示すサンプルを提供できますか?
STW

これがより完全な答えになるかどうかはわかりませんが、このシナリオを考えてみましょう。fooとbarの2台のコンピューターがあり、fooからbarにデータをコピーするとします。(1)fooにログインしてから、物理的にbarに接続されているドライブをリモートマウントします。次に、fooのディスクからリモートでマウントされたディレクトリ(物理的にbar上にある)にコピーします。私はこれを他のコンピューターにデータをプッシュすると呼びました。(2)同じデータをコピーする他の方法と比較してください。barにログインし、fooに接続されているディレクトリをリモートマウントし、fooからbarのドライブに読み取ります。これは引っ張っている。
マイクチャラルディ

このコピーは、Linux cpコマンドを使用して、GUIファイルマネージャーから、またはファイルをコピーする他の方法で実行できます。書き込みは読み取りよりも遅く、宛先ディスクへの書き込み方法に関する決定の多くはドライブが接続されている同じコンピューターで行われるため、引き出しは速くなると思うので、オーバーヘッドが少なくなります。しかし、おそらくこれは、最新のシステムではそうではありません。
マイクチャラルディ

1

NICチーミングを確認することをお勧めします。これには、並行して実行されている複数のネットワーク接続の使用が含まれます。本当に1Gbを超える転送が必要であり、10Gbのコストが非常に高いと仮定すると、NICチーミングによって提供される2Gbはわずかなコストになり、コンピューターには既に余分なポートがあります。


LACP(Link Aggregation Control Protocol)に言及している場合、速度の向上は見られません。冗長性と、より多くの同時接続に対応する機能が提供されましたが、このタイプの転送の速度は向上しません。
STW

@STW:1台のマシンへの2つのリンクを2gbitリンクに集約するにはスイッチサポートが必要ですが、可能です。ただし、両方のマシンにスイッチへの2gbitリンクがある場合にのみ役立ちます。NIC <-> NICを実行し、スイッチなしの2本のケーブルがある場合も機能しますが、あまり役に立ちません(1台のマシンに3つ目のNICがあり、それらをインターネットに接続している場合を除く)。
ピーターコーデス

スイッチのこの機能に特定の名前はありますか?
STW

NICチーミング、EtherChannelなどにはいくつかのバリエーションがあります。STWは特定の構成に適しています。これは役に立ちませんが、一部の構成では役立ちます。ボンディングされたチャネルが単一のIPソケットのパフォーマンスを高速化するかどうかにかかっています。これがあなたにとって実行可能なソリューションであるかどうかを判断するには、詳細を調査する必要があります。
バイロンジョーンズ

802.3adは、スイッチで探すオープンスタンダードです。ただし、簡単なハックとして、追加のNICをネットワークに接続し、プライベートアドレススペースの個別のサブネットに適切なIPアドレスを与えるだけです。(ホスト1ポートaおよびホスト2ポートaは1つのサブネットを取得し、ホスト1ポートbおよびホスト2ポートbは別のサブネットを取得します)。次に、2つの並列ジョブを実行して転送を行います。これは、EtherChannel、802.3adの、などのインとアウトを学ぶよりもずっと簡単になります
ダンPritts

1

FWIW、私はいつもこれを使用しています:

tar -cpf - <source path> | ssh user@destserver "cd /; tar xf -"

この方法に関することは、マシン間でファイル/フォルダーのアクセス許可を維持することです(同じユーザー/グループが両方に存在すると仮定します)(また、スパースファイルを処理するために-Sパラメーターを使用できるため、通常はこれを仮想ディスクイメージをコピーするために行います。 )

2つのビジーなサーバー間でこれをテストし、216秒で約14GB(約64MB /秒)を管理しました-専用マシンおよび/または圧縮間でより良い結果が得られる可能性があります... YMMV

$ date; tar -cpf - Installers | ssh elvis "cd /home/elvis/tst; tar xf -"; date
Wed Sep  9 15:23:37 EDT 2015
Wed Sep  9 15:27:13 EDT 2015

$ du -s Installers
14211072   Installers

1

ファイルシステムのフォレンジックを行いたい場合を除き、ファイルシステム用のダンプ/復元プログラムを使用して、FSが使用していない空き領域をコピーしないようにします。使用しているファイルシステムに応じて、通常、これはを含むすべてのメタデータを保持しますctime。ただし、iノード番号は、どのファイルシステム(xfs、ext4、ufs ...)によっても変わる可能性があります。

復元ターゲットは、ターゲットシステム上のファイルにすることができます。

パーティションテーブル付きのフルディスクイメージが必要な場合ddは、ディスクの最初の1Mでパーティションテーブル/ブートローダー/ものを取得し、その後パーティションを取得できますxfsdump

info-dumpから、実際にどのようなファイルシステムを持っているのかわかりません。BSD ufsの場合、ダンプ/復元プログラムがあると思います。ZFS、IDKの場合は、何かあるかもしれません。

一般に、ディスクのフルコピーは、回復状況以外の場合には遅すぎます。そのように増分バックアップを行うこともできません。


1

システムをセットアップして共有ストレージを使用することもできます!

私はこれらが互いに隣り合っていることを考えています、そして、あなたはこれを何度も何度もするでしょう....


1

イーサネットクロスオーバーケーブルはどうですか?ワイヤレス速度に依存する代わりに、NICの有線速度に制限されます。

この種のソリューションのいくつかの例と同様の質問があります。

どうやら今日では典型的なイーサネットケーブルで十分です。NICが優れているほど、転送は高速になります。

要約すると、ネットワークのセットアップが必要な場合、サブネットマスク255.255.255.0を使用してサーバーとバックアップコンピューターの静的IPを設定するだけに制限する必要があります。

幸運を!

編集:

@Khrystophは彼の答えでこれに触れました


速度はどのように改善されますか?答えを教えてください。
AL

1
中間ネットワークの速度低下を心配する必要がないため、潜在的に速度が向上します。「典型的な」対「クロスオーバー」イーサネットケーブルに関して-1Gbイーサネットは必要に応じて自動クロスオーバーします。HPイーサネットスイッチはこれを100Mbで行います。他のブランドは、一般的にはそうではありません。100Mbで止まっている場合は、クロスオーバーが必要になります。
ダンプリッツ

1

暗号化によって速度が低下するため、sshをスキップすることをお勧めします。最近のCPUは実際には1Gbで十分に高速かもしれませんが、OpenSSHには内部ウィンドウ処理の実装に問題があり、大幅に速度が低下する可能性があります。

sshでこれを行うには、HPN SSHご覧ください。ウィンドウの問題を解決し、マルチスレッド暗号化を追加します。残念ながら、クライアントとサーバーの両方でsshを再構築する必要があります。


0

OK「非常に大きなパイプ」(10Gbe)があり、互いに「近い」2台のコンピューターでこの質問に答えようとしました。

ここで遭遇する問題は、パイプが非常に大きいため、ほとんどの圧縮がCPUでボトルネックになることです。

10GBファイルを転送するパフォーマンス(6 Gbネットワーク接続[linode]、非圧縮データ):

$  time bbcp 10G root@$dest_ip:/dev/null
0m16.5s 

iperf:

server: $ iperf3 -s -F /dev/null
client:
$ time iperf3 -c $dest_ip -F 10G -t 20 # -t needs to be greater than time to transfer complete file
0m13.44s
(30% cpu)

netcat (1.187 openbsd):

server: $ nc -l 1234 > /dev/null
client: $ time nc $dest_ip 1234 -q 0 < 10G 
0m13.311s
(58% cpu)

scp:

$ time /usr/local/bin/scp 10G root@$dest_ip:/dev/null
1m31.616s
scp with hpn ssh patch (scp -- hpn patch on client only, so not a good test possibly): 
1m32.707s

socat:

server:
$ socat -u TCP-LISTEN:9876,reuseaddr OPEN:/dev/null,creat,trunc
client:
$ time socat -u FILE:10G TCP:$dest_ip:9876
0m15.989s

10 Gbeの2つのボックス、少し古いバージョンのnetcat(CentOs 6.7)、10 GBファイル:

nc: 0m18.706s (100% cpu, v1.84, no -q option
iperf3: 0m10.013s (100% cpu, but can go up to at least 20Gbe with 100% cpu so not sure it matters)
socat: 0m10.293s (88% cpu, possibly maxed out)

そのため、あるインスタンスではnetcatのCPU使用量が少なく、他のsocatではYMMVが使用されていました。

netcatでは、「-N -q 0」オプションがない場合、切り捨てられたファイルを転送できます。注意してください...「-w 10」などの他のオプションも切り捨てられたファイルになる可能性があります。

これらのケースのほとんどすべてで起こっているのは、ネットワークではなくCPUが最大限に使用されていることです。 scp最大約230 MB / sで、100%の使用率で1つのコアをペギングします。

残念ながら、Iperf3は破損したファイルを作成ます。netcatの一部のバージョンは、ファイル全体を転送しないようです。非常に奇妙です。特に古いバージョン。

「netcatへのパイプとしてのgzip」または「mbuffer」のさまざまな呪文も、gzipまたはmbufferを使用してCPUを最大限に使用するように思われたため、このような大きなパイプでは高速転送ができませんでした。lz4が役立つかもしれません。さらに、私が試みたgzipパイプの一部は、非常に大きな(4 GBを超える)ファイルの転送が破損するため、注意してください:)

特に待ち時間が長い場合(?)に機能する可能性がある別のことは、tcp設定を調整することです。推奨値を記載したガイドは次のとおりです。

http://pcbunn.cithep.caltech.edu/bbcp/using_bbcp.htmおよびhttps://fasterdata.es.net/host-tuning/linux/(別の回答から)おそらくIRQ設定:https : //fasterdata.es .net / host-tuning / 100g-tuning /

linodeからの提案、/ etc / sysctl.confに追加:

net.core.rmem_max = 268435456 
net.core.wmem_max = 268435456 
net.ipv4.tcp_rmem = 4096 87380 134217728
net.ipv4.tcp_wmem = 4096 65536 134217728
net.core.netdev_max_backlog = 250000
net.ipv4.tcp_no_metrics_save = 1
net.core.default_qdisc = fq 

さらに、彼らはあなたに実行してほしい:

 /sbin/ifconfig eth0 txqueuelen 10000 

微調整後、変更によっても害が生じないことを確認するために再確認する価値があります。

また、ウィンドウサイズを調整する価値があるかもしれません:https : //iperf.fr/iperf-doc.php#tuningtcp

遅い接続では、圧縮が確実に役立ちます。大きなパイプがある場合、非常に高速な圧縮容易に圧縮可能なデータに役立つ可能性があります。試してはいません。

「ハードドライブの同期」の標準的な答えは、ファイルをrsyncすることです。これにより、可能な限り転送が回避されます。

別のオプション: "パラレルscp"(なんとかして)を使用すると、より多くのコアが使用されます...

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