LoginSignup
4
5

More than 5 years have passed since last update.

SSH経由で分割ダウンロードが出来た場合、果たしてそれは速くなるのか。(LFTP pgetの紹介)

Last updated at Posted at 2016-08-11

事の始まりはこちら"急いでダウンロードしたい時はwgetやcurlじゃなくてaxelを使おう"で紹介されているAXELです。これと同じように、SSH経由でもリモートサーバから分割ダウンロードを行うことで高速化を図ることは出来ないか、というのを調べてみました。

LFTPのpget

そこでいろいろ調べてみたところ、どうやらLFTPpgetが良いらしい。ということで早速インストールしてヘルプを読んでみることに。

$ lftp
lftp :~> help pget
Usage: pget [OPTS] <rfile> [-o <lfile>]
Gets the specified file using several connections. This can speed up transfer,
but loads the net heavily impacting other users. Use only if you really
have to transfer the file ASAP.

Options:
 -c  continue transfer. Requires <lfile>.lftp-pget-status file.
 -n <maxconn>  set maximum number of connections (default is is taken from
     pget:default-n setting)
 -O <base> specifies base directory where files should be placed
lftp :~> quit

Usageの概要の部分を読んでみると 「転送スピードを上げることはできますが、ネットへ重い負荷をかけるので他のユーザへ影響がでます。どうしても必要な時にだけ使って下さい」 とのこと。なかなか期待ができます。

LFTPのインストール

LFTPはパッケージ・マネージャで簡単にインストールできます。

## Macの場合
$ brew install lftp

## Ubuntuの場合
$ sudo apt-get install lftp

## CentOSの場合
$ sudo yum install lftp

HTTP経由で分割ダウンロードしてみる

冒頭で紹介したリンク先にある例をお借りしますが、CentOS 7のミニマム・イメージを10分割でダウンロードする場合のコマンドはこうなります。

$ lftp -e 'pget -c -n 10 http://mirror.fairway.ne.jp/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1511.iso && quit'

速いです。 僕が試したところ、AXELよりもpgetの方が若干速いという結果になりました。ただ、何度も何度も試したわけではないのでそこは誤差の範囲内だと思っています。それと-cオプションを付けておくと、途中でキャンセルやフェイルした後でもダウンロードを再開することができます。

注意: くどいかもしれませんが、複数のセッションを張って帯域を圧迫するので他のユーザに迷惑をかけることになります。その点を認識したうえで必要に応じて使って下さい。それはAXELも同じですね。

SSH経由で分割ダウンロードしてみる

ひとまずリモート・サーバ(例えば192.168.10.101)のuser1のホーム・ディレクトリにCentOS-7-x86_64-Minimal-1511.isoを保存したと仮定します。それをいつも通りscpを使ってダウンロードする場合はこうなりますね。

$ scp user1@192.168.10.101:CentOS-7-x86_64-Minimal-1511.iso .

それをLFTPのpgetを使って10分割ダウンロードする場合はこうなります。

$ lftp -e 'pget -c -n 10 CentOS-7-x86_64-Minimal-1511.iso && quit' sftp://user1:DUMMY@192.168.10.101

DUMMYの部分はパスワードですが、SSH鍵認証が設定済みであればDUMMYのままで大丈夫です。パスワード認証が失敗すると自動的にSSH鍵認証に切り替わる仕組みになっています。(* パスワードを省略するとパスワード・プロンプトが出てきます。)

では計測結果ですが、SSH経由の場合は分割ダウンロードしても速くなりませんでした。 残念。。。よく考えてみると理由は単純で、SSHは1対1の通信だからです。分割してセッションを増やしたとしても1対1であることがボトルネックになってしまいます。ただ、DNSラウンドロビンか何らかの方法で1つのドメイン名に対して複数のサーバーへSSHのセッションを張れるのであれば、速くなる可能性はあります。

最後になりますが、ご覧のとおりLFTPはインタラクティブなツールなので、シェル上でワンライナーにするためには-eオプションと&& quitで挟む一手間があります。その点は仕方ありませんが、LFTPにはpgetだけではなく、mirrorなどのすごく便利なコマンドがあるので、知っておくと重宝すると思います。mirrorとpgetを組み合わせて使うこともできます。

参考リンク

4
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
5