AWS IoTのレイテンシーを測ってみた(1)


AWS IoTの特性を理解するために、デバイスから見たPublish/Subscribeのレイテンシーを調べてみました。

1. nodejs版SDKをAmazonLinuxに導入

AmazonLinuxインスタンスを用意

ap-northeast-1にt2.microインスタンスを作成

nodebrewとnodejsを導入

参考:nodebrewでNode.js( io.js )を管理する

shell
$ curl -L git.io/nodebrew | perl - setup

.bashrcへのパスの追加

.bashrc
export PATH=$HOME/.nodebrew/current/bin:$PATH
shell
$ source ~/.bashrc
shell
$ nodebrew install-binary v0.12.7

AWS IoT device sdkを導入

  • 事前準備
bash
$ sudo yum install gcc-c++
$ sudo yum install git
shell
$ git clone https://github.com/aws/aws-iot-device-sdk-js.git
$ cd aws-iot-device-sdk-js
$ npm install mqtt
$ npm install blessed
$ npm install blessed-contrib
$ npm install minimist

証明書を配置

AWS IoT のコンソールで、Thingを作成し、証明書と鍵を作成&配置
2つのデバイス情報をそれぞれ、~/certs1配下と~/certs2配下に配置する。

$ ls -l /home/ec2-user/certs1
合計 20
-rw------- 1 ec2-user ec2-user 1758 10月 18 10:59 aws-iot-rootCA.crt
-rw------- 1 ec2-user ec2-user 1220 10月 18 10:59 certificate.pem.crt
-rw------- 1 ec2-user ec2-user 1675 10月 18 10:59 private.pem.key
-rw------- 1 ec2-user ec2-user  451 10月 18 10:59 public.pem.key
-rw------- 1 ec2-user ec2-user 1758 10月 18 10:59 root-CA.crt

2. サンプルの動作確認

以下のサンプルで、2つのデバイス間でAWS IoTを介したPublish/Subscribeが行われます。

  • コンソール1
$ cd ~/aws-iot-device-sdk-js/examples/
$ node device-example.js -f ~/certs1 -g ap-northeast-1 -t 1
connect
message topic_1 {"count":1,"pub_time":"13:27:16.751"}
message topic_1 {"count":2,"pub_time":"13:27:20.753"}
message topic_1 {"count":3,"pub_time":"13:27:24.755"}
  • コンソール2
$ cd ~/aws-iot-device-sdk-js/examples/
$ node device-example.js -f ~/certs2 -g ap-northeast-1 -t 2
connect
message topic_2 {"count":1,"pub_time":"13:28:34.259"}
message topic_2 {"count":2,"pub_time":"13:28:38.260"}
message topic_2 {"count":3,"pub_time":"13:28:42.261"}

3. Publish/Subscribe のレイテンシを計測してみる

レイテンシ計測用に、サンプルを修正

diff-device-test2.js
$ diff device-example.js device-test2.js 
23a24,34
> function time_text(){
>      d = new Date();
>      t = ("00" + (d.getMonth()+1)).substr(-2) + "/";
>      t += ("00" + (d.getDate())).substr(-2) + " ";
>      t += ("00" + d.getHours()).substr(-2) + ":";
>      t += ("00" + d.getMinutes()).substr(-2) + ":";
>      t += ("00" + d.getSeconds()).substr(-2) + ".";
>      t += ("000" + d.getMilliseconds()).substr(-3);
>      return t
> }
> 
53c64
<     console.log('connect');
---
>     console.log(time_text() + ' connect');
64c75
<         console.log( 'substituting '+ minimumDelay + 'ms delay for ' + args.delay + 'ms...' );
---
>         console.log( time_text() + ' substituting '+ minimumDelay + 'ms delay for ' + args.delay + 'ms...' );
72c83
<             mode_1_process: count }));
---
>           count: count, pub_time: time_text() }));
77c88
<             mode_2_process: count }));
---
>           count: count, pub_time: time_text() }));
83c94
<     console.log('close');
---
>     console.log(time_text() + ' close');
89c100
<     console.log('reconnect');
---
>     console.log(time_text() + ' reconnect');
93c104
<     console.log('offline');
---
>     console.log(time_text() + ' offline');
99c110
<     console.log('error', error);
---
>     console.log(time_text() + ' error', error);
105c116,117
<     console.log('message', topic, payload.toString());
---
>     msg = JSON.parse(payload.toString());
>     console.log(msg.pub_time, time_text(), topic, msg.count);

実行例

$ node device-test2.js -f ~/certs1 -g ap-northeast-1 -t 1
connect
10/18 12:30:26.841 10/18 12:30:26.882 topic_1 1
10/18 12:30:30.844 10/18 12:30:30.884 topic_1 2
10/18 12:30:34.847 10/18 12:30:34.884 topic_1 3
 :
$ node device-test2.js -f ~/certs2 -g ap-northeast-1 -t 2
connect
10/18 12:30:24.730 10/18 12:30:24.766 topic_2 1
10/18 12:30:28.733 10/18 12:30:28.761 topic_2 2
10/18 12:30:32.736 10/18 12:30:32.765 topic_2 3

Publish/Subscribeの 平均レイテンシは22msでした。速い!

  • 計測条件
    実行間隔 4秒
    実行回数 200回 x 2

  • Publish/Subscribe レイテンシー

レイテンシー(Sec)
平均 0.022
90パーセンタイル 0.032

その後の長期間の計測で、顕著な変動が見られたので、以下の記事を投稿しました。
続報:AWS IoTのレイテンシーを測ってみた(2)