- 초간단 요약 -
    기존의 자바 서비스하고 있던 부분의 일부를 node.js 로 포팅해서 두개를 벤치마크 해 봄. 자바는 멀티코어 환경에서 테스트하고 node.js 는 cluster 를 안쓰고 단일 코어에서 (아무것도 안하면 단일코어에서 도니 ㅎㅎ) 동작시켜봄 결과는 아래와 같음 



    씨피유와 메모리는 적게 쓰지만 (훨씬 적게..) 성능은 그리 낫지 않음. 이거저거 바꿔가며 테스트를 하던중 ORM 을 지원하는 Sequelizer 가 느리다는 것을 알아냄, node-mysql 로 바꾸고 나니 바뀐 내용입니다.



단일 코어를 씀에도 불구하고 자바와 비슷하게 성능이 나오고 있습니다. 같은 하드웨어라 가정하면 node.js 에 클러스터 (cluster)를 적용한다고 한다면 자바의 거의 5배에 해당하는 효율을 보일 것으로 예상됩니다. 

   글쓴이가 올린 다음 글을 보면 , node.js 는 성능이 워낙 뛰어나고, 여러사람들이 참여하기 때문에 무섭게 성장하는 개발환경이 될것이기 때문에 주의깊게 보고 있기는 하나, 기업용으로 쓰기에는 아직 치명적인 약점이 있다고 합니다. 바로 node.js 자체의 개발 주기가 너무 짧기 때문에 오랜 기간을 개발해야 하는 기업용 환경에서는 좋지 않다는 것입니다. (개발 하는 중간에 메인 언어가 업데이트 된다고 생각해 보세요 ㅎㅎ) 그렇기 때문에 1.xx 대로 올라가서 안정화가 된다면 그 때부터 기업용으로 쓰기에 무리 없지 않을까 라고 본답니다. 물론 저자는 아주 만족한 거 같다고 하더군요. 

  저도 글쓴이의 의견에 어느정도 동의합니다. 다만 지금 버젼으로도 정말 기업용 커다란 사이트가 아닌, 간단한 기능을 제공하는 사이트를 제작하는 데에는 (특히나 App 서버로) 최고의 효율을 보이지 않을까 싶습니다. 

클라우드 서비스의 성능을 측정하기 위한 벤치마크 툴입니다. 여러개의 대안이 있을 때 어떤 것이 우리쪽에 더 적합한가 측정하기에 아주 훌륭한 도구 입니다.

  YCSB 메인 페이지


설치 방법

   
    $ wget https://github.com/downloads/brianfrankcooper/YCSB/ycsb-0.1.4.tar.gz
    $ tar xfvz ycsb-0.1.4.tar.gz
    $ cd ycsb-0.1.4


컴파일 된 바이너리를 다운 받는 방법 (자바로 추정)

    $ git clone git://github.com/brianfrankcooper/YCSB.git
    $ cd YCSB
    $ mvn clean package


실제로 다운 받아서 컴파일 하는 방법. 그러나 컴파일이 안됩니다. asm 3.1.jar 의 압축이 풀리지 않는다는 이유로 에러가 발생합니다. (여기서 중단.. 안되는 일을 되게 할려는 노력도 중요하지만 굳이 쉽게 되는 일이 있는데 할 필요는 없는 듯..)

설치가 됐으면 실제로 테스트 해보는 시간입니다. 자세한 설명은

 https://github.com/brianfrankcooper/YCSB/wiki/Running-a-Workload

위 주소에서 잘 나와 있습니다. 그러니 생략하고 제가 좋아하는 실전형 따라하기 모드로 가겠습니다. MongoDB 에서 테스트를 한다고 가정합니다.

    - MongoDB 는 Local 에 설치되어 있다고 가정합니다. Port 는 40001 에 띄워져 있습니다.
   

YCSB 는 2가지 형태의 모드가 있습니다. (정확히는 3가지지만 shell 은 당장 안 쓸거라서 설명에서는 제외하겠습니다) 즉 load 와 run 입니다.


    load

데이터를 벤치마크 대상 데이터 저장소에 삽입하는 일입니다.


    run

이미 들어간 데이터를 가지고 벤치마크 테스트를 행하는 일입니다.


그러나 load 는 간단한 건에 대해서는 잘 동작하지만 건수가 억단위로 가면 시간이 기하급수적으로 늘어납니다. 그래서 데이터를 입력하는 것은 수동으로 1-100000000 의 숫자 아이디를 가진 'x' * 1000 바이트 짜리 데이터를 입력하는 모듈을 짜서 데이터를 입력해 두었습니다. (load 가지고 테스트를 하고 싶으면 대략 10만에서 100만 정도 까지 데이터를 입력하는 형태로 운영하시면 좋습니다)

ycsb-0.1.4 디렉토리에 있다고 가정하면 결론부터 이야기 하기로 하겠습니다.

 
   $ ./bin/ycsb run mongodb -P workloads/workloada -P mongo.ini -s > result.log


지금은 이대로 따라서 하면 에러가 발생할 것입니다. (그러나 어떤 원리인지 모르지만 파라미터가 틀려도 기본적으로 동작합니다.)


ycsb 는 실행 명령입니다.

run 은 transaction mode 로 실행하라는 소리입니다.

mongodb 는 내가 테스트 하고 싶은 DB Layer 가 MongoDB 라는 소리입니다.

-P workloads/workloada 는 Property 로 workloads 디렉토리 밑에 있는 workloada 를 선택해 주라는 이야깁니다. Property 는 지정 파일을 열어보시면 ycsb 를 실행할때 필요한 설정들이 들어 있는 것을 확인하실 수 있습니다. -P 는 파일을 지정할 수 있고, -p 는 개별 설정들을 지정할 수 있습니다.

-P mongo.ini 는 내가 지정해 줄 수 있는 설정들을 포함하고 있습니다. -P 인것을 보니 파일을 지정하는 것이겠지요? workloada 와 mongo.ini 에 같은 항목에 대한 언급이 있다면 마지막에 명시된 설정값을 따릅니다. 즉 위 예제에 따르면 mongo.ini 에 있는 것을 따르게 되어 있습니다.

-s 는 10초마다 진행사항을 보여주라는 의미입니다.


그리고 mongo.ini 의 내용입니다.


    mongodb.url=mongodb://localhost:40001
    mongodb.database=mydb
    mongodb.writeConcern=normal
    table=robots
    operationcount=10000


내용중에 관심 있게 볼 것은
   

url 은 mongodb 가 떠 있는 주소와 포트입니다.
database 는 테스트할 대상이 있는 db 의 이름입니다.
table 은 테스트할 대상이 있는 collection 의 이름입니다.
operationcount 는 내가 run 을 실행할때 몇번의 수행작업을 할 것인지 정해주는  것입니다. (load 시에는 recordcount 입니다)

어려운듯 보입니다만 (실은 어려웠습니다.. ) 막상 실행을 해보니 어렵지는 않더군요.

+ Recent posts