web-dev-qa-db-ja.com

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

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

データをできるだけ速く送信できるようにする必要があるため、ファイル転送で逆多重化を実行できるツールが必要です。一般的な解決策が必要なので、ソースマシンで分割を実行し、反対側でそれらをまとめるのは現実的ではありません。これが自動で機能するために必要です。

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

すべてが証明される-リモートミラーコマンドの「聖杯」を提示します。 lftpの提案についてdavrに感謝します。

lftp -c "mirror --use-pget-n=10 --verbose sftp://username:[email protected]/directory" 

上記は、リモートディレクトリを再帰的にミラーリングし、転送時に各ファイルを10スレッドに分割します。

29
Tim Woolford

うまくいくかもしれないいくつかのツールがあります。

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

    lftp -e 'pget -n 4 sftp://[email protected]/some/dir/file.ext'

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

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

10
davr

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

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

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

8

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

  1. 2つのマシン間の一部のリンクが飽和していて、パケットをドロップしています。
  2. TCP 帯域幅遅延積 が大きすぎるため、ウィンドウが飽和しています。

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

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

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

2

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

それはすべて、ソースデータの構造に依存します。ファイルをスライス、ダイス、再構成するためのたくさんのUNIXツールがあります。

1
Geoff Fritz

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

見つける。 -type 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 &
1
user67730

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

[〜#〜] ftps [〜#〜] (SSL経由のFTP)でも必要な処理を実行できます。

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

0
rob

Iノードですべてのファイルをソートしてみて(/ mydir -type f -print | xargs ls -i | sort -nを見つけて)、たとえばcpioでsshを介して転送します。これにより、ディスクが最大になり、ネットワークがボトルネックになります。それよりも速く、ネットワークを通過するときに行くのは難しいです。

0
Jimmy Hedman

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

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

0
kolypto