Azure Blob Upload ツール別ベンチマーク

Posted on Feb 11, 2016

同じ目的を達成できるツールがたくさん

やりたいことがあり、それを達成する手段がたくさん。どう選ぼう。じゃあ特徴を知りましょう。という話です。

端末からAzureへファイルをアップロードする手段は多くあります。CLIツール、GUIツール、SDKで自作する、etc。

そして、端末と、そのおかれている環境も多様です。Windows、Mac。有線、無線。

で、大事なのは平行度。ブロックBlobはブロックを平行に転送する方式がとれるため、ツールが平行転送をサポートしているか? どのくらい効くのか? は重要な評価ポイントです。

なので、どのツールがおすすめ?と聞かれても、条件抜きでズバっとは答えにくい。そしてこの質問は頻出。なのでこんな記事を書いています。

環境と測定方式

おそらくファイルを送る、という用途でもっとも重視すべき特徴は転送時間でしょう。ではツール、環境別に転送時間を測定してみます。

環境は以下の通り。

  • Windows端末
    • Surface Pro 4 Core i7/16GB Memory/802.11ac
    • 1Gbps Ethernet (USB経由)
    • Windows 10 (1511)
  • Mac端末
    • Macbook 12inch Core M/8GB Memory/802.11ac
    • USB-C… 有線テストは省きます
    • El Capitan
  • Wi-Fiアクセスポイント/端末間帯域
    • 100~200Mbpsでつながっています
  • Azureデータセンタまでの接続
    • 日本マイクロソフトの品川オフィスから、首都圏にあるAzure Japan Eastリージョンに接続
    • よってWAN側の遅延、帯域ともに条件がいい
  • 対象ツール
  • 転送ファイル
    • Ubuntu 15.10 ISOイメージ (647MBytes)

そして測定方式。

AzCopyはPowerShellのMeasure-Commandにて実行時間をとります。NCが平行度指定です。デフォルトの平行度はCPUコア数の8倍です。わしのSurface、OSから4コア見えていますので、32。

Measure-Command {AzCopy /Source:C:\Users\myaccount\work /Dest:https://myaccount.blob.core.windows.net/mycontainer /DestKey:mykey /Pattern:ubuntu-15.10-server-amd64.iso /Y /NC:count}

Azure CLIも同様にMeasure-Commandで。–concurrenttaskcountで平行度を指定できますが、ソースを確認したところ、平行度のデフォルトは5です。“StorageUtil.threadsInOperation = 5;“ですね。

Measure-Command {azure storage blob upload ./ubuntu-15.10-server-amd64.iso -a myaccount -k mykey mycontainer ubuntu1510 --concurrenttaskcount count}

残念ながらMacむけAzCopyはありませんので、Azure CLIのみ実行します。timeコマンドで時間をとります。

time azure storage blob upload ./ubuntu-15.10-server-amd64.iso -a myaccount -k mykey mycontainer ubuntu1510 --concurrenttaskcount count

Azure Storage Explorer Cross Platform GUIは、目視+iPhoneのストップウォッチで。

結果

平行度上げても伸びないな、というタイミングまで上げます。

 実行No   クライアントOS   ネットワーク接続   クライアント   並行数   転送時間(秒) 
1 Windows 10 1Gbps Ethernet AzCopy (default:32) 9.62
2 Windows 10 1Gbps Ethernet AzCopy 5 12.28
3 Windows 10 1Gbps Ethernet AzCopy 10 10.83
4 Windows 10 1Gbps Ethernet AzCopy 20 10.43
5 Windows 10 1Gbps Ethernet Azure CLI (default:5) 49.92
6 Windows 10 1Gbps Ethernet Azure CLI 10 29.47
7 Windows 10 1Gbps Ethernet Azure CLI 20 21.05
8 Windows 10 1Gbps Ethernet Azure CLI 40 20.12
9 Windows 10 1Gbps Ethernet Storage Explorer N/A 50.10
10 Windows 10 802.11ac AzCopy (default:32) 74.87
11 Windows 10 802.11ac AzCopy 5 53.32
12 Windows 10 802.11ac AzCopy 10 58.85
13 Windows 10 802.11ac Azure CLI (default:5) 57.23
14 Windows 10 802.11ac Azure CLI 10 50.71
15 Windows 10 802.11ac Azure CLI 20 54.37
16 Windows 10 802.11ac Storage Explorer N/A 54.63
17 Mac OS X 802.11ac Azure CLI (default:5) 40.86
18 Mac OS X 802.11ac Azure CLI 10 33.97
19 Mac OS X 802.11ac Azure CLI 20 58.57
20 Mac OS X 802.11ac Storage Explorer N/A 58.20

考察

  • 有線AzCopy早い。単純計算で67MByte/s出ています。それぞれの計測点の解釈の違いでBlobサービス制限の60MBytes/sを超えてしまっていますがw。データセンタまでのボトルネックがなければ、ポテンシャルを引き出せることがわかります。
  • 平行度は大きく性能に影響します。
    • 平行度が高すぎてもだめ
      • 無線AzCopyのデフォルト(平行度32)が平行度10、20より時間がかかっていることからわかる
    • デフォルトで遅いからといってあきらめず、平行度変えて試してみましょう
    • SDK使って自分で作る時も同じ。平行度パラメータを意識してください
      • .NET: BlobRequestOptions
      • Java/Android: BlobRequestOptions.setConcurrentRequestCount()
      • Node.js: parallelOperationThreadCount
      • C++: blob_request_options::set_parallelism_factor
  • Azure CLIよりAzCopyが早い。
    • .NETで最適化できているから合点
    • Node.jsベースでマルチOS対応のAzure CLIは比べられると分が悪い
    • でも、802.11acでも無線がボトルネックになっているので、いまどきのWi-Fi環境では似たような性能になる
    • No.18の結果は無線状態がよかったと想定
  • Azure Storage Explorer Cross Platform GUIは、現時点で平行度変えられないので性能面では不利。でも直観的なので、使い分け。

WAN条件がいいベンチマークでなので、ぜひみなさんの条件でも試してみてください。遅延の大きなリージョンや途中に帯域ボトルネックがある条件でやると、最適な平行度が変わってくるはずです。

でも一番言いたかったのは、Macbookの有線アダプタ欲しいということです。