Rev. 2.73

지난번에 소개한 Jason Davies씨의 websocket-activity-monitor 소스 리파지토리를 포크해서 재구성해보았습니다. 이것은 실시간으로 서버의 활성상태를 모니터링하는 프로젝트입니다. iostate에서 흘려주는 정보들을 조금더 출력할 수 있게하고 차트 라이브러리를 Dygraph로 변경하여 약 10여분 동안의 데이터가 누적되도록 하였습니다. 그 결과는 아래와 같습니다. 당분간 Firejune.I/O의 인덱스 페이지로 사용할 예정이에요.

firejune.io.png

avg-cpu
%user : 사용자 레벨(응용프로그램)에서 실행하는 동안 발생한 CPU 사용률
%nice : 우선순위를 가진 사용자 수준에서 실행하는 동안 발생한 CPU 사용률
%system : 시스템 레벨(커널)에서 실행하는 동안 발생한 CPU 사용률
%iowait : 스템이 미결 디스크 입/출력 요청이 있었던 동안 CPU가 유휴 상태였던 시간의 비율
%steal : 0.10 하이퍼바이저가 다른 가상 프로세서를 서비스하는 동안 CPU가 유휴 상태였던 시간의 비율
%idle : CPU가 유휴 상태였으며 시스템에 미결 디스크 입/출력 요청이 없었던 시간의 퍼센트

device I/O
rram/s : 장치에 병합된 초당 읽기 요청 수
wram/s : 장치에 병합된 초당 쓰기 요청 수
tps : 장치에 발행된 초당 입/출력 수(r/s + w/s)
rsec/s : 장치의 초당 읽은 섹터 수
wsec/s : 장치의 초당 기록한 섹터 수

device average
avgrq-sz : 장치에 발행된 읽기 요청의 평균 크기(섹터)
avgqu-sz : 장치에 발행된 요청 대기열의 평균 길이
await : 장치에 발행된 입/출력 요청이 있었던 동안 CPU가 유휴 상태였던 시간의 평균값(밀리초)
svctm : 장치에 발행된 입/출력 요청에 대한 평균 서비스 시간(밀리초)
%util : 장치의 입/출력 요청에 대한 CPU 대역폭 사용률(100 퍼센트에 가까울 경우 장치가 포화 상태임)

Update:
- 2011/09/10: 러닝 프로세스의 메모리 및 CPU 사용량에 따른 문자 색상 변화
- 2011/09/06: 상호작용 가능한 갱신 시간 및 히스토리 스택 옵션
- 2011/09/05: 데이터 송/수신 논리 변경
- 2011/09/04: 러닝 프로세스 출력 개선
- 2011/09/04: 히스토리 스택 축소
- 2011/09/02: top 명령을 이용한 러닝 프로세스 출력
- 2011/08/30: node-websocket-server 모듈에서 Socket.IO 모듈로 변경
- 2011/08/28: 서버 메모리 스토어에 약 6여분(최근 400건)의 데이터 보존 및 출력
- 2011/08/27: 서버 커낵션 수에 비례하는 콜백 증식 현상(메모리 릭) 제거
- 2011/08/26: 서버와 접속이 끝어진 경우 재접속 시도
- 2011/08/24: free 명령을 이용한 메모리 사용량 데이터 추가
- 2011/08/23: 그래프 생성 및 데이터 가공 분기
- 2011/08/20: 수신 데이터 포멧 변경

Comments

Node.JS로 만들어진 프로젝트들을 돌려보는 기쁨에 푹빠져 살고 있습니다. 서버를 운영하다 보니, 시스템 활동 상황이 궁금해서 시스템 활동 상황을 모니터링하는 프로젝트가 있나 싶어 찾아봤더니, node-websocket-activity-monitor라는 이름으로 GitHub에 등록되어 있더군요. 즐거은 마음으로 클론해서 돌려보니 역시나 안돌아갑니다. 마지막 갱신일이 2009년 중순이에요; child_process API을 로드하여 "iostat"의 실행결과를 가로채는 방식으로 구현되었더군요.

graph.png

click to start

disk0 cpu average
Time tps rsec/s wsec/s user system iowait idle await svctm util

