ファイル転送を高速化する逆多重化


19

あるマシンから別のマシンに大量のデータを送信しました。rsync(またはその他の方法)で送信すると、安定した320 kb /秒で送信されます。一度に2つまたは3つの転送を開始すると、それぞれが320になり、一度に4つ行うと、リンクが最大になります。

可能な限り高速にデータを送信できる必要があるため、ファイル転送で逆多重化を実行できるツールが必要です。一般的な解決策が必要なので、ソースマシンでsplitを実行し、もう一方の端でそれらをまとめて実行することは実用的ではありません。自動化された方法で動作するためにこれが必要です。

これを行うツールはありますか、それとも自分で作成する必要がありますか?送信者はCentOS、受信者はFreeBSDです。

回答:


29

それをすべて証明すると、リモートミラーコマンドの「聖杯」を提示します。lftp提案してくれたdavrに感謝します。

lftp -c "mirror --use-pget-n=10 --verbose sftp://username:password@server.com/directory" 

上記は、リモートディレクトリを再帰的にミラーリングし、各ファイルが転送されるときに10個のスレッドに分割します!


lftp素晴らしいですが、アップロード時にマルチパートを実行することはできません。私が使用していますmirror --use-pget-n=20 -R-しかし、それは思わ--use-pget-nダウンロードするときにのみ機能します。
ダン

PS、-P20複数のファイルをアップロードできますが、各ファイルをマルチパート化することはできません。
ダン

1
lftpは、セグメント化/マルチパートアップロードをサポートしていません。を使用するには、宛先側から転送を開始する必要がありますpget -n
-apraetor

覚えておいて、mirror双方向です。pget引数はのみダウンロードされたファイルに適用されます。
16

10

動作する可能性のあるツールがいくつかあります。

  • LFTP -FTP、HTTP、およびSFTPをサポートします。複数の接続を使用して単一のファイルをダウンロードすることをサポートします。remoteServerからlocalServerにファイルを転送する場合、localServerにLFTPをインストールして、次を実行します。

    lftp -e 'pget -n 4 sftp://userName@remoteServer.com/some/dir/file.ext'

    「-n 4」は、並行して使用する接続の数です。

  • 次に、多くの「ダウンロードアクセラレータ」ツールがありますが、通常はHTTPまたはFTPのみをサポートしています。これらはリモートサーバーにセットアップする必要はないかもしれません。いくつかの例は、Axelaria2、およびProZillaです


8

使用するファイルが大きくない場合lftp -e 'mirror --parallel=2 --use-pget-n=10 <remote_dir> <local_dir>' <ftp_server>:各ファイルを10個のセグメントに分割して2つのファイルをダウンロードし、合計20個のFTP接続を使用し<ftp_server>ます。

小さなファイルが大量にある場合は、次を使用しlftp -e 'mirror --parallel=100 <remote_dir> <local_dir>' <ftp_server>ます。セグメンテーションなしで並行して100個のファイルをダウンロードします。合計100の接続が開かれます。これにより、サーバー上で利用可能なクライアントが過剰に消費されたり、一部のサーバーで禁止されたりする可能性があります。

を使用--continueしてジョブを再開できます:)および-Rダウンロードの代わりにアップロードするオプション(引数の順序をに切り替えます<local_dir> <remote_dir>)。


1
パラメーターのタイプミス:--use-pget-mの代わりに--use-pget-n。編集しようとしたが、私の編集は短かった。
トニー

2

接続ごとの320KB / sの制限の原因によっては、TCP設定を調整してこの問題を回避できる場合があります。私の推測では、ISPによる明示的な接続ごとのレート制限ではありません。調整には2つの原因が考えられます。

  1. 2つのマシン間のリンクが飽和状態になり、パケットがドロップされます。
  2. 帯域幅遅延の積が大きすぎるため、TCPウィンドウは飽和しています。

最初のケースでは、各TCP接続は事実上、標準のTCP輻輳制御で同等に競合します。輻輳制御アルゴリズムを変更するか、バックオフの量を減らすことにより、これを改善することもできます。

