서버의 종류는 크게 두 종류로 본다.

Connectionless vs Connection

대부분의 웹서버는 소켓통신이 거의 없으므로 전자에 속하고, MMORPG와 같은 게임서버는 후자에 속하겠다. 물론 두가지를 섞어서 사용할 수 도 있지만 일단 이렇게 나눠본다.

첫번째 웹서버인 경우에 처리할 수 있는 유저수를 계산할때 전체 request의 평균 response time으로 시간을 계산한다고 한다. 그리고 후자인 경우는 몇몇 문제가 되는 악성? 해비한 유저들을 대상으로 시간을 계산한다고 한다.

본인은 웹서버를 개발하고 있기때문에, 한번 웹서버인 경우 하나의 머신으로 얼마나 유저를 받을 수 있을까 계산해보기로 한다.

예를들어 내가 서비스하고있는 모든 api들의 평균 응답속도가 30ms라고 하자.

이때, 모든 request가 sync request라면, 1초에 처리할 수 있는 request  수는 약 1000ms/30ms = 약 33개. async request 비율이 포함되어 있다면 33개 이상의 request를 처리할 수 있을 것이다.

33명이 1초에 한번씩 request를 날려도 무난한게 동작가능. 하지만 보통의경우 이렇게 미친듯이 날리지는 않으므로 실시간으로 1명의 유저가 약 5초에 한번씩 request날린다고 했을때,  33*5 = 165명 정도 실시간으로 처리 가능하다고 볼 수 있다. (물론 db시간과 그에 따른 io시간이 추가변수가 될수 있지만 30ms가 그것을 가만한 평균 request라고 가정)

또한 한개의 머신이 8코어를 쓴다고 가정하고 서버인스턴스를 8개 띄워놓았을경우 실시간으로 처리 가능한 유저수는 165*8 = 1320 이 된다. 

물론 이제 남은건 db병목이다. nosql만 쓴다고 가정하면 샤딩등으로 디비를 분할해서 문제를 해결할 수 있다. mongodb같은경우 profiler를 써서 어떤 request가 response time이 기준 응답속도를 벗어났는지 분석해서 문제를 해결하는것이 노하우가 되겠다.

번외) 실시간 1000명정도면 아마 DAU는 10만이상이 될것이다. 만약 이중 1%가 만원씩 결제한다고 한다면 1000만원! 뭐.. 그럴거 같다는 얘기다. 

+ Recent posts