달력

5

« 2025/5 »

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
2016. 5. 9. 10:50

Arduino Yun과 AWS IoT 2 IOT/Arduino2016. 5. 9. 10:50

아두이노 윤으로 AWS IoT와 연결에 대한 두번째 포스팅 입니다. 지난 포스팅에서는 윤의 환경 설정부분과 AWS에서의 설정만을 다루었습니다. 이제 Arduino IDE에서 작업을 진행하여 연결되는 것을 확인 해보고, 이전에 UNO에서 작업하였던 소음 진동 센서를 붙여서, AWS IoT로 메세지를 보내고, AWS에서 제대로 받았는지 확인해 보겠습니다. 지난번과 마찬가지로 본문은 편하게 작성하고자 합니다. 양해 부탁드립니다.

5. Arduino Yun과 AWS IoT 연결 테스트

 아래는 내 컴퓨터의 Arduino IDE의 스케치북 폴더의 모습이다. 아래에서 libraries라는 폴더가 라이브러리 폴더이다. libraries 폴더 안에 이전 포스팅에서 언급되었던, "AWS-IoT-Arduino-Yun-Library" 폴더를 통채로 복사 한다. 그리고 Arduino IDE를 실행 시킨 다음 파일>예제>AWS-IoT-Arduino-Yun-Library>BasicPubSub를 클릭한다.

그럼 아래와 같이 예제 샘플 소스가 그대로 뜰 것이다. 나의 경우 소스에서 BasicPubSub의 내용을 변경할 이유가 없었다. 그러나 aws_iot_config.h 파일은 이전 포스팅에서 따로 저장하였던 AWS IoT 연결 설정에서 나왔던 코드로 변경을 하여야 한다.

aws_iot_config.h의 최초 내용이다. 이전 포스팅을 참고하여 내용을 환경에 맞게 변경한다. 복사해서 //==== 두 줄 사이의 코드 내용을 통채로 변경하면 된다. 이제 테스트를 진행 할텐데, 윤보드를 컴퓨터와 연결하고 툴>시리얼 모니터를 클릭하여 시리얼 모니터를 연다. 그리고 좌측 상단의 화살표를 클릭하여, 소스를 빌드하고 배포한다. 소스코드에 Serial.begin(115200);이라 기술 되어 있다. 당연히 시리얼 모니터의 보드레이트는 115200으로 맞쳐야 한다.

별다른 문제없이 빌드되고 배포 되었다면, 아래와 같은 메세지가 나타나야 한다. 만약 뭔가 문제가 있다면 에러와 메세지와 함께 에러 코드가 나타난다. 에러에 대해서 내가 보았던 코드는 -13이었고, 이것의 정의 AWS-IoT-Arduino-Yun-Library/aws_iot_error.h에 CONNECT_CREDENTIAL_NOT_FOUND = -13 이렇게 되어 있었다. 여담이지만, 이게 인증서와 씨름을 하다보니 해결은 되었는데, 구체적으로 어째서 해결이 되었는지 아직도 아리송하다.

이렇게 떠야 정상이다. 그리고 중간에 설명되지 않은 것이 MQTT 프로토콜인데 여기서 설명하자니 너무 내용이 많을 듯하여 대충 설명하고 넘기려 한다. IBM과 Eurotech에 의해 개발된 프로토콜로서 오픈소스로 공개가 되었다. 메세지 발행/구독을 기반으로하는 가벼운 통신 프로토컬이다. Sensor와 통신에서 많이 사용되는 것같다. 그래서 그런지 AWS IoT도 MQTT 기반으로 통신을 하더라.

이제 웹브라우져를 열어 AWS IoT로 이동한 다음,  사이트 우측 상단에 MQTT Client를 클릭한다. 아래와 같은 화면이 뜰 것이다.

Client ID는 아무거나 입력하면 된다. 정말 귀찮다면, Generate client ID버튼을 클릭하면 알아서 입력해준다. 그리고 Connect를 클릭하면 AWS IoT의 MQTT Broker로 연결한다. 화면에 보면 Subscribe to topic라는 항목이 있다. 그것을 클릭하면, 구독을 설정할 수 있는 화면이 나오는데 Subscription topic에서 이전에 Arduino IDE에서 보았던 "topic1"을 입력하고 제일 아래의 Subscribe 버튼을 클릭한다. 

