SRT で大容量のファイルを高速転送してみた。 (on Azure VM)

#背景
Azure データセンター間のネットワークの実効速度ってどれくらいなんだろう…、と疑問を持ったので。

#やってみたこと
HaiVision 社が規格制定を行い、2017 年よりオープンソースのプロジェクトとして開発が進んでいる、Low Latency Video Streaming Protocol である ["SRT"](https://www.srtalliance.org/) を使って、ファイルを高速に転送してみた。
SRT については、株式会社エクスプローラさんの[このドキュメント](https://www.explorer-inc.co.jp/srt/media1902.html)に日本語で詳しく書いてあるので詳細は割愛。

折角なので、Azure 仮想ネットワークのピアリング機能を使って、アラブ首長国連邦北部リージョンにある仮想マシンから、東日本リージョンにある仮想マシンまでデータを転送することにした。

#実験環境
- アラブ首長国連邦北部リージョン
    - Azure D4s v3 仮想マシン / Ubuntu 18.04
    - Azure 仮想ネットワーク / サブネット 10.32.0.0/24
- 東日本リージョン
    - Azure D4s v3 仮想マシン / Ubuntu 18.04
    - Azure 仮想ネットワーク / サブネット 10.29.0.0/24

両方のリージョン間をピアリングで接続し、相互に通信できるようにする。

![コメント 2019-11-19 192525.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199379/fd532362-e268-7dc3-41b9-6272ee681cba.png)


#SRT テスト用ツール (srt-live-transmit) のビルド
Ubuntu Linux のセットアップが完了したら以下の手順で進める。

##まずは、諸々のパッケージを最新版に。

```
> sudo apt-get update
> sudo apt-get upgrade
> sudo apt-get install tclsh pkg-config cmake libssl-dev build-essential
```

## 次に github のリポジトリから SRT の最新のソースコードを入手
SRT は OSS なので、[github の SRT のリポジトリ](https://github.com/Haivision/srt)からソースコードまるっと落とせます。

```
> git clone https://github.com/Haivision/srt.git
> cd srt/
> git checkout -b v1.4.0 v1.4.0
```

## そんでもってビルドしてインストール

```
> ./configure 
> make
> sudo make install
> sudo ldconfig
```

ここまでの手順で、SRT 関連のコマンドラインツールが使えるようになります。

#転送に使うでかいファイルを生成
送信元になるリージョンの VM 上でサクッと…。

```
> head -c 1G /dev/urandom > 1gbytefile.txt
```

#以下のコマンドで転送！
[SRT のリポジトリのなかの stransmit.md](https://github.com/Haivision/srt/blob/master/docs/stransmit.md)にコマンドの使い方凡例がありますので参考にして…。

受信先のリージョンで先に以下のコマンドを実行

```
> srt-file-transmit srt://:<ポート番号> file://<ファイルの保存先のディレクトリのフルパス> -s:<転送時のStatsの表示頻度を整数で>
```

送信元のリージョンでは以下のコマンドを実行

```
> srt-file-transmit file://<送信するファイルのフルパス> srt://<送信先IP>:<ポート番号> -s:<転送時のStatsの表示頻度を整数で>
```

これで、ファイルの転送が行われて、自動的に途中で転送したパケット数やパケロスの数、帯域幅などがレポートされてきます。

こんな感じ。

```
======= SRT STATS: sid=738659631
PACKETS     SENT:           0  RECEIVED:         98410
LOST PKT    SENT:           0  RECEIVED:          2904
REXMIT      SENT:           0  RECEIVED:          2904
DROP PKT    SENT:           0  RECEIVED:             0
FILTER EXTRA  TX:           0        RX:             0
FILTER RX  SUPPL:           0  RX  LOSS:             0
RATE     SENDING:           0  RECEIVING:      360.922
BELATED RECEIVED:           0  AVG TIME:   1.57323e+12
REORDER DISTANCE:           0
WINDOW      FLOW:        8192  CONGESTION:          16  FLIGHT:           0
LINK         RTT:   160.466ms  BANDWIDTH:  3123.97Mb/s
BUFFERLEFT:  SND:    12288000  RCV:           11815500
```

##ファイルが壊れていないことを念のため確認。
送信元、受信先の両方の VM で以下のコマンドを実行し、届いたファイルと送ったファイルの md5 ハッシュ値が同じこと = ファイルがバイナリレベルで同じであることを確認。

```
> md5sum 1gbytefile.txt
53bcaea8887b82ad6c3a16027d1c8ec0  1gbytefile.txt
```

#結果
Stats 上の帯域幅としては 3GByte/Sec くらい普通に出てました。
SRT の誤り訂正入れた状態で 1GB のファイルの転送にかかった時間はこんな感じ。

- Stats のターミナルへの出力無し 23秒 => 44.52MByte/Sec => 356.17 Mbps 
- Stats のターミナルへの出力有り 30秒 => 34.13MByte/Sec => 273.06 Mbps 

ちなみに Stats 上では、アラブ首長国連邦北部リージョンと東日本リージョンとの間の RTT は 160ms 程度でした。

##2019/11/14 追記
弊社公式ドキュメントとして、リージョン間のレイテンシーの実測値のリストが出てました。
それによれば、UAE North から Japan East へのレイテンシーは 159ms とのことで、今回の実験の結果とほぼ同じと言えるかと思います。
[Azure network round-trip latency statistics](https://docs.microsoft.com/en-us/azure/networking/azure-network-latency)

#まとめ
Azure の仮想ネットワーク ピアリングを上手く使うことで、地球上のあちらこちらの場所から、大容量のファイルをプライベートネットワーク内で高速に転送できる可能性があるかな、という期待を持てるような実験結果だったかと。

ちなみに、8K HEVC 映像のビットレートがだいたい 200 Mbps 程度とどこぞで聞いたので、8K 映像も SRT 越しにリアルタイムで海外から送ってこられる可能性が十分ありますね。

#今後の展望
もっと、他のリージョンでも同じような実験を試してみたいな、と思ってます。