포트나이트

포린이 놀이터 기간 한정 모드 사후 분석

2018. 7. 18.
글쓴이 포트나이트팀
안녕하세요. 포나터 여러분,

6월 27일 오후 5시경(한국 시각) 포린이 놀이터 기간 한정 모드를 배포했습니다. 얼마 지나지 않아 매치메이킹 서비스에 과부하가 발생하였고, 이는 포린이 놀이터 모드와 더불어 기존 모드에까지 영향을 끼쳤습니다. 서비스를 정상화하기 위해 계속 수정 작업을 진행했고, 7월 3일 오전에 모드를 다시 열 수 있었습니다.

발생 원인
게임의 매치메이킹은 매치메이킹 서비스(MMS)를 기반으로 개발되었습니다. MMS는 매치를 찾는 플레이어들을 “연결”하고 매치를 플레이할 수 있는 전용 서버를 열어주는 역할을 합니다. 매치메이킹 클러스터의 각 노드는 이용 가능한 전용 서버 목록을 가지고 있고, 이는 대략적인 지역 비중을 맞추기 위해 지역별로 무작위로 배포됩니다. 플레이어가 MMS에 연결하면 해당 지역 서버의 요청이 생성되고, MMS가 플레이어에게 노드를 지정하면 해당 노드는 보유한 목록에서 요청한 지역의 이용 가능한 서버를 선정합니다.

포린이 놀이터 모드는 100명이 아닌 1-4명의 플레이어를 위한 매치를 생성하기 때문에 파티 구성원의 수에 따라 기존보다 25배 또는 100배 더 많은 매치를 생성해야 합니다. 포린이 놀이터 모드를 위해 각 물리적 CPU에 가상 서버를 추가로 생성해도 다른 모드에 비해 15배 더 많은 수의 서버가 필요했습니다. 급증한 전체 서버 용량을 확보할 수 있었지만, 각 노드가 관리하는 목록이 15배 길어졌습니다.

MMS 노드가 자신의 목록에서 요청 지역의 이용 가능한 서버를 못 찾을 경우, 다른 노드의 목록을 빌려야 합니다. 노드의 목록이 15배 길어지면 당연히 검색 속도도 느려집니다. 그리고 마찬가지로 15배 길어진 다른 노드의 목록을 빌려 서버를 찾는 경우, 한 노드당 15배씩 느려지고 그만큼 계산 시간도 기존보다 훨씬 더 길어지게 됩니다. 포린이 놀이터를 배포했을 때, 엄청난 양의 수요 때문에 시스템이 목록을 새로 고칠 새도 없이 모든 MMS 노드의 목록이 고갈되었습니다. 이런 상태에서 각 노드가 다른 노드에 추가 서버를 요청하기 위해 돌아다니거나 다른 노드의 목록에서 서버를 찾으려 할 때 오랜 시간이 걸리게 되었습니다. 그렇게 계산 시간이 길어지면서 CPU에는 대기 중인 요청이 계속 밀리게 되고, 결과적으로 피드백 루프가 발생하면서 시스템이 서서히 중단되었습니다.

해결책
모드를 비활성화하고 나서 가장 먼저 한 일은 포린이 놀이터 MMS가 각자의 서비스 클러스터 내에서 일을 수행할 수 있도록 분리하는 작업이었습니다. 이는 주요 게임 모드에서 트래픽 장애가 발생하는 것을 방지하고, 포린이 놀이터 모드를 재개하기 위해 노력하는 동안 지속해서 서비스를 조정할 수 있는 환경을 만들기 위해 꼭 필요한 작업입니다. 시스템을 재구성하고 단계별로 테스트를 반복하면서 모드를 재개할 수 있는 수준에 도달할 수 있었습니다.

로컬 목록의 세션이 빠르게 고갈되는 점이 근본적인 원인임을 파악하고, 이를 해결하기 위해 클러스터가 다른 노드의 세션을 대량 재조정할 수 있게 하여 반복적으로 다른 노드를 조회하는 불필요한 작업을 없앴습니다. 한 노드의 지역별 수용량이 초과한 경우, 그 초과분을 시스템이 다른 필요한 노드로 이동시켜 계속 균형을 맞춰주기 때문에 노드가 특정 지역 서버 목록이 고갈되어 다른 노드에 요청해야 하는 경우의 수가 현저히 감소했습니다. 주요 포트나이트 배틀로얄 게임 모드에서는 이 문제가 나타나지는 않지만, 미래에 이런 문제가 나타나지 않도록 주요 MMS 클러스터에도 똑같이 적용할 예정입니다.

이번에 MMS를 재구성하면서 부하 테스트 프로세스를 한계까지 밀어붙였습니다. 테스트를 통해 재연하려던 것은 일반적인 사용량이나 테스트 방식과는 차원이 다른 규모였습니다. 새로운 시스템을 테스트하기 위해 수백만 명의 가상 사용자들을 모아 포린이 놀이터 MMS 시스템에 적용하는 방식으로 시스템에 굉장한 부담을 가해야 했습니다. 한 루프당 몇 시간씩 테스트를 진행하며 트래픽을 감당할 수 있을 정도로 재조정 능력을 개선하였고, 그 과정에서 이 모든 노력을 망칠 수도 있었던 특수한 버그도 발견하고 수정했습니다.

시사점
매치메이킹 시스템과 문제 요인에 대해 많은 것을 알게 되었습니다. 플레이어 규모를 바탕으로 최대 수용량을 추정하고 그에 따라 준비를 했지만, 초반에 엄청나게 많은 플레이어가 몰려들면서 로컬 목록이 고갈되는 상황을 제대로 예측하지 못했습니다.

모드를 다시 활성화하면서도 많은 것을 배웠습니다. 초반에 시스템 부담을 줄이기 위해 지역별 그리고 플랫폼별로 차근차근 포린이 놀이터 모드를 재개할 계획이었습니다. 하지만 저희 생각과는 달리 플레이어들이 플레이 가능한 지역으로 몰려들어 이슈가 발생했고, 이를 해결하는 동안 계획이 늦춰졌습니다. 한편, 그 어느 때보다 쉽게 아시아 지역의 클라우드 자원을 파악할 수 있게 되었습니다. 이번 사태를 빠르게 해결할 수 있도록 협력해 준 클라우드 파트너들에게 모두 감사드립니다!

포린이 놀이터 모드를 안정화하고 플레이어들에게 선보이는 과정은 생각보다 우여곡절이 많았지만, 예측하지 못하는 부분에서 복잡한 분산 시스템이 실패할 수 있다는 점을 다시 일깨워주었습니다. 갑작스럽게 대규모 업그레이드가 매치메이킹 서비스에 적용됐지만, 앞으로 게임이 발전하고 플레이어 규모가 더욱 커지는 상황에서 이번 업그레이드가 큰 도움이 될 것입니다.