위 그림과 같이 좌측에 토픽의 내용을 제대로 받으면 성공이라고 볼 수 있다. 이미 제대로 받는 것은 확인 했지만 이곳에서 메세지를 발행하면 윤이 받는 것도 테스트 해야 되지 않을까? "Pubish to topic" 항목을 클릭하고, Publish topic에 "topic1"이라고 입력한 다음 Payload 항목에 "Hi!"라고 입력한다. 그리고 아래에 Publish 버튼을 클릭한 후 Arduino IDE의 시리얼 모니터를 지켜보자.

저기 빨간색으로 밑줄그은 Hi!가 보인다면, 윤도 제대로 구독을 받는 것이라 생각 할 수 있다. 이제 윤을 이용해서 센서 회로를 구성한 다음 센서의 값을 AWS IoT로 넘겨 주고 제어신호를 받아 LED의 On/Off를 한다면, 윤으로 목표했던 것의 핵심은 다 한 것이라 할 수 있을 것이다.


6. 소음 센서 회로 구성.

아두이노 윤에서 AWS로 뭔가 값을 보내는 것은 AWS IoT SDK의 예제를 통해서 이미 해보았으니, 그 "뭔가"를 해야 한다. 사실 이것은 윤을 작업하기 이전에 벌써 모두 정해진 상태였다. 이미 아두이노 우노와 내부 NodeJS를 이용한 MQTT서버를 이용해서 한번 구현해본 바 있다.

여담이지만, ESP8266을 이용하여 구현했는데 이게 우노보드랑은 궁합이 좋지 못하다는 얘기가 많았다. 전기적인 문제가 있다고 카더라... 게다가 Uno랑 ESP8266은 다루기가 좀 힘들었다. 그래서 잘 동작하는 이넘을 보면서 회사사람들이 "저건 언제 터지니? 저걸 터트려야 윤을 사는데 도움이 되지."라고 하시는 분들이 많았다. 근데 이넘은 장수하고, 첫째 윤이 온날 업그래이드 작업을 하다 맞이 갔으니.......


지난간 일은 잊고, 우노에서는 우여곡절 끝에 ESP8266과 하드웨어 시리얼을 이용하여 통신을 하는 바람에 디버깅을 또는 상태를 위해 시리얼 모니터를 쓸 수가 없었다. 그래서 LCD가 붙어서 이런 기능을 했었는데, 윤은 그럴 필요가 없어 LCD는 빼고, 소음 센서와 LED만을 고대로 옮겨 왔다.(사진을 보면 LED가 13번핀에 연결되어 있다. 13번 핀은 보드에 이미 LED가 붙어 있으나, 일단 가져왔다.)

소음 센서 모듈에서는 아날로그 신호만 A3핀으로 받는다. 구글로 해당 모듈 혹은 소자의 정보를 찾으면 나오니 그걸 확인하고 회로를 구성하면 된다. 여기에 사용한 소자는 D, A, 5V, GND가 있는데, 윤의 GND와 연결하고, 5V는 윤의 5V에 연결 했으며, A가 A3핀에 연결되어 있다. 데이터는 A3에서 받을 것이다.

LED는 저항을 이용해서 전류를 맞추어 주고 (+)는 D13핀에 (-)는 GND에 연결한다. 소음센서와 마찬가지로 회로 구성에 대한 상세설명은 뒤로하고, 13에 연결한 이유는 윤이 MQTT로 신호를 받으면 D13핀에 HIGH를 걸어서 LED 불을 키려는 생각이다.


7. 윤 소스 변경

작업한지 몇일이 되다 보니 기억이 가물가물하다. 소스를 보면서 이 코드를 정말 내가 수정했단 말인가?라는 의문이 든다... 하지만 정황상 나밖에 없으므로, 의심의 여지는 없다.

일단 MQTT의 토픽을 지정한다.

#define mqtt_sensor_value_topic "$aws/things/Corebd_IOT_Sensor/shadow/update"

