Vert.x가 Socket.io 보다 빠르네.

updated 2012.09.06

이번엔 node.js를 클러스터 모듈을 이용해서 실행해봤다. 확실히 빨라졌다. 초당 요청처리량 vert.x와 거의 비슷하다. 단지 차이가 있다면 top으로 지켜볼 때 node.js는 프로세스 ID가 가상 코어 갯수만큼 뜬다. 즉 16개가 뜨고 평균 CPU 사용량은 40% 정도다. 하지만 Vert.x는 프로세스 ID는 한개만 뜬다. 그리고 CPU 사용량은 140% 정도다.

코드를 꼭 http://nodejs.org/api/cluster.html#cluster_cluster 이런식으로 짜야만 서버 리소스를 제대로 활용할 수 있고 여러 프로세스로 나뉘어 실행해야하는 node.js 보다는 vert.x가 더 쓰기 편하고 성능도 결코 node.js에 뒤쳐지지 않는것 같다.

===============================================

빠르지 않다. 둘이 비슷하다. node test.js로 실행할 때는 CPU를 한개만 사용한다. top으로 지켜봤더니 CPU가 100%를 넘지 못한다. vertx run Test.java로 실행했을 때는 150%를 넘어서 돌고 있다. vertx는 JVM을 사용하니까 JVM이 CPU 갯수가 몇개든 다 활용해주는거고 node는 한개만 사용하는듯 한데.. node에 CPU를 전부 다 사용하도록 설정할 수 있는 옵션이 있던가.. 아님 CPU 갯수만큼 node test.js를 실행해줘야 하던가.. 모르겠네;;

대충 2배니까 대충 비슷하다 치고 대충 테스트 끝.

===============================================

뭔가 이유가 있을 것 같은데 아직 모르겠네…

테스트 코드는 2byte 문자를 보내는 아주 단순한 웹 서버. 이 웹 서버로 10명의 동접자가 보내는 요청 5만개를 얼마나 빠른 시간안에 처리하느냐를 테스트 해보기로 결정.

테스트 클라이언트는 아파치 벤치로.

ab -t 10 -c 10 -n 50000 http://테스트할서버:포트/

최대 10초 동안 10개의 동접자가 총 5만개 요청을 보냄.

서버 사양은

  • 물리 CPU 2개.
  • 물리 CPU당 코어 갯수 4개.
  • 가상 코어 총 갯수 16개.
  • CPU 속도는 2.27GHz
  • 메모리는 16G

테스트 결과.

node.js

Server Software:
Server Hostname: xxxx
Server Port: yyyy

Document Path: /
Document Length: 2 bytes

