AWS IoT의 대기 시간을 측정해 보았습니다 (1)

AWS IoT의 특성을 이해하기 위해 디바이스에서 본 Publish/Subscribe 대기 시간을 살펴보았습니다.


1. nodejs 버전 SDK를 AmazonLinux에 도입



AmazonLinux 인스턴스 준비



ap-northeast-1에 t2.micro 인스턴스 만들기

nodebrew와 nodejs 도입



참고 : nodebrew에서 Node.js( io.js ) 관리

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

.bashrc에 경로 추가

.bashrc
export PATH=$HOME/.nodebrew/current/bin:$PATH

$ source ~/.bashrc

$ nodebrew install-binary v0.12.7

AWS IoT 디바이스 sdk 배포


  • 사전 준비

  • bash
    $ sudo yum install gcc-c++
    $ sudo yum install git
    

    $ 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을 생성하고 인증서 및 키 생성 및 배포
    두 장치 정보는 각각 ~/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. 샘플 동작 확인



    다음 샘플에서는 두 디바이스 간에 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)

    좋은 웹페이지 즐겨찾기