#define mqtt_sensor_commend_topic "corebd/sensor_control"

#define mqtt_sensor_status_topic "corebd/sensor_status"


아래의 변수를 추가한다.

byte stateState = LOW; // led state

char strOut[64]; // lcd print string

int soundVal = 0;

unsigned long prevMillis = 0;


다음 MQTT 메세지 콜벡 메서드를 아래와 같이 수정한다.

void msg_callback(char* src, int len) {

  Serial.println("CALLBACK:");

  int i;

  for(i = 0; i < len; i++) {

    Serial.print(src[i]);

  }


  byte* p = (byte*)malloc(len);

  memcpy(p,src,len);

  

  if (strstr((char*)p, "-1")) {

      // 현재 상태에 대한 질의를 받았을 경우.

    } else if (strstr((char*)p, "1")) {

      stateState = HIGH;

      digitalWrite(13, stateState);

    } else if (strstr((char*)p, "0")) {

      stateState = LOW;

      digitalWrite(13,stateState);

    }


    sprintf(strOut,"{ \"id\":\"%s\" ,\"value\" : \"%d\" }",AWS_IOT_CLIENT_ID , stateState);

    if((rc = myClient.publish(mqtt_sensor_status_topic, strOut, strlen(strOut), 1, false)) != 0) {

      Serial.println("Publish failed!");

      Serial.println(rc);

    }

}


그리고 loop의 코드를 다음과 같이 변경한다.

void loop() {

  if(success_connect) {

    unsigned long currentMillis = millis();

    int curSoundVal = analogRead(A3);

    

    if (soundVal < curSoundVal) {

      soundVal = curSoundVal;

    }


    if (currentMillis - prevMillis > 1000) 

    {

      prevMillis = currentMillis;

      sprintf(strOut,"{ \"id\":\"%s\", \"value\":\"%d\"}",AWS_IOT_CLIENT_ID , soundVal);

      if((rc = myClient.publish(mqtt_sensor_value_topic, strOut, strlen(strOut), 1, false)) != 0) {

        Serial.println("Publish failed!");

        Serial.println(rc);

      } else {

        Serial.println(strOut);

      }

      

      soundVal=0;

    }


    if((rc = myClient.yield()) != 0) {

      //Serial.println("Yield failed!");

      //Serial.println(rc);

    }

  }

}

그리고 

셋업에 아래의 문구를 추가하고

  pinMode(13, OUTPUT);

  pinMode(A3, INPUT);


myClient.subscribe(...  ); 함수를 다음과 같이 변경한다.

myClient.subscribe(mqtt_sensor_commend_topic, 1, msg_callback))

이제 AWS IoT에 연결한 다음, MQTT Client에서 $aws/things/Corebd_IOT_Sensor/shadow/update 토픽을 구독하여 값이 계속 올라오는지를 확인한다. 그 다음 corebd/sensor_control 토픽에 1을 보내고, 0을 보내본다. 각각 LED가 켜지고 꺼져야 정상이다. corebd/sensor_status 토픽을 구독하고, corebd/sensor_control토픽에 -1,0,1을 보내서 corebd/sensor_status가 값을 받으면 정상이다.


이로서 윤보드의 AWS IoT 연결 작업은 일단 끝났다. 이제iPhone 작업을 하여 윤과 통신하게 하고, 각 기능들을 이용해여 간단한 센서 연동 프로그램을 만드는 작업이 남았으나, 포스팅은 여기까지로 하려고 한다. 

긴 글 읽어주신 분들 감사합니다.

'IOT > Arduino' 카테고리의 다른 글

Arduino Yun과 AWS IoT 1  (0) 2016.05.03
:
Posted by 알 수 없는 사용자
2016. 5. 3. 18:07

Arduino Yun과 AWS IoT 1 IOT/Arduino2016. 5. 3. 18:07

아두이노 윤으로 AWS IoT와 연결하기 위해 많은 시행착오를 하여, 다음에 저와 같은 작업을 진행하시는 분 혹은 저에게 도움이 되고자 하며, 이제까지 했던 내용을 공유하고자 합니다.

