Alibaba Cloud Sapporoでお話しました。~Alibaba Cloudのベンチマークテスト

6月29日(金)に開催されたAlibaba Cloud のセミナー「Alibaba Cloud Sapporo」に参加しました。

Alibaba Cloudは、Alibabaグループが展開するクラウドサーバーサービス(IaaS)です。
日本では、SBクラウド社がサービスを提供しています。
https://jp.alibabacloud.com/

今回はお声がけいただいて、「Alibaba Cloudのベンチマークテスト」と題して、10分ぐらいお話ししました。
発表資料はこちら。

 

2月の「CloudGarage Deep Meetup」のときと同様に、Alibaba CloudのECS仮想サーバーに対して、いつも使っているツールunixbenchとdbenchによるベンチマークテストを行い、AWS EC2、IDCFクラウドのサーバーと比較してみました。

unixbenchのスコアは各サービスほとんど同じ。
dbenchのほうは、Alibaba Cloudはスループット値がやや低く、最大レイテンシ値が大きい、という結果となりました。

Alibaba Cloudのディスクスループット値がやや低い点については、発表では、「AWS EC2は(EBSの)IOPSバーストが効いているからよい値なのでは?」と推測しましたが、ここではもう一歩踏み込んでみます。

ディスクベンチマークツールfioでもシーケンシャル、ランダムのディスク読み書きテストを行ってみたところ、「レイテンシにばらつきがある」という結果となりました。

以下はfioにおけるランダムRead/Writeテストの結果です。
パラメータは以下のとおりで、4KBのランダム読み書き処理をたくさん行います。

size=1g          // 読み書きの総サイズは1GB
iodepth=32       // 非同期で同時に要求するI/O数(多重度)は32
bs=4k            // ブロックサイズは4KB
rw=randrw        // ランダムでRead50%, Write50%
runtime=300      // テストの実行時間は300秒
ioengine=libaio  // IOエンジンは非同期

 

・AWS EC2 c5.large SSD 20GBのfioランダム読み書き実行結果(抜粋)

1g_Rand-ReadWrite-4K-QD32: (g=0): rw=randrw, bs=4K-4K/4K-4K/4K-4K, ioengine=libaio, iodepth=32
fio-2.1.7
Starting 1 process
1g_Rand-ReadWrite-4K-QD32: Laying out IO file(s) (1 file(s) / 1024MB)

1g_Rand-ReadWrite-4K-QD32: (groupid=0, jobs=1): err= 0: pid=2461: Fri Jun  8 12:59:51 2018
  read : io=1765.3MB, bw=6025.3KB/s, iops=1506, runt=300011msec
    slat (usec): min=1, max=8248, avg=279.93, stdev=459.41
    clat (usec): min=384, max=21015, avg=10311.31, stdev=813.67
     lat (usec): min=388, max=21017, avg=10591.28, stdev=837.47
    clat percentiles (usec):
     |  1.00th=[ 9408],  5.00th=[ 9792], 10.00th=[ 9792], 20.00th=[ 9920],
     | 30.00th=[10048], 40.00th=[10048], 50.00th=[10176], 60.00th=[10432],
     | 70.00th=[10688], 80.00th=[10944], 90.00th=[11072], 95.00th=[11200],
     | 99.00th=[11456], 99.50th=[12096], 99.90th=[14656], 99.95th=[15808],
     | 99.99th=[17280]
    bw (KB  /s): min= 5584, max=18424, per=100.00%, avg=6031.24, stdev=533.41
  write: io=1761.9MB, bw=6013.7KB/s, iops=1503, runt=300011msec
    slat (usec): min=1, max=8741, avg=282.19, stdev=465.96
    clat (usec): min=501, max=20061, avg=10390.12, stdev=787.23
     lat (usec): min=528, max=20414, avg=10672.37, stdev=783.98
    clat percentiles (usec):
     |  1.00th=[ 9408],  5.00th=[ 9792], 10.00th=[ 9920], 20.00th=[10048],
     | 30.00th=[10048], 40.00th=[10176], 50.00th=[10304], 60.00th=[10560],
     | 70.00th=[10816], 80.00th=[10944], 90.00th=[11072], 95.00th=[11200],
     | 99.00th=[11328], 99.50th=[11584], 99.90th=[14144], 99.95th=[15680],
     | 99.99th=[17536]
    bw (KB  /s): min= 5544, max=17568, per=100.00%, avg=6018.32, stdev=500.71
    lat (usec) : 500=0.01%, 750=0.07%, 1000=0.20%
    lat (msec) : 2=0.10%, 4=0.01%, 10=25.68%, 20=73.94%, 50=0.01%
  cpu          : usr=0.33%, sys=0.99%, ctx=390201, majf=0, minf=26
  IO depths    : 1=0.1%, 2=0.1%, 4=0.1%, 8=0.1%, 16=0.1%, 32=100.0%, >=64=0.0%
     submit    : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
     complete  : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.1%, 64=0.0%, >=64=0.0%
     issued    : total=r=451913/w=451037/d=0, short=r=0/w=0/d=0
     latency   : target=0, window=0, percentile=100.00%, depth=32

