camel

これ見てたらついムラムラと。

初出2010.08.11; 08.12 追記
time perl mirrorget.pl cpan.yml http://www.cpan.org/src/perl-5.12.1.tar.bz2
# Stage 0: checking headers
Elapsed:        0.358819961547852 sec.
Last-Modified:  Sun, 16 May 2010 22:40:16 GMT
Content-Length: 12296076
URLs:
  http://ftp.ring.gr.jp/pub/lang/perl/CPAN/src/perl-5.12.1.tar.bz2
  http://ftp.yz.yamagata-u.ac.jp/pub/lang/cpan/src/perl-5.12.1.tar.bz2
  http://ftp.kddilabs.jp/CPAN/src/perl-5.12.1.tar.bz2
  http://ftp.nara.wide.ad.jp/pub/CPAN/src/perl-5.12.1.tar.bz2
  http://ftp.dti.ad.jp/pub/lang/CPAN/src/perl-5.12.1.tar.bz2
  http://ftp.jaist.ac.jp/pub/CPAN/src/perl-5.12.1.tar.bz2
  http://www.cpan.org/src/perl-5.12.1.tar.bz2
  http://ftp.riken.jp/lang/CPAN/src/perl-5.12.1.tar.bz2
# Stage 1: fetching by pieces
Elapsed: 3.81961703300476 sec.
   2 http://ftp.ring.gr.jp/pub/lang/perl/CPAN/src/perl-5.12.1.tar.bz2
   1 http://ftp.yz.yamagata-u.ac.jp/pub/lang/cpan/src/perl-5.12.1.tar.bz2
   2 http://ftp.kddilabs.jp/CPAN/src/perl-5.12.1.tar.bz2
   2 http://ftp.nara.wide.ad.jp/pub/CPAN/src/perl-5.12.1.tar.bz2
   1 http://ftp.dti.ad.jp/pub/lang/CPAN/src/perl-5.12.1.tar.bz2
   2 http://ftp.jaist.ac.jp/pub/CPAN/src/perl-5.12.1.tar.bz2
   1 http://www.cpan.org/src/perl-5.12.1.tar.bz2
   1 http://ftp.riken.jp/lang/CPAN/src/perl-5.12.1.tar.bz2
# Final Stage: gathering pieces
Elapsed: 0.177625894546509 sec.
0.346u 0.304s 0:04.43 14.4%	0+0k 1023+13io 0pf+0w
time perl mirrorget.pl freebsd.yml http://ftp.freebsd.org/pub/FreeBSD/ISO-IMAGES-i386/8.1/FreeBSD-8.1-RELEASE-i386-memstick.img
# Stage 0: checking headers
Elapsed:        0.844078063964844 sec.
Last-Modified:  Mon, 19 Jul 2010 03:24:04 GMT
Content-Length: 948244480
URLs:
  http://ftp.jaist.ac.jp/pub/FreeBSD/ISO-IMAGES-i386/8.1/FreeBSD-8.1-RELEASE-i386-memstick.img
  http://ftp.iij.ad.jp/pub/FreeBSD/ISO-IMAGES-i386/8.1/FreeBSD-8.1-RELEASE-i386-memstick.img
  http://ftp.sakura.ad.jp/pub/FreeBSD/ISO-IMAGES-i386/8.1/FreeBSD-8.1-RELEASE-i386-memstick.img
  http://ftp.freebsd.org/pub/FreeBSD/ISO-IMAGES-i386/8.1/FreeBSD-8.1-RELEASE-i386-memstick.img
  http://ftp.riken.jp/pub/FreeBSD/ISO-IMAGES-i386/8.1/FreeBSD-8.1-RELEASE-i386-memstick.img
# Stage 1: fetching by pieces
Elapsed: 92.5969209671021 sec.
 192 http://ftp.jaist.ac.jp/pub/FreeBSD/ISO-IMAGES-i386/8.1/FreeBSD-8.1-RELEASE-i386-memstick.img
 350 http://ftp.iij.ad.jp/pub/FreeBSD/ISO-IMAGES-i386/8.1/FreeBSD-8.1-RELEASE-i386-memstick.img
 183 http://ftp.sakura.ad.jp/pub/FreeBSD/ISO-IMAGES-i386/8.1/FreeBSD-8.1-RELEASE-i386-memstick.img
  18 http://ftp.freebsd.org/pub/FreeBSD/ISO-IMAGES-i386/8.1/FreeBSD-8.1-RELEASE-i386-memstick.img
 162 http://ftp.riken.jp/pub/FreeBSD/ISO-IMAGES-i386/8.1/FreeBSD-8.1-RELEASE-i386-memstick.img