블러그는 오늘부터 쓰고자 마음 먹었기에, 미리 스샷을 준비하지 못하여, 스샷이 부족함을 이해해 주시고, 회사 운영 블러그이지만 편하게 쓰는 것 역시 너그럽게 이해해 주시길 부탁드립니다.

 참고

https://github.com/aws/aws-iot-device-sdk-arduino-yun/blob/master/README.md AWS IoT Arduino Yun SDK의 설명 글입니다. 이글을 기준으로 작업을 진행하였습니다.

https://www.arduino.cc/en/Guide/ArduinoYun 아두이노 윤보드 시작 문서입니다. 아두이노 업그래이드 등을 위해 참고하였습니다.

http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html Putty를 다운로드 받을 수 있는 사이트 입니다. 터미널 툴입니다.

http://winscp.net/eng/download.php winscp를 다운로드 받을 수 있는 사이트 입니다. 아두이노에 파일을 밀어 넣기가 뭐 같기 때문에 파일을 넣기 위해 필요한 툴입니다.

준비사항

 micro sd카드 16mb 이상

 arduino yun

 노트북

1. Arduino Yun보드를 만나다.

 처음 지시를 받고, 여기 저기 구글링 해본 결과 arduino yun 보드를 바로 지원하는 AWS SDK가 있다는 것을 알게 되었다. 이 보드가 있다면, aws iot를 이용한 개발은 아니 최소한 aws iot 연결하는 부분은 거져 먹겠구나하는 생각에 적극적으로 밀어서 결국 이 보드로 결정되었다. 그러나 처음 만난 arduino yun은 상당히 Uno와는 상당히 다른 부분이 있었으니, 프로세스가 ATmega32u4와 AR 9331가 두개가 들어가 있는 것이다. 32u4는 arduino uno의 사용법(환경이 같다)과 같은 것이고, AR9331은 리눅스였다. uno 때는 esp8266을 사용하여 인터넷을 연결하고 서버에 정보를 보냈었는데... 이 녀석은 좀 틀리다. 그래도 그런 것들은 SDK에서 다 지원 할 것이므로 나는 패스!

 AWS SDK를 다운받고 본격적으로 셋팅을 시작하였다. yun 보드를 처음 받았을 때, 상당히 구 버젼의 모습을 하고 있었다. 업그래이드 하다가 날려먹은 이력이 있기 때문에 일단은 그냥 셋팅하기로 결정하고, 하나하나 문서에 적힌 대로 설정하기 시작하였으나, 나중에는 결국 Yun보드 업그레이드를 하고야 말았다. Yun 보드 업그레이드 시에 주의 사항이 있는데 절때로 진행 도중에 보드의 전원을 끊으면 안된다. 업그래이드시 자동으로 리부팅 되는데 보드가 작업을 끝내고 재부팅이 완료 될 때까지 가만히 놔두는 것이 좋다.


2. 윈도우에서 설치

 난 윈도우를 쓰기 때문에 윈도우를 기준으로 쓴다. Linux와 MacOS관련 내용은 SDK 문서를 참고 하길 바란다. 먼저 https://www.arduino.cc/en/Main/Software 링크로 이동하여 Arduino IDE를 다운받아 설치 한다. 그리고 putty, winscp를 차례로 다운로드 받아 설치한다. 설치 방법은 특별한 것이 없으니 특별히 설명할 것이 없다.


3. Arduino Yun보드 업그레이드

 Arduino IDE를 실행시키고, Arduino IDE에서 파일>예제>Bridge>YunSerialTeminal 예제를 연다. Arduino Yun 보드에 micro sd카드를 꽃은 다음 usb케이블로 arduino yun보드와 컴퓨터를 연결하고, Arduino IDE에서 툴>포트에서 Arduino 윤이 연결된 COM포트를 지정한 후 툴>시리얼 모니터를 클릭하여 시리얼 모니터를 연다. 마지막으로 Arduino IDE 좌측 상단의 툹팁에서 오늘쪽 화살표를 클릭하면 예제가 빌드되고, 배포까지 된다. 그러면 시리얼 모니터에서 리눅스 명령을 입력할 수 있고, 리눅스 메세지를 받을 수가 있다. 여기서 일단 리눅스를 리셋하자. 리셋 버튼은 Arduino Yun 보드의 led가 모여있는 곳 옆에 있는 버튼이다. 3초간 꾹 눌러주면 리눅스가 재부팅 되는 것이 확인된다.

