bbcp で高速転送を行う

数 TB に及ぶ膨大な実験データをインターネット経由で転送する必要が生じた。LAN 内に比べてラウンドトリップタイム (RTT) が長いインターネット経由で scp や rsync を使うと、帯域幅を十分に活かすことができない。そこで bbcp を使ってみた。

bbcp は bbcp から入手できる。ビルド後、バイナリを source, sink 双方のログインシェルから見てパスの通った場所に置く。Using BBCP - Photon Control and Data Systems - SLAC ConfluenceUsing BBCP を参考にパラメータを調節する。

具体的には

 bbcp -P 2 -s 16 -w 4M user@host:/dev/zero /dev/null

などとして、スループットを 2 秒ごとに表示(-P 2) しながら、ストリーム数(-s)、ウィンドウサイズ(-w) を調節する。インターネット上の Cisco Anyconnect VPN を通した環境(ping 15 msec) では、上のパラメータがベストだった。このとき、scp では 10 MB/sec 程度が限界のところ、17 MB/sec ほどの速度が出た。権限不足のため /proc/sys/net/ipv4/tcp_rmem などは変更できなかった。

bbcp は、デフォルトでは source から sink に向けてデータ転送セッションを開く。sink 側が NATP の内側にあるなど、この向きの接続ができない場合は、timeout とか no route といったエラーが出るので、-z オプションで sink から source に向けてセッションを開くようにする。FTP の passive モードに対応する。

複数のファイルをまとめて転送するには、

 user@host:/path/to/file1
 user@host:/path/to/file2
 user@host:/path/to/file3

のように列挙したファイル file.lst を作っておき、

 bbcp -P 2 -s 16 -w 4M -I file.lst /path/to/sink

とすればよい。パスワードは一度だけ訊かれる。