만족

[사이퍼즈 서포터] 데이터 분석을 위한 크롤러 제작 본문

[사이퍼즈 서포터] 데이터 분석을 위한 크롤러 제작

Project/사이퍼즈 서포터 Satisfaction 2020. 6. 3. 03:30

앱에서 제공되는 해당 데이터는 랭크 1000위 내의 유저들을 대상으로 얻어진 데이터를 분석하여 표시해줍니다.

 

해당 플레이어의 전적을 얻기 위해서 한번 조회하고,

그 전적에서 나온 매칭 아이디로 다시한번 매칭 정보를 조회하여 얻어지는 데이터로 포지션 통계가 작성됩니다.

(물론 현재는 플레이어의 전적 조회 시, 포지션 정보가 표시되긴 합니다)

 

그런데 문제는 이렇게 하면 request 횟수는 약 3~4만번인 데다가 다뤄야 하는 데이터의 갯수도 매우 많습니다.

크롤러를 서버 측에서 돌아가게 설정해 두어서 서버에 가해지는 부하가 너무 크다는 뼈아픈 단점이 있습니다.

(현재 서버 사양 1Core, 1GB RAM)

 

해당 크롤러를 작동시키면 10~30분 정도가 걸리며

메모리는 90%, CPU는 거의 100%를 찍게 됩니다.

크롤러를 작동시킬 떄면 항상 오는 경고 메일

 

가장 심각한 문제는 크롤러 작동 중 앱이나 웹에서의 호출 속도도 현저하게 떨어져 사용자에게 불쾌감을 준다는 것입니다.

(동작하다가 서버가 뻗어버린 적도 있습니다...)

 

해당 문제를 해결하기 위해, 크롤링 속도를 포기하고 멀티스레드를 사용하지 않게 변경해 보았습니다.

(한 번에 한 유저의 정보만을 크롤링)

 

부하는 많이 줄었지만 크롤링 시간이 거의 배로 늘었습니다.

게다가 크롤러 코드가 php로 이루어져 있는데, php에 대한 이해가 부족해 코드는 난잡하기 그지없었죠.

 

그래서 요즘 큰 관심을 가지고 있는 nodejs로 로컬에서 크롤러를 다시 작성했습니다.

 

php보다는 오래 다루어 봐서 훨씬 편하게 작성했습니다.

 

로컬 컴퓨터에서 크롤링과 분석까지 모두 마친 다음, 서버의 데이터베이스에 접속해서 분석 결과만을 쿼리로 날려주는 방식입니다.

async-await를 활용해서 JAVA나 php보다 비동기 작업을 다룸에도 코드가 더러워진다는 느낌은 받지 못했습니다.

 

이렇게 하면, 무거운 작업들은 로컬 컴퓨터에서 전부 처리하기 때문에 서버에 가해지는 부하가 거의 사라지게 됩니다.

 

서버 리소스 보드 (Whatap)

결과값 쿼리의 양이 약 4000개 정도 되어서, CPU사용량이 급격하게 튀어오르긴 하지만

20~40%대 정도면 꽤 양호한 편입니다.

 

로컬 컴퓨터 CPU 사용량 (Mac)

CPU에서 17.8%밖에 소모하지 않는데? 라고 생각하실 수도 있지만

가상 호스팅 서버에서 주로 사용하는 CPU는 Xeon이며, 가정용 CPU보다 코어당 성능은 낮은 대신 코어 수가 압도적으로 많습니다.

게다가 타 업체와 비교해서 aws lightsail의 CPU성능은 매우 떨어집니다

참고: https://satisfactoryplace.tistory.com/80

 

로컬 컴퓨터 메모리 사용량 (Mac)

로컬 컴퓨터에서는 켜놓더라도 사용에 문제가 있지 않았습니다.

 

특히 메모리의 경우 438.7MB나 먹고 있는데, 실 서버의 평균 free memory 양은 300MB였던 것으로 미루어 보아,

페이지 스왑 현상까지 겹쳐 서버에서 더욱 느렸던 것으로 추정됩니다.

 

아무튼 로컬로 크롤링&분석 작업을 옮긴 결과 서버의 부하는 매우 줄어들고 (<100%에서 <40%로)

속도 역시 2배 이상 향상되었습니다.

 

관리자 페이지에서 버튼을 누르는 것 만으로 모든걸 원스탑으로 해결하려고 했으나....

서버가 구닥다리라 오히려 편하게 가려다 더 불편하게 가게 된 것 같습니다.



Comments