이제 Wifi를 연결해보자, 노트북 컴퓨터의 Wifi 네트워크를 띄워보면, arduino-어쩌고저쩌고 하는 ap가 보인다. 이 녀석은 arduino yun이 서버가 되는 ap인데, ap란 연결하라고 있는 것이 아니겠는가? 연결한다. 그리고 웹브라우져를 띄워 http://192.168.240.1으로 이동한다. arduino yun의 암호 입력 창이 보인다면, yun 보드의 암호를 입력하면 된다.(암호를 모르겠거든, 시리얼 모니터 화면에서 passwd를 입력한 후 새암호를 입력하여 암호를 변경하여도 된다.) 암호를 입력하고 로그인을 하면 "CONFIGURE"라는 버튼이 보인다. 클릭하면 아래와 같을 수도 있고, 비슷한 화면이 보일 것이다. 대충 보기만 해도 Wire less parameter의 내용을 채워 넣으면 된다는 감이 올 것이고, 버젼이 달라 다른 화면이 떠도, 크게 다르지 않을 것이기에 큰 어려움은 없을 것이다.



arduino yun의 wifi를 설정을 적용하였다면, arduino yun과 연결이 끊히게 된다. 노트북의 네트워크 설정을 윤이 연결한 네트워크로 지정하고, putty 프로그램을 사용하여 arduino yun과 연결한다. 만약 ip를 잘모르겠거든 시리얼 모니터에서 ifconfig -a 명령으로 ip를 알수가 있다. ssh, 21포트, yun ip 이렇게 입력하고 연결하면, 계정을 물어볼것이다. 계정은 root이고 암호를 입력하면 프롬프트가 뜬다.


이제 컴퓨터에서 파일을 자유롭게 다루기 위해  시리얼 모니터의 상단에 있는 입력 박스에 다음의 명령을 넣고 전송버튼을 클릭한다. 

opkg update

opkg install openssh-sftp-server

그리고 winscp 프로그램을 실행시키고 마찬가지로 윤보드에 당연히 IP정보를 이용해서 연결한다. 여기서 부터 윤보드를 업그래이드를 안내하는데, 업그레이드하다가 윤보드 하나를 못쓰게 만들어 버린 이력이 있다. 지금이야 시간이 없기 때문에 윤보드를 샀지만, 조만간 수단과 방법을 가리지 않고 살릴 것이다. 뜬금없이 이런 얘기하는 이유는 아래 작업이 실패 할 경우 곤란한 상황이 있을 수 있다는 경고의 의미이다.
https://www.arduino.cc/en/Main/Software 에서 Arduino yun linux OS openwrt-yun x.x.x upgrade image라는 버튼이 있을 것이다. 다운 받고, 이 파일을 scp를 이용해 arduino yun의 micro sd 카드의 루트 폴더에 위치 시킨다. 그런 후 putty 창에서 아래의 명령을 입력 시킨다. Arduino 공식 홈페이지에서는 웹 페이지에서 업그레이드 시키는 방법이 소개 되어 있으나, 내가 받은 윤은 오래된 놈이라 그런지 UI도 많이 틀린데다가 기능을 찾을 수가 없었다.

run-sysupgrade /mnt/sda1/openwrt-ar71xx-generic-yun-16M-squashfs-sysupgrade.bin

그러면 아래의 메세지가 띄는데 복잡한 문제에 부딪치고 싶지 않다면, 주의하길 바란다. 시스템이 리부팅 될 때까지 절때 건들지 말자. 

run-sysupgrade /mnt/sda1/openwrt-ar71xx-generic-yun-16M-squashfs-sysupgrade.bin 
Sending TERM to remaining processes ... uhttpd dbus-daemon dnsmasq avahi-daemon thd ntpd uSDaemon sleep syslogd klogd hotplug2 procd ubusd netifd 
Sending KILL to remaining processes ... 
Switching to ramdisk...
Performing system upgrade...
Unlocking firmware ...

