curlやwgetの数倍速い 爆速ダウンローダー aria2を使う

#はじめに
Webサーバなどからファイルをダウンロードするためのコマンドラインツールとしては、curlとwgetがメジャーだと思います。どちらも多機能で簡単に使える便利なツールですね。

今回ご紹介するaria2は、curlやwgetと同じくファイルをダウンロードするためのツールですが、やや方向性が異なります。

機能面ではcurlやwgetに劣るものの、複数コネクションによる並列ダウンロードにより高速なダウンロードが可能です。

類似ツールとしては[axel](http://axel.alioth.debian.org/)が挙げられますが、2009年頃開発が終了してしまったようです。
(GitHubにコピーがありますが、メンテナンスされていないように見受けられます)

単純に**大きなファイル一本を短時間でダウンロードしたい**場合には、今回ご紹介するaria2は結構使えると思います。

#aria2公式サイト
[こちら](https://aria2.github.io/)

#aria2の特徴
- 複数コネクションによる並列ダウンロード
- 複数サーバから同一ファイルを分散並列ダウンロード
- torrent対応

#インストール

##Mac OS X
brew一発でインストールは完了します。

```console
$ brew install aria2
```
##Ubuntu
apt-get一発でインストールは完了します。

```console
$ sudo apt-get install aria2
```

##RHEL7/CentOS7
EPELリポジトリが必要です。

```console
$ sudo yum install epel-release
$ sudo yum install aria2
```

#使い方とちょっとだけベンチマーク

##環境
**インフラ** AWS EC2 m4.xlarge (東京リージョン)
**OS** CentOS7.2 64bit
**WAN側回線速度** 推定600Mbps

##ベンチマークに使用したファイル
相手側サーバへの負荷を抑えるため小さめの.isoファイルを使用しました。

**CentOS-7-x86_64-Minimal-1611.iso**
(CentOS7のMinimalインストール用.isoファイルを使っています)

##接続先(ダウンロード元)サイト
勝手に試験に協力して頂きました。感謝致します。

**Site1**
[WIDE Internet Nara Network Operation Center](http://www.nara.wide.ad.jp/)

**Site2**
[JAIST 北陸先端科学技術大学院大学](https://www.jaist.ac.jp/index.html)

またtorrentの試験については世界中の皆さんにご協力頂きました。

##転送時間測定方法
各ツールのコンソール出力には転送時間や平均転送レートが表示されますが、curlの転送時間表示には転送後にテンポラリファイルから実ファイルへのコピー処理が含まれておらず、実際より高速に見える傾向があります。

そこでtimeコマンドを使用し実処理時間を測定しました。

##curlでダウンロード
```console
$ time curl -O ftp://ftp.nara.wide.ad.jp/pub/Linux/centos/7.3.1611/isos/x86_64/CentOS-7-x86_64-Minimal-1611.iso
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  680M  100  680M    0     0  2926k      0  0:03:57  0:03:57 --:--:-- 2532k

real    3m57.956s
user    0m0.376s
sys     0m3.832s
```
3分57秒でダウンロードが完了しました。

##wgetでダウンロード
```console
$ time wget ftp://ftp.nara.wide.ad.jp/pub/Linux/centos/7.3.1611/isos/x86_64/CentOS-7-x86_64-Minimal-1611.iso

#(中略)

100%[=========================================================================================================================>] 713,031,680 2.95MB/s   in 3m 51s

2017-02-05 03:28:20 (2.95 MB/s) - ‘CentOS-7-x86_64-Minimal-1611.iso’ saved [713031680]

real    3m51.013s
user    0m0.439s
sys     0m3.332s
```
3分51秒でダウンロードが完了しました。

##aria2でコネクション1本のみでダウンロード
```console
$ time aria2c ftp://ftp.nara.wide.ad.jp/pub/Linux/centos/7.3.1611/isos/x86_64/CentOS-7-x86_64-Minimal-1611.iso
 *** Download Progress Summary as of Sun Feb  5 03:33:36 2017 ***

# (中略)

Download Results:
gid   |stat|avg speed  |path/URI
======+====+===========+=======================================================
2dc327|OK  |   3.0MiB/s|/home/centos/ariatest/CentOS-7-x86_64-Minimal-1611.iso

Status Legend:
(OK):download completed.

real    3m46.602s
user    0m1.865s
sys     0m2.487s
```
3分46秒でダウンロードが完了しました。
コネクション1本では他のツールと変わりませんね。

##aria2でコネクション5本を用いた並列ダウンロード

**【コマンドライン引数】**
**-x5** 同時接続のコネクション数

```console
$ time aria2c -x5 ftp://ftp.nara.wide.ad.jp/pub/Linux/centos/7.3.1611/isos/x86_64/CentOS-7-x86_64-Minimal-1611.iso
[#b1ee67 674MiB/680MiB(99%) CN:2 DL:14MiB]
02/05 03:38:34 [NOTICE] Download complete: /home/centos/ariatest/CentOS-7-x86_64-Minimal-1611.iso

Download Results:
gid   |stat|avg speed  |path/URI
======+====+===========+=======================================================
b1ee67|OK  |    14MiB/s|/home/centos/ariatest/CentOS-7-x86_64-Minimal-1611.iso

Status Legend:
(OK):download completed.

real    0m46.740s
user    0m1.820s
sys     0m2.620s
```
46秒でダウンロードが完了しました。
**約5倍の高速化ですのでコネクション数に比例した性能が得られています。**

##aria2で2台のサーバから分散並列ダウンロード
**【コマンドライン引数】**
**-x10** 同時接続のコネクション数
**-s10** 複数サーバへの並列接続時に指定するコネクション数
**-k1M** 分散ダウンロード時のブロックサイズ (ここでは1MiBを指定。ディフォルトは20MiB)
**(URI)** 同じファイルが配置されている、複数のURIを指定

```console
$ time aria2c -x10 -s10 -k1M ftp://ftp.nara.wide.ad.jp/pub/Linux/centos/7.3.1611/isos/x86_64/CentOS-7-x86_64-Minimal-1611.iso http
://ftp.jaist.ac.jp/pub/Linux/CentOS/7.3.1611/isos/x86_64/CentOS-7-x86_64-Minimal-1611.iso

[#5c29a9 679MiB/680MiB(99%) CN:2 DL:19MiB]
02/05 03:50:12 [NOTICE] Download complete: /home/centos/ariatest/CentOS-7-x86_64-Minimal-1611.iso

Download Results:
gid   |stat|avg speed  |path/URI
======+====+===========+=======================================================
6ad9b5|OK  |    22MiB/s|/home/centos/ariatest/CentOS-7-x86_64-Minimal-1611.iso

Status Legend:
(OK):download completed.

real    0m30.583s
user    0m1.907s
sys     0m2.576s
```
30秒でダウンロードが完了しました。
**約7.5倍の高速化となりました。**
理論的には約10倍高速化されるはずでしたが、そこまで高速化されなかったのは、接続先サイトや通信経路の性能にバラツキがあることが原因ではないでしょうか。

##本当に2台のサーバに接続されているか?
netstatコマンドの出力を確認。(不要な行は削除してあります)

```console
$ netstat
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State
tcp        0      0 ip-xxx-xxx-xxx-xxx.a:56926 ftp.jaist.ac.jp:http    ESTABLISHED
tcp        0      0 ip-xxx-xxx-xxx-xxx.a:54978 ftp.nara.wide.ad.jp:ftp ESTABLISHED
tcp        0      0 ip-xxx-xxx-xxx-xxx.a:56932 ftp.jaist.ac.jp:http    ESTABLISHED
tcp        0      0 ip-xxx-xxx-xxx-xxx.a:54976 ftp.nara.wide.ad.jp:ftp ESTABLISHED
tcp        0      0 ip-xxx-xxx-xxx-xxx.a:56928 ftp.jaist.ac.jp:http    ESTABLISHED
tcp        0      0 ip-xxx-xxx-xxx-xxx.a:55018 ftp.nara.wide.ad.jp:ftp ESTABLISHED
tcp        0      0 ip-xxx-xxx-xxx-xxx.a:56930 ftp.jaist.ac.jp:http    ESTABLISHED
tcp        0      0 ip-xxx-xxx-xxx-xxx.a:55026 ftp.nara.wide.ad.jp:ftp ESTABLISHED
tcp        0      0 ip-xxx-xxx-xxx-xxx.a:55020 ftp.nara.wide.ad.jp:ftp ESTABLISHED
tcp        0      0 ip-xxx-xxx-xxx-xxx.a:56934 ftp.jaist.ac.jp:http    ESTABLISHED
```
5本ずつ計10本の接続が確認出来ました。

##torrentも試してみる
```console
$ aria2c http://ftp.nara.wide.ad.jp/pub/Linux/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1611.torrent

02/05 04:25:21 [NOTICE] Download complete: /home/centos/ariatest/CentOS-7-x86_64-Minimal-1611.torrent

02/05 04:25:21 [NOTICE] IPv4 DHT: listening on UDP port 6954

02/05 04:25:21 [NOTICE] IPv4 BitTorrent: listening on TCP port 6931

02/05 04:25:21 [NOTICE] IPv6 BitTorrent: listening on TCP port 6931

[#e7f396 SEED(0.0) CN:44 SD:0]
```
torrentの場合、ダウンロード終了後に他の人に配信するモードに切り替わるらしく、プロセスが終了しません。
そのため正確な処理時間は測定出来ませんでしたが、**概ね40秒程度でダウンロードが完了していました。**

上記、**コネクション5本を用いた並列ダウンロードよりやや高速**ですので、torrentが使えるならこちらの方が速いかもしれませんね。

#ご注意
[aria2公式サイト](https://aria2.github.io/)にも記載されていますが、多数のコネクションを用いた並列ダウンロードは相手側サーバに大きな負荷がかかることがあるため、ほどほどに活用しましょう。