Run status group 0 (all jobs):
   READ: io=1765.3MB, aggrb=6025KB/s, minb=6025KB/s, maxb=6025KB/s, mint=300011msec, maxt=300011msec
  WRITE: io=1761.9MB, aggrb=6013KB/s, minb=6013KB/s, maxb=6013KB/s, mint=300011msec, maxt=300011msec

Disk stats (read/write):
  nvme0n1: ios=451728/450964, merge=0/84, ticks=4511784/4571656, in_queue=8779496, util=99.89%

 

IOPSはRead/Write合計で3009。IOPSは3000までバーストするので、完全にバーストが効いた状態といえる。
レイテンシ(lat)は、約99%が4~20msec。

・Alibaba Cloud ECS sn1ne.large SSD 20GBのfioランダム読み書き実行結果(抜粋)

1g_Rand-ReadWrite-4K-QD32: (g=0): rw=randrw, bs=4K-4K/4K-4K/4K-4K, ioengine=libaio, iodepth=32
fio-2.1.7
Starting 1 process
1g_Rand-ReadWrite-4K-QD32: Laying out IO file(s) (1 file(s) / 1024MB)

1g_Rand-ReadWrite-4K-QD32: (groupid=0, jobs=1): err= 0: pid=10463: Fri Jun  8 12:55:33 2018
  read : io=1055.6MB, bw=3602.6KB/s, iops=900, runt=300032msec
    slat (usec): min=1, max=93276, avg= 6.82, stdev=180.12
    clat (usec): min=90, max=246192, avg=17268.90, stdev=34139.77
     lat (usec): min=381, max=246201, avg=17275.88, stdev=34139.91
    clat percentiles (usec):
     |  1.00th=[  548],  5.00th=[  668], 10.00th=[  756], 20.00th=[  876],
     | 30.00th=[  996], 40.00th=[ 1128], 50.00th=[ 1272], 60.00th=[ 1512],
     | 70.00th=[ 1992], 80.00th=[ 4768], 90.00th=[91648], 95.00th=[93696],
     | 99.00th=[94720], 99.50th=[95744], 99.90th=[99840], 99.95th=[102912],
     | 99.99th=[111104]
    bw (KB  /s): min= 2574, max= 4384, per=100.00%, avg=3603.52, stdev=180.40
  write: io=1054.6MB, bw=3597.5KB/s, iops=899, runt=300032msec
    slat (usec): min=2, max=11895, avg= 7.39, stdev=28.52
    clat (usec): min=420, max=246084, avg=18269.92, stdev=34417.68
     lat (usec): min=427, max=246093, avg=18277.48, stdev=34417.51
    clat percentiles (usec):
     |  1.00th=[  620],  5.00th=[  796], 10.00th=[  932], 20.00th=[ 1128],
     | 30.00th=[ 1320], 40.00th=[ 1528], 50.00th=[ 1784], 60.00th=[ 2224],
     | 70.00th=[ 3152], 80.00th=[10176], 90.00th=[92672], 95.00th=[94720],
     | 99.00th=[95744], 99.50th=[97792], 99.90th=[105984], 99.95th=[110080],
     | 99.99th=[123392]
    bw (KB  /s): min= 2363, max= 4296, per=100.00%, avg=3597.98, stdev=177.04
    lat (usec) : 100=0.01%, 250=0.01%, 500=0.21%, 750=6.50%, 1000=15.11%
    lat (msec) : 2=41.04%, 4=13.95%, 10=3.99%, 20=1.27%, 50=0.17%
    lat (msec) : 100=17.56%, 250=0.20%
  cpu          : usr=0.47%, sys=1.47%, ctx=257229, majf=0, minf=48
  IO depths    : 1=0.1%, 2=0.1%, 4=0.1%, 8=0.1%, 16=0.1%, 32=100.0%, >=64=0.0%
     submit    : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
     complete  : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.1%, 64=0.0%, >=64=0.0%
     issued    : total=r=270220/w=269839/d=0, short=r=0/w=0/d=0
     latency   : target=0, window=0, percentile=100.00%, depth=32