Writing from <stdin> to firmware ...     
Upgrade completed
Rebooting system...

putty는 리부팅이 되면 끊어진다. 물론 winscp도 끊어질 것이다. 리부팅 완료 여부는 시리얼 모니터를 통해서 확인 할 수 있다. 시리얼모니터에서 정상적으로 리부팅이 된다면, 정상적으로 업그레이드가 완료 된 것이다. 보드가 업그레이드 되면, 그전에 설정했던 것들이 모두 날아간다. 그러므로, 여태 arduino yun보드에 했던 짓(wifi 설정, sftp 서버 설치)을 다시 설정을 해야 한다.


4. AWS IoT SDK 설치

 아래의 명령은 SDK설치와 순서는 없다. 순서에 관계없이 Linux가 업그레이드고 난 이후 한번은 실행되어야 한다. 

opkg update
opkg install distribute
opkg install python-openssl

구글 형님께 AWS IoT Yun SDK라고 물어보면 제일 먼저 뜨는 것이 https://github.com/aws/aws-iot-device-sdk-arduino-yun 이 사이트이다.  github에 올라가있는 프로젝트 들인데, 여기서 지금 필요한 항목은 "AWS-IoT-Arduino-Yun-Library", "AWS-IoT-Python-Runtime"이다. 전자는 Arduino 라이브러리이고, 후자는 윤보드에 들어갈 내용이다. 

AWS-IoT-Python-Runtime 폴더를 통채로 윤보드의 root에 넣을 것인데, 이동하기 전에 해야 할 일이, AWS IoT의 thing객체(테스트 용도라도...)와 연결하기 위한 인증서를 받아야 한다. AWS IoT의 사용방법 등은 AWS 문서가 있으니 생략하고 연결하는 방법만 설명 하겠다. 

우측 하단에 보면 "Connect a device"라는 버튼을 클릭한다. 그러면 화면이 바뀐다.

고맙게도 Connect a device 문구 아래 Arduino Yun이라는 라디오 박스가 있다. 그 라디오 박스를 선택하면 화면 중간에 "Generate certificate and policy"라는 버튼이 보이는데 클릭한다. 

다운로드 링크가 3개가 보이는데 모두 다운로드 받는다. 그리고 "Confirm & start connecting"버튼을 클릭한다.

그러면 위 그림과 같이 C 코드가 나온다. 이 코드는 "AWS-IoT-Arduino-Yun-Library"에 있는 aws_iot_config.h 헤더 파일에 들어갈 내용 들이다. 노트패드 같은 프로그램을 열어 콘트롤C,V 신공을 활용하여 코드를 보관해두든, 웹 사이트를 그대로 두든, aws_iot_config.h 헤더파일에 해당 부분을 변경하든 하여야 타이핑을 줄일 수 있다. 그림에 보면 AWS_IOT_MQTT_HOST 항목이 있는데 이곳에 주소는 [식별자].iot.[서버지역].amazonaws.com 식으로 입력되어야 한다. HOST에 들어갈 내용은 thing의 REST API endpoint에서 "https://" 떼어내고, "/thing/~"부분을 떼어낸 부분이 들어가면 된다.

 ex) https://[식별자].iot.ap-northeast-1.amazonaws.com/things/Corebd_IOT_Sensor/shadow
      [식별자].iot.ap-northeast-1.amazonaws.com

AWS에서 받은 인증서 파일들를 "AWS-IoT-Python-Runtime" 폴더 안에 certs 폴더로 이동 시킨다. 이것들은 MQTT 통신 시 암호화에 사용되는 인증서들이다. AWS IoT는 보안 레이어가 없으면 아예 통신이 되지 않으므로 반드시 필요한 것들이다. 다음 단계는 "AWS-IoT-Python-Runtime" 폴더를 윤보드 리눅스 환경의 /root 폴더로 이동시키는 것이다. 이 작업은 winscp를 이용하여 파일을 옮기면 드래그 한번으로 쉽게 옮길수 있다.