2番目のケースでは、パケット損失による制限はありません。追加の接続を追加することは、合計ウィンドウサイズを拡張する粗雑な方法です。ウィンドウのサイズを手動で増やすことができれば、問題はなくなります。(接続の待ち時間が十分に長い場合、TCPウィンドウのスケーリングが必要になる場合があります。)

ラウンドトリップの「ping」時間に接続の合計速度を掛けることで、ウィンドウの大きさをおよそ知ることができます。1280KB / sには、1ミリ秒のラウンドトリップあたり1280(1024 = 1Kの場合は1311)バイトが必要です。64Kバッファーは約50ミリ秒のレイテンシーで最大になりますが、これはかなり一般的です。16Kバッファーは約320KB / sで飽和します。


1

データはどのように構造化されていますか?いくつかの大きなファイル?いくつかの大きなディレクトリ?ディレクトリツリーの特定のブランチでrsyncの複数のインスタンスを生成できます。

それはすべて、ソースデータの構造に依存します。ファイルをスライス、ダイス、および再構築するためのUNIXツールが多数あります。


任意のデータ。大きなディレクトリである場合もあれば、単一のファイルである場合もあります。
ZimmyDubZongyZongDubby

1

パスワードなしのsshログインをセットアップできる場合、4つの同時scp接続(-n)が開き、各接続が4つのファイル(-L)を処理します。

見つける。タイプf | xargs -L 4 -n 4 /tmp/scp.sh user @ host:path

ファイル/tmp/scp.sh:

#!/bin/bash

#Display the help page
function showHelp()
{
    echo "Usage: $0 <destination> <file1 [file2 ... ]>"
}

#No arguments?
if [ -z "$1" ] || [ -z "$2" ]; then
    showHelp
    exit 1
fi

#Display help?
if [ "$1" = "--help" ] || [ "$1" = "-h" ]; then
    showHelp
    exit 0
fi

#Programs and options
SCP='scp'
SCP_OPTS='-B'
DESTINATION="$1";shift;

#Check other parameters
if [ -z "$DESTINATION" ]; then
    showHelp
    exit 1
fi

echo "$@"

#Run scp in the background with the remaining parameters.
$SCP $SCP_OPTS $@ $DESTINATION &

0

inodeですべてのファイルをソートして(/ mydir -type f -print | xargs ls -i | sort -nを検索)、たとえばcpio over sshで転送してみてください。これにより、ディスクが最大限に使用され、ネットワークがボトルネックになります。それよりも速いのは、ネットワークを横断するときに行きにくいです。


それは実に卑劣な:)
ウォーレン

すべてのファイルシステムがこれから後押しされることを保証することはできません、それはiノードのレイアウトがどのように行われるかに依存します。
ジミーヘッドマン

ボトルネックは、各TCP接続が320KB /秒に制限されることです。ネットワークの制限(約1200KB /秒)まで320 * NumConnectionsを取得できるように、並列TCP接続でファイルを送信します。iノードでソートしても、これは達成されません。
ZimmyDubZongyZongDubby 09

TCP速度の制限は何ですか?マシン間のルーターですか?
ジミーヘッドマン

私のISP。ネットの中立性?ハ!
ZimmyDubZongyZongDubby 09

0

ファイルをまとめて転送できるツールを知っています。このツールは「rtorrent」パッケージ/ポートと呼ばれ、両方のホストで利用可能です;)BitTorrentクライアントは、転送前にディスクスペースを予約することが多く、チャンクはソケットからディスクに直接書き込まれます。さらに、ncursesの素敵な画面ですべての転送の状態を確認できます。

単純なbashスクリプトを作成して「* .torrent」ファイルの作成を自動化し、リモートマシンにコマンドをsshしてダウンロードします。これは少しugいように見えますが、開発せずに簡単な解決策を見つけるとは思いません:


1
ファイル転送に関与するマシンが2台だけの場合、急流はどのように役立ちますか?トレントのアイデアは、クライアントリクエスターがデータを利用できるようにするシードの群れです。
DaveParillo 09