그런데 이상한점은 충분히 무리하게 사용하고 있다고 생각되는데도 사용율이 0 퍼센트 이하인것은 조금 이해하기가 어렵네요. 정상인 거겠죠?

Comments

Hummingbird는 리얼타임 웹 트래픽 분석 도구입니다. 방문자가 트래픽을 발생하면 현재 상황을 실시간으로 모니터링 할 수 있습니다. Node.JSSocket.IO 그click to start리고 MongoDB를 이용하여 만들어 졌으며, WebSocket을 이용합니다. 그래프를 갱신하는 주기는 초당 무려 20회입니다. 작동 방식은 간단합니다. 모니터링하려는 페이지에 Hummingbird가 만들어준 TrackginPixel 이라는 1px 이미지를 호출하면 됩니다. 아래에 적용한 것은 마우스 포인트 트래킹 커뮤니케이터인 Smails의 트래픽을 모니터링 하는 것이며 이 역시도 Socket.IO로 구현되었습니다. 결과가 상당히 흥미롭군요.

HUMMINGBIRD

explanation.pngClick to start

Hummingbird는 오픈소스 프로젝트입니다. GitHub에서 소스를 다운로드 할 수 있습니다. 사실 이녀석을 설치하는데 꽤나 애를 먹었습니다. 노드 패키지들도 상당히 오래된 것들이었고 MongoDB를 운영해야한다는 조건 때문에 구글님이 알려주신대로 아래와 같이 수행하여 MongoDB를 설치하고, 노드용 mongodb 패키지까지 설치하여 노드 서버를 구동하는데 까지 성공했습니다.

# w-get http://fastdl.mongodb.org/linux/mongodb-linux-i686-1.8.2.tgz
# tar zxvfp mongodb-linux-i686-1.8.2.tgz
# mv mongodb-linux-i686-1.8.2/bin/* /usr/bin
# mkdir /var/mongo
# mongod --dbpath=/var/mongo &
# ps -ef | grep mongo
# npm install mongodb

사용되는 Socket.IO의 버전이 0.6.16이더군요. 0.7.8로 업데이트 했더니 역시나 오류가 철철 넘칩니다. 관련 코드를 전부 0.7.8용으로 갱신했고, 쓸데없이 분리한 자바스크립트 파일들을 하나로 묶었으며, 크로스-도메인 요청에 응답하도록 작업하여 힘겹게 실행할 수 있었습니다. forever에 등록시켜 놓고 보니 이 프로젝트는 충분히 시간을 투자할만한 가치가 있다고 느껴지네요. 조금씩 기능들을 개선해 보도록 하겠습니다.

덧, UDP 서버를 활성화 하면 서버간 소켓 통신으로 트래픽 발생 상황을 Hummingbird에 알릴 수도 있으며 코스트가 훨씬 적게듭니다.

Updates:
* 2011/09/06 - GeoIP 라이브러리 및 모듈 업데이트
* 2011/09/06 - UDP 통신 데이터 속성 변경
* 2011/09/06 - 상호 작용 가능한 갱신 시간 및 스택 옵션화
* 2011/09/06 - Metric 단위로 데이터 통신이 발생하던 것을 하나로 통합
* 2011/09/06 - 서버-사이드 소스 코드들을 하나로 통합 및 경량화
* 2011/09/04 - UDP를 이용한 웹소켓 트래픽 측정 추가
* 2011/09/04 - 데시보드 및 관련 클라이언트 프로세스 제거
* 2011/09/04 - jQuery 의존성 제거
* 2011/09/03 - Socket.IO 0.8.2 업데이트
* 2011/09/03 - 초당 10회로 줄임
* 2011/09/03 - Metrics의 불필요한 코드 제거
* 2011/09/03 - 관련 페이지에 접속하면 UDP서버간 통신으로 데이터를 전송
* 2011/09/03 - 더이상 MongoDB에 데이터를 보존하지 않음
* 2011/08/25 - 클릭하여 허밍버드 시작
* 2011/08/22 - Smails에서 전송하던 트래픽을 삭제
* 2011/08/12 - bluemarble 지도로 변경하고 polymaps의 포인트 색상 변경

Comments