node.js의 성능은 과연 얼마나 될까??

|

요즘 회사에서 node.js를 이용한 과제성 프로젝트를 진행하고 있는데요.

single thread 기반의 event loop를 이용한 node.js의 성능은 얼마나 될까요?


일단 cluster 적용은 하지 않았다는 말씀을 드리고 싶습니다.

단순히 non-blocking, single thread 기반의 event loop가 얼마나 빠른지 알고 싶었을 뿐입니다. ㅎㅎ

 

자세한 자료는 첨부를 하지 못하지만 그냥 알아두시면 좋을 것 같아서 간략하게

테스트 조건 및 결과만 공개를... ㅎㅎ

 

조건

현재 VM서버에 node.js를 이용한 socket.io를 이용한 간단한 웹메신저 서버를 만들어 둔 후

또 다른 VM서버에 mongoDB를 설치하여 socket.io의 메세지를 mongoDB에 쓰도록 했습니다.

VM서버의 스펙은 vCPU 2개, 메모리 4gb입니다.

 

socket.io에서 하는 역할은 정말 간단합니다. 

1. 메세지를 받아서 mongoDB에 쓴다.

2. 메세지를 접속해있는 사람에게 broadcast를 한다.


테스트를 어떻게 진행해야 할지 몰라 java로 thread를 만들어 다름과 같은 기능을 하게 하는 테스트 어플을 만들었습니다.

각 thread의 역할은 아래와 같습니다.

1. socket.io lib를 이용하여 node socket.io에 연결 할 수 있다.

2. 메세지를 날린다.

3. 날린 메세지가 도착하는 시간을 잰다.

4. 도착 평균 시간을 낸다.


한개 thread당 유저 한명으로 보고 sleep time을 주던 안주던 테스트를 진행해서

총 1만건정도의 메세지를 주고받게 해서 동시에 몇건의 메세지를 처리할 때 최적인지 알아보려고 했습니다.

최대, 최소 interval이 몇 ms인지 throughput이 얼마인지 산출해내려고 했습니다.

결과

놀랍게도 결과는 10tps 정도 나오는 것 같네요.

평상시 메세지를 보내고 다시 받는데까지 걸리는 시간이 평균적으로 3~4ms 정도 나오는 걸 감안을 해서

throughput이 비슷하게 3~4초 이내에 나오는 조건과 최대, 최소 interval의 차이가 크지 않은 구간을 찾았는데요.

1초 안에 10건이상 처리하게 하려고 하면 응답 시간이 기하급수적으로 늘어나는 것을 확인 할 수 있었습니다.


물론 VM서버에서 테스트를 했고 클러스터를 적용하지 않은 상태에서 진행한 테스트이기 때문에

크게 신뢰를 할만한 정도는 아니지만 10tps는 약간 실망을 할수밖에 없는 결과였습니다.


이후에 약간 더 복잡한 기능을 가지고 cluster 적용을 하고 실제 성능이 떨어지지 않는 리얼서버에서도 테스트를 진행을 해보면

뭔가 더 신뢰할 만한 값이 나오지 않을까 싶네요.

And