あなたが正しい。しかし、単一のシーダーでは役に立たないと誰が言ったのでしょうか?;)
kolypto 09

2
トレントクライアントが単一のピアで複数のTCP接続を作成する場合、これはOPの問題を解決します。ただし、トレントクライアントが実際に単一のピアとの複数のTCP接続を作成するかどうかはわかりません。
クロノス

0

FTPは、ダウンロードに複数の接続を使用します。VPNを介したFTPまたはSSHを介したFTPの安全なチャネルを設定できる場合、ネットワークリンクを最大限に活用できるはずです。(FTP over SSHには特別な考慮事項が必要であることに注意してください。リンクを参照してください。)

FTPS(FTP over SSL)も必要なことを行う場合があります。

複数の接続をサポートするSFTPクライアントを使用することもできますが、SFTPが単一のファイルに対して複数の接続をサポートするかどうかはわかりません。これは、ほとんどの場合に必要なことを行うはずですが、1つの大きなファイルを転送するだけでよい場合、最大スループットが得られない場合があります。


SFTPの方がはるかに簡単であり、安全性は向上しませんか?
マークルヌーフ

1
@rob:「FTPはファイル転送に複数の接続を使用する」とはどこから入手しましたか?一部のクライアントはFTPからのダウンロードに複数のストリームを許可しますが、FTPへのアップロードに複数のストリームを許可するFTPクライアント/サーバーコンボは絶対にありません。
クロノス

@Mark:はい、おそらくSFTPの方が簡単で安全です。しかし、単一のファイルを転送するために複数の接続をサポートしているかどうかはわかりません。提案をありがとう。リストに追加します。
ロブ・

1
@chronos:あいにく、明確ではありませんでした。ZimmyDubZongyZongDubbyはFTPを使用してCentOSサーバーからFreeBSDクライアントにダウンロードすることを提案していました。答えを更新して、「ファイル転送」ではなく「ダウンロード」と明確に述べました。
ロブ・

-1

解決策1:これがあなたのケースで実用的かどうかわかりませんが、スパンアーカイブ(たとえば、チャンクに分割されたtarファイル、またはスパン7zipアーカイブ)を作成し、rsyncの複数のインスタンスを使用してそれらを送信することができますネットワークを構築し、反対側でそれらを再構築/抽出します。引数が転送されるディレクトリと使用する接続数である汎用スクリプトを作成できます。明らかな欠点は、両側に2倍の空きスペースが必要になり、両端でファイルをアーカイブ/抽出するオーバーヘッドが追加されることです。

解決策2:より良い解決策は、サイズに基づいて大きなディレクトリツリーをサブツリーに分割し、それらのサブツリーを並行してコピーするスクリプトまたはプログラムを作成することです。最初にディレクトリ構造全体(ファイルなし)をコピーすると、物事が簡単になる場合があります。


誰でも下票について詳しく述べたいですか?
ロブ

-1

信頼できる環境で2台のマシンを実行していますか?netcatを試すことができます。サーバー側で:

tar -czf - ./yourdir | nc -l 9999

そしてクライアントで:

nc your.server.net 9999 > yourdir.tar.gz

クライアント接続にsshトンネルを使用させることができます。

ssh -f -L 23333:127.0.0.1:9999 foo@your.server.net sleep 10; \
    nc 127.0.0.1 23333 > yourdir.tar.gz

パーティション全体でもこの方法で移動できます。

dd if=/dev/sda1 | gzip -9 | nc -l 9999

そしてクライアントで:

nc your.server.net 9999 > mysda1.img.gz

注意

netcatは世の中で最も安全な転送ツールではありませんが、適切な環境ではオーバーヘッドが非常に少ないため高速になります。

HowtoForgeには良い例のページがあります


これは彼の質問に答えない一般的な答えのようです。私はあなたのソリューションのいずれかが並列に転送する方法を見ることができない、NCは、私が知る限り、単に単一の接続である
davr

正しいかもしれませんが、ncを使用すると、開いているポートを制御できます。必要な場合は10,000を指定できます。
DaveParillo 09
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.