Concurrency Level: 10
Time taken for tests: 6.769 seconds
Complete requests: 50000
Failed requests: 0
Write errors: 0
Total transferred: 3300000 bytes
HTML transferred: 100000 bytes
Requests per second: 7386.61 [#/sec] (mean)
Time per request: 1.354 [ms] (mean)
Time per request: 0.135 [ms] (mean, across all concurrent requests)
Transfer rate: 476.09 [Kbytes/sec] received

Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 0.1 0 2
Processing: 0 1 0.5 1 11
Waiting: 0 1 0.5 1 11
Total: 1 1 0.5 1 11

Percentage of the requests served within a certain time (ms)
50% 1
66% 1
75% 1
80% 1
90% 1
95% 1
98% 2
99% 2
100% 11 (longest request)

vert.x

Server Software:
Server Hostname: xxxx
Server Port: yyyy

Document Path: /
Document Length: 2 bytes

Concurrency Level: 10
Time taken for tests: 3.865 seconds
Complete requests: 50000
Failed requests: 0
Write errors: 0
Total transferred: 3300000 bytes
HTML transferred: 100000 bytes
Requests per second: 12935.92 [#/sec] (mean)
Time per request: 0.773 [ms] (mean)
Time per request: 0.077 [ms] (mean, across all concurrent requests)
Transfer rate: 833.76 [Kbytes/sec] received

Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 0.0 0 0
Processing: 0 1 1.0 0 49
Waiting: 0 1 1.0 0 49
Total: 0 1 1.0 0 49
WARNING: The median and mean for the processing time are not within a normal deviation
These results are probably not that reliable.
WARNING: The median and mean for the waiting time are not within a normal deviation
These results are probably not that reliable.
WARNING: The median and mean for the total time are not within a normal deviation
These results are probably not that reliable.

Percentage of the requests served within a certain time (ms)
50% 0
66% 1
75% 1
80% 1
90% 2
95% 2
98% 3
99% 4
100% 49 (longest request)

대략 2배가 차이나는데 많게는 어떤때는 3개 가까이 차이 날때도 있다. 아마도 node test.js를 실행했을 때는 물리 CPU를 1개밖에 사용하지 않는것 같고 vertx run Test.java를 실행했을 때는 물리 CPU 2개를 모두 사용하는 것 같다.

정말 그래서 생긴 차이라면 사실 이 둘의 성능은 비슷하다고 볼 수 있는거 아닌가 싶다.

[vert.x] Hello Vert.x Module

Vert.x는 Verticle이라는 클래스를 상속한 .Java 파일을 실행할 수도 있고 프로젝트를 모듈화한 모듈을 실행할 수도 있습니다.

http://vertx.io/manual.html#interacting-with-vertx

자세한 내용은 위 링크를 참조하시구요. .java를 실행하는 예제는 쉽기 때문에 별다른 설명은 필요없을 것 같고, 저는 모듈을 실행하는 방법을 설명하겠습니다.

그러려면 모듈 프로젝트를 만들어야 하는게 이게 좀 일이죠. 그래서 제가 기본 골격을 만들어 두었습니다.

https://github.com/keesun/mod-sample

이 프로젝트를 받아서 각자 자신의 모듈을 만드실 때 사용하시면 됩니다.

git clone git://github.com/keesun/mod-sample.git

Git 지우기

받으신 다음에 mod-sample 디렉토리로 이동해서 .git/ 디렉토리를 지워주시면 깔끔합니다. 요즘은 svn도 이렇게 한곳에만 파일을 둔다는데 이전에는 굉장히 지져분하게 디렉토리별로 .svn이 생겼었죠. 그래서 그걸 전부 지우는 스크립트도 사용하고 그랬었는데.. git은 안그래도 됩니다.

빌드하기

빌드툴은 gradle을 사용합니다. 이유는 잘 모르겠고, 아마 스프링소스에서 그루비를 밀어주려고 그래들을 사용하는게 아닐까 싶기도 하고 메이븐이 너무 복잡하니까 그래들을 사용하는 것 같기도 하고 여러가지 추정은 가지만 뭐.. 팀 폭스가 그래들을 쓰니깐.. 저도 그래들.

유닉스/리눅스 계열 유저는 ./mk 를 사용하시면 되고 윈도 유저는 ./wmk를 사용하시면 됩니다.

./mk tasks라고 입력하신 다음에 커피를 한잔 드세요. 처음 빌드 하신 분들은 인터넷과 컴터 사양에 따라 대략 10분 ~ 15분 정도 걸립니다.

사용하는 IDE 파일 생성하기

이클립스나 IDEA 유저가 대부분일텐데요. 그러한 IDE 관련 파일은 절대로 버전 관리에 넣으시면 안 되는거 아시죠? 그거 개인 마다 다 달라지는 파일이라서 보통 버전 관리에 넣지 않아요. 그거 넣으면 뭔가… 이 사람 협업을 많이 안 해 봤나… 아님 초본가… 하는 생각이 드니까 조심하시기 바랍니다.

그래서 보통 로컬에서 생성해서 사용합니다. 그걸 직접할리는 없고 그래들 빌드를 돌리면 생성됩니다.

IDEA 유저는 ./mk idea 이클립스 유저는 ./mk eclipse 라고 하면 IDE 관련 파일들이 생겨서 IDE에서 프로젝트를 열거나 import 하실 수 있습니다.

IDE로 보면 대략 이런 모습인데요. 여기서 중요한 파일이 src/main/mod.json입니다. 이 파일이 모듈 설정 파일인데, 저도 정확히 어떤 속성들이 존재하는지 모르겠습니다.

아마도 Vert.x 코드를 까보면 보일텐데;; 제가 지금 아는 수준은 매뉴얼에서 설정하는 수준 뿐입니다.

http://vertx.io/mods_manual.html

모듈을 크게 둘로 나눠서 실행 가능한 모듈(실행 모듈)과 그렇지 않은 모듈(비실행 모듈)이 있는데 지금 제가 샘플로 제공하는 것은 실행 가능한 모듈입니다. 물론 이걸 조금 수정해서 비실행 모듈로 만들 수도 있습니다. 구분은 main이라는 속성으로 합니다.

{
“main”: “me.whiteship.HelloVertxModule”
}

지금 mod.json을 보면 이렇게 main 이라는 속성에 Verticle을 상속받은 클래스 전체 경로를 적어둔 것을 볼 수 있습니다.

Verticle을 상속받으면 start()라는 메서드를 구현해야 하는데 위와 같이 구현하면 아주 단순한 웹 서버를 만들 수 있습니다.

모듈 만들기

이제 다시 콘솔로 이동해서 이 프로젝트를 모듈로 빌드해보죠.

./mk clean dist

./mk dist라고만 해도 될듯한데 그냥 깨끗하게 빌드 하려고 저는 ./mk clean으로 빌드 디렉토리 다 지운담에 다시 dist로 빌드 하도록 ./mk clean dist를 주로 씁니다.

빌드가 되면 프로젝트홈/build/mod 라는 디렉토리에 모듈이 생깁니다.

아차;; 빌드 하기전에 build.gradle에서

compile “org.vert-x:vertx-core:$vertxVersion”
compile “org.vert-x:vertx-platform:$vertxVersion”

이걸

provided “org.vert-x:vertx-core:$vertxVersion”
provided “org.vert-x:vertx-platform:$vertxVersion”

이렇게 바꿔주세요. 코딩할 때 필요해서 compile 스코프로 넣어뒀는데 빌드하고 난 뒤에 실행할 때는 이 두개가 vert.x에서 제공해주는 라이브러리를 쓰도록 provided 스코프로 해주는게 맞습니다.

자 어쨌든 build/mod/로 가시면 모듈 디렉토리가 생긴걸 볼 수 있습니다.

/work/mod-sample/build/mod > ls
me.whiteship.mod-sample-v0.1

이렇게요.

모듈 실행하기

모듈 기본 디렉토리를 mods라는 디렉토리입니다. 즉 아까 생성된 모듈을 mods 라는 디렉토리 밑으로 옮겨야 하죠. 그런데 mods라는 디렉토리가 없죠? 프로젝트홈 디렉토리에 하나 마들어 주세요.

mkdir mods

그리고 그 밑으로 아까 생성된 모듈 디렉토리를 통쨰로 복사하거나 옮겨오세요.

/work/mod-sample/mods > ls
me.whiteship.mod-sample-v0.1

이렇게요.

이제 프로젝트홈에서 다음과 같이 모듈을 실행하시면 됩니다.

/work/mod-sample > vertx runmod me.whiteship.mod-sample-v0.1
server is running on http://localhost:9090/

브라우저에서 해보시거나 콘솔창을 하나 더 열고

~ > curl http://localhost:9090/
Hello Vert.x

끝.

[vert.x] 설치하기

http://vertx.io/install.html

링크에 보시면 자세히 나와있지만, 간략하게 설명드립니다. Vert.x는 자바7을 사용하기 때문에 우선 JDK7을 설치해야 합니다.

자바 설치는 다들 아실테니 패스. 모르시면 구글링.

http://vertx.io/downloads.html

여기 들어가시면 가장 최신 버전인 1.2.3.final 버전을 받을 수 있습니다. 팀 폭스가 현재 휴가 중이니까 최소한 3주 동안은 이 버전이 가장 최신 버전으로 남아있을 겁니다. 아마도 휴가 다녀오면 버전이 바로 오를 것으로 예상되지만 설치하는 방법은 크게 바뀌지 않을 겁니다.

압축 파일을 받아서 압축을 풀고 원하는 디렉토리로 이동시킵니다. 저는 주로 /apps를 사용합니다.

lrwxr-xr-x 1 whiteship wheel 21 8 27 21:16 vert.x -> ./vert.x-1.2.3.final/
drwxr-xr-x@ 8 whiteship staff 272 7 31 19:03 vert.x-1.2.3.final

자주 배포되는 녀석들은 매번 path 설정 바꿔주는게 귀찮기 때문에 이렇게 링크를 만들어 두면 편합니다. 아시죠? ln -s ./vert.x-1.2.3.final ./vert.x 로 만들었습니다.

이제 bin 디렉토리를 path에 추가해 줍니다. /apps/vert.x/bin 디렉토리를 추가해주시면 됩니다. path에 추가하는 방법도 패스.

이제 콘솔에서 vertx version을 쳐보세요.

~ > pwd
/Users/whiteship
~ >
~ >
~ > vertx version
vert.x-1.2.3.final

대충 요렇게 나오면 설치 끝.

[Socket.IO Module for Vert.x] I DID IT! YEAH~~ ;)

I don’t have enough time to write now, so I’ll just show you some links that you can see all the information(the codes).

https://github.com/keesun/mod-socket-io

With this module, you can code like this.

If you have more interest in the vert.x module that using the socket.io, you can reference my sample module project at here.

https://github.com/keesun/mod-test

Thanks.