위의 그림은 winscp로 폴더를 옮긴 직후의 그림이다. 이제 남은 작업은 AWS IoT Arduino Yun SDK에 있었던 예제 프로그램을 윤보드에 올려 실제 연결이 되어 MQTT 메세지가 잘날아가는지 확인하는 작업이 남았다. 이 작업에 대한 내용은 다음 포스팅으로 미루고 우선 여기서 글을 끊고자 한다.

긴 글 읽으시느라 수고하셨습니다. 나머지 내용도 빠른 시일내에 포스팅을 하도록 하겠습니다. 혹씨나 내용에 문제가 있으면 꼭 알려주시길 부탁드리겠습니다.



'IOT > Arduino' 카테고리의 다른 글

Arduino Yun과 AWS IoT 2  (2) 2016.05.09
:
Posted by 알 수 없는 사용자

Windows Server 2012 이상에서 클러스터를 구성하는 경우, 나름(?) 고급 설정에 포함될 수 있는 부분이 CSV 캐시동적 쿼럼 정도가 됩니다.


그런데 말입니다(음성 지원 되지요?).. Windows Server 2012 R2가 되면서 동적 쿼럼은 기본적으로 Enable로 설정되었기 때문에 별도로 설정을 하시지 않으셔도 됩니다.


궁금하시다면, 클러스터 구성 후 PowerShell에서 다음과 같이 클러스터 속성 값을 나열해 보시면 DynamicQuorum 값이 1(Enable)로 설정되어 있는 것을 확인할 수 있습니다. 사실 Disable 하는 메뉴는 GUI 상에서 찾을 수가 없더군요.



두 번째 항목으로 CSV 캐시가 있는데 기능도 마찬가지로 기본 값이 Enable되어 있으며, BlockCacheSize 값이 저의 경우 2,048(2GB)로 설정되어 있습니다. Microsoft에서 권장하는 구성으로는 Hyper-V 클러스터의 경우 512MB, 스케일 아웃 파일 서버 클러스터의 경우 R2 기준으로 물리 메모리 대비 최대 80%까지 설정 가능하며 '크면 클 수록 좋음' 입니다.


현재 CSV 볼륨들에 대한 CSV 캐시 설정 확인 (값이 1이면 Enable 상태입니다.)

Get-ClusterSharedVolume | Get-ClusterParameter | where {$_.Name -eq "EnableBlockCache"}



서론이 길었습니다. 말씀 드린 것처럼 Windows Server 2012 R2에서는 동적 쿼럼이 기본 값이기 때문에 별도로 설정하실 필요는 없으며, CSV 캐시의 경우 PowerShell에서 다음 명령으로 캐시 크기를 설정합니다.

(Get-Cluster).BlockCacheSize = <크기, 단위는 MB>


예들 들어, 메모리가 32GB인 스케일 아웃 파일 서버 클러스터 노드의 CSV 캐시 크기를 10GB로 설정하는 경우에는 다음과 같이 입력합니다.

(Get-Cluster).BlockCacheSize = 10240


잘 입력되었는지는 PowerShell에서 다음과 같이 입력해 확인합니다.

(Get-Cluster).BlockCacheSize



참고로, CSV 캐시는 CSV 볼륨마다 할당됩니다. 즉, CSV 캐시를 10GB로 설정했는데 CSV 볼륨이 두 개인 경우 10GB x 2 해서 클러스터 노드마다 20GB의 캐시가 할당되게 됩니다.



아래는, CSV 캐시의 Hit 상황을 모니터링할 수 있는 성능 카운터 정보입니다.



CSV 캐시(메모리)에서 가져오는 I/O

- Cache IO Read-Bytes

- Cache IO Read-Bytes/Sec

- Cache Read

- Cache Read/Sec


캐시에 없어 스토리지에서 가져오는 I/O

- Disk IO Read-Bytes

- Disk IO Read-Bytes/Sec

- Disk Read

- Disk Read/Sec


전체 I/O

- IO Read-Bytes

- IO Read-Bytes/Sec

- IO Read

- IO Read/Sec




:
Posted by 커널64