# Final Stage: gathering pieces
Elapsed: 14.6915600299835 sec.
20.043u 20.714s 1:48.21 37.6%	0+0k 1512+449io 0pf+0w
time perl mirrorget.pl ubuntu.yml http://releases.ubuntu.com/10.04/ubuntu-10.04-desktop-i386.iso
# Stage 0: checking headers
Elapsed:        0.744369983673096 sec.
Last-Modified:  Thu, 29 Apr 2010 12:56:31 GMT
Content-Length: 733419520
URLs:
  http://ftp.riken.jp/Linux/ubuntu-iso/CDs/10.04/ubuntu-10.04-desktop-i386.iso
  http://ubuntu.mithril-linux.org/releases/10.04/ubuntu-10.04-desktop-i386.iso
  http://ftp.yz.yamagata-u.ac.jp/pub/linux/ubuntu/releases/10.04/ubuntu-10.04-desktop-i386.iso
  http://ftp.jaist.ac.jp/pub/Linux/ubuntu-releases/10.04/ubuntu-10.04-desktop-i386.iso
  http://releases.ubuntu.com/10.04/ubuntu-10.04-desktop-i386.iso
  http://www.ftp.ne.jp/Linux/packages/ubuntu/releases-cd/10.04/ubuntu-10.04-desktop-i386.iso
  http://ubuntutym2.u-toyama.ac.jp/ubuntu/10.04/ubuntu-10.04-desktop-i386.iso
# Stage 1: fetching by pieces
Elapsed: 75.2669811248779 sec.
 161 http://ftp.riken.jp/Linux/ubuntu-iso/CDs/10.04/ubuntu-10.04-desktop-i386.iso
 157 http://ubuntu.mithril-linux.org/releases/10.04/ubuntu-10.04-desktop-i386.iso
  32 http://ftp.yz.yamagata-u.ac.jp/pub/linux/ubuntu/releases/10.04/ubuntu-10.04-desktop-i386.iso
 153 http://ftp.jaist.ac.jp/pub/Linux/ubuntu-releases/10.04/ubuntu-10.04-desktop-i386.iso
   5 http://releases.ubuntu.com/10.04/ubuntu-10.04-desktop-i386.iso
 185 http://www.ftp.ne.jp/Linux/packages/ubuntu/releases-cd/10.04/ubuntu-10.04-desktop-i386.iso
   7 http://ubuntutym2.u-toyama.ac.jp/ubuntu/10.04/ubuntu-10.04-desktop-i386.iso
# Final Stage: gathering pieces
Elapsed: 9.25442099571228 sec.
15.819u 16.198s 1:25.38 37.4%	0+0k 99+143io 0pf+0w

たとえばCPANから超速でダウンロードしたかったら、

master: http://www.cpan.org/
mirrors:
 - http://ftp.kddilabs.jp/CPAN/
 - http://ftp.nara.wide.ad.jp/pub/CPAN/
 - http://ftp.jaist.ac.jp/pub/CPAN/
 - http://ftp.dti.ad.jp/pub/lang/CPAN/
 - http://ftp.ring.gr.jp/pub/lang/perl/CPAN/
 - http://ftp.riken.jp/lang/CPAN/
 - http://ftp.yz.yamagata-u.ac.jp/pub/lang/cpan/

という内容のYAMLファイルを用意しておき、このファイルとMaster Site上のURLを引数で指定すると、mirror sitesも含めたサイトから、1MBづつファイルを分割ダウンロードした後結合するわけです。

我が家はマンション一棟GbE、各住戸100Mbpsという接続環境なのですが、見てのとおり、回線は真っ黒怪になります。librahackに使ったらおまわりさんがソッコーでピンポンきそう。

ダウンロード終了後は各URLから何チャンクダウンロードしたかが表示されます。ネットワーク的に遠いサーバーは遅い分それだけ少ないことがきちんと見て取れます。

回線品質が格段に上がった昨今では、「たかがスマートフォン」が何百MBものアップデートファイルをCDNを通してダウンロードしたりもします、そんな中にあって分散ダウンロードは周回遅れの技術に見えはしますが、こうしてこさえてみるとなかなかどうして使い出がありそうです。たかだか120行のプログラムでここまでできるとは。

Enjoy!

Dan the Just Another AnyEvent Newbie

追記:2010.08.12 v0.02

  • きちんとmirrorするようにしました。すなわちローカルにファイルがあればそれをチェックし、セーヴするときにはタイムスタンプも同期します。
  • openのモードを:rawにしました。コメント欄参照
  • Strawberry Perlでも動作確認

追記:2011.01.09 v0.03

  • s/mirror/mirrors/g
  • s/YAML::Syck/YAML/g
  • Code Embed by gist

Gist