Run status group 0 (all jobs):
   READ: io=1055.6MB, aggrb=3602KB/s, minb=3602KB/s, maxb=3602KB/s, mint=300032msec, maxt=300032msec
  WRITE: io=1054.6MB, aggrb=3597KB/s, minb=3597KB/s, maxb=3597KB/s, mint=300032msec, maxt=300032msec

Disk stats (read/write):
  vda: ios=270111/269871, merge=0/69, ticks=4660087/4926290, in_queue=9586725, util=100.00%

 

IOPSはRead/Write合計で1799。SSD 20GBにおける仕様は1800なのでほぼ仕様どおり。
レイテンシ(lat)は、約77%ぐらいが4msec未満だが、約18%が50~100msec。
 
 

ということで、レイテンシを比較すると、

  • AWS EC2は、全体がほぼ同じ範囲内に収まる。
  • Alibaba Cloud ECSは、全体の3/4ぐらいは速いけど、残り1/4が少し遅く、ばらつきがある。

という、分布の違いがありました。

このように、たまに遅延する時間帯があることが、ディスクスループット値を少し下げる要因となっているのかもしれません。

ばらつきが出る原因は、もちろん僕のほうではわかりません。
AWS EC2のEBSストレージについては、最近のm4/m5, c4/c5インスタンスは「EBS最適化」がデフォルトで有効となっており、ストレージ以外のアクセスとは別に、ストレージアクセス専用のネットワーク帯域が確保されています。

一方、Alibaba Cloud ECSのストレージ「エラスティックブロックストレージ/クラウドディスク」については、「ストレージアクセス専用のネットワーク帯域」のような仕組みが存在するかどうかは、ドキュメントからはわかりませんでした。
ストレージ以外のネットワークアクセスが影響しているのかもしれませんし、ストレージのネットワーク制御や、物理的なストレージシステムそのものに原因があるのかもしれません。

(参考)
・Alibaba Cloud ECSドキュメントセンター エラスティックブロックストレージ
https://jp.alibabacloud.com/help/doc-detail/25383.htm

とはいっても、僕が少し使ってみた限りでは、ディスクアクセスが極端に遅いわけではありません。
(「AWS EC2やIDCFクラウドのスループット値がよすぎる」ともいえます。)

今後改善される可能性もありますし、発表にも含めましたが、同時クライアント数を増やすとスループット値が上がっていく傾向も見られたので、実際のアプリケーション実行環境としては大きな問題はないように思います。
また、ディスクサイズを増やせば、仕様上のスループット上限値が増えますし、アプリケーション側でキャッシュ機構をうまく使って、ディスクアクセスを極力減らすという解決方法もあるでしょう。

他の方の発表にもありましたが、Alibaba Cloudには、

  • 中国リージョンでサーバーを作れる。
  • ドキュメントが充実している(日本語も)。
  • 機能や管理コンソール画面がAWSに似ているので、AWSユーザーは使いやすい(入りやすいのはよいこと!)。
  • 機能の追加スピードが速い。

といった長所があります。

僕はまだ仮想サーバーサービスのECSしか使っていないので、RDBサービスなど、いろいろ試してみたいと思います。

Alibaba Cloudの無料トライアルは、30,000円分が1年間無料で利用できるというものです。
1ヵ月や3ヵ月ではなく、1年間と長期に渡って使えるのはうれしいですね。

なお、アカウント登録は、クレジットカードの登録が必要で、(法人ではなく)個人登録の場合は顔写真付き証明書の画像送付が必要となります。
この点は他のクラウドサービスより手間がかかります。

(参考)
・Alibaba Cloud お支払い方法の有効化手順
https://jp.alibabacloud.com/help/doc-detail/50661.htm
 

(関連記事)
・AWS SSDベースEBSのディスクベンチマーク
https://inaba-serverdesign.jp/blog/20140618/aws_ssd_ebs_disk_benchmark.html

・CloudGarage Deep Meetup in SapporoのLTでお話しました。~CloudGarageのベンチマークテスト
https://inaba-serverdesign.jp/blog/20180226/cloudgarage_deep_meetup_sapporo_benchmark.html
 

Follow me!