事の始まりはこちら"急いでダウンロードしたい時はwgetやcurlじゃなくてaxelを使おう"で紹介されているAXELです。これと同じように、SSH経由でもリモートサーバから分割ダウンロードを行うことで高速化を図ることは出来ないか、というのを調べてみました。
LFTPのpget
そこでいろいろ調べてみたところ、どうやらLFTPのpget
が良いらしい。ということで早速インストールしてヘルプを読んでみることに。
$ 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を組み合わせて使うこともできます。