야근을 부르는 복잡한 게임 서버 문제, 왜 발생할까?

게임뉴스 | 박광석,남기백,유희은 기자 |



  • 주제 : 더 안정적이고 빠른 게임서버 개발방법
  • 강연자 : 배현직 - 넷텐션 / CTO
  • 발표분야 : 개발, 서버
  • 강연시간 : 2021.11.18(목) 15:00 ~ 15:50
  • 강연 요약 : 개발을 할 때 서버 개발이 병목이 되기도 한다. 서비스 오픈 중에는 서버 장애가 발생하기도 한다. 아이템 지급 오류 등 서버와 관련된 문제가 발생하기도 한다. 그리고 서버 개발자는 변명을 한다. 이런 악순환의 고리를 어떻게 이해해줘야 할까? 그리고 어떻게 해결해야 할까? 이를 알아보도록 하자.



  • ■ 일반적인 게임 서버 아키텍처는? - 같은 장르더라도 천차만별로 달라지는 복잡한 서버 구조



    ▲ 인게임, 아웃게임으로 나뉘는 MO 게임의 서버 구조

    배현직 CTO의 강연은 일반적인 게임 서버 아키텍처 구조에 관한 이야기로 시작됐다. 그는 같은 게임 장르라도 게임의 내용물이 무엇이냐에 따라 서버 구조가 달라질 수 있다며, MO와 MMO 등 게임 방식에 따라 달라지는 서버 구조를 이미지와 함께 소개했다.

    먼저 방을 만들고 여기에 입장해서 게임을 플레이하게 되는 MO 게임의 경우, 서버는 인게임, 아웃게임 구조로 나뉘게 된다. 아웃게임은 매치메이킹이나 채팅 등을 처리할 때 클라이언트의 요청이 1초 정도 늦어져도 큰 문제가 없지만, 인게임은 0.05초만 늦어져도 사용자들의 체험이 크게 나빠지게 되는 것이 특징이다.

    수천 이상의 플레이어가 하나의 월드에서 함께 플레이하는 MMO 게임은 다수의 존 서버로 구분되는 모습이다. 각 존 서버는 여러 리전에 흩어져 있으며, 각 존 서버는 요청 응답 처리가 0.1초만 늦어져도 플레이 체험 지수에 영향을 끼치게 된다. 그는 간략화된 이미지와 달리 실제 서버 구조의 경우 인앱결제, 로그인 통합, BI, 운영 등 다른 것들이 포함되면서 더욱더 복잡한 형태로 이루어져 있다고 설명했다.



    ▲ 다수의 존 서버로 구분되는 MMO 게임의 서버 구조



    ■ 서비스 오픈 중 서버 관련 문제의 종류 - 서버 크래시부터 무응답, 랙, 오동작에 해킹까지…

    배현직 CTO는 이어 서버 관련 문제로는 어떤 것들이 있는지 소개를 이어갔다. 서비스 오픈 중 개발자가 만나게 되는 서버 관련 오류로는 서버 크래시부터 무응답, 랙, 오동작에 해킹까지 다양한 종류가 있다.

    먼저 서버 크래시는 이름 그대로 '서버가 죽는 것'을 뜻한다. 서버 프로그램 안에서 메모리가 긁혀 발생하는 것으로, 서버 프로그램이 강제로 종료되어 접속해 있던 유저들이 모두 강제로 쫓겨나게 된다. 서버 관리자는 비교적 문제 현상을 인지하기 쉽고, 발생하는 즉시 발견한 뒤 조치에 나설 수 있다.




    두 번째 증상은 '서버 무응답'이다. 서버 자체는 죽지 않았지만, 클라이언트의 요청이 너무 많아 처리가 밀리고 있는 상황에 발생한다. 일시적이라면 큰 문제가 없으나, 해당 현상이 누적되면 서버에 접속해있는 유저가 보기엔 마치 서버가 죽은 것처럼 느껴지게 된다. 서버가 무응답 상태로 가고 있다는 것을 초기에는 파악하기가 쉽지 않으므로, 크래시보다 해결 난이도도 높은 편이다. 보통 크래시 문제를 처리한 뒤, 무응답 현상이 이어서 발생하는 경우가 많다.

    세 번째 증상은 '서버 랙'이다. 무응답 증상과 유사하지만, 서버가 일을 쳐내는 속도보다 클라이언트의 요청 속도가 더 빨랐다가, 느렸다가 하는 일종의 '사이클'이 있을 때 발생한다. 처리 속도가 느린 것이 계속 누적되면 앞서 설명한 '서버 무응답'이 되고, 누적이 없으면 '서버 랙' 현상이 된다.

    서버 랙은 앞에 발생한 두 증상과 달리, 서버 내부 문제라기보다 망 문제, 혹은 서버 배치 장소의 문제 탓에 발생하는 일도 많다. 그는 크래시나 무응답보다 시급함이 덜하지만, 이를 내버려둘 경우 서버를 이용하는 이용자들의 불만족이 커질 수 있다고 설명했다.


    네 번째 증상은 '서버 오동작'이다. 서버의 연산 결과가 잘못되었을 때 발생하는 문제로, 플레이어 간 아이템 교환에서 한쪽이 누락된다거나, 몬스터를 잡았는데도 경험치가 쌓이지 않는 등의 경우가 이에 해당한다. 단순히 코딩 실수로 발생한 문제라면 쉽게 고칠 수 있지만, 서버 구조가 복잡하게 설계된 경우 쉽지 않은 문제가 되기도 한다.

    그는 서버 설계는 최대한 단순한 것이 좋은데, 개발자들이 마세라티 문제를 걱정해서 이런 사달이 나는 경우가 자주 있다고 설명했다. 여기서 '마세라티 문제'란, 구매할 돈도 없으면서 어떤 마세라티 모델과 색상을 구매할지 생각한다는 말로, 현 단계에서 전혀 걱정할 필요가 없는 일을 고민한다는 뜻이다.

    마지막은 '해킹'이다. 제아무리 결점 없이 만든 게임이라도 해킹 피해를 볼 수 있다. 어디든 악의적인 마음을 품은 이들이 있기 마련이고, 이들은 끊임 없이 해킹을 시도하기 때문이다. 그는 서버 개발자들이 모든 설계에 있어 항상 '해킹 가능성'을 염두해야만 한다며, 이때 비용과 품질 문제를 두고 어느 정도 양보할 수 있을지 명확한 선을 정해야 한다고 설명했다.



    ■ 서버 문제가 개발 일정에 문제를 주는 이유는?

    그렇다면 이러한 서버 문제들이 개발 일정에 문제를 주는 이유는 무엇일까. 배현직 CTO는 첫 번째로 '테스트를 충분히 할 수 없다'는 허들이 있다고 말했다. 게임 서버가 잘 작동하는지 테스트하는 일차적인 방법으론 사내 테스트가 있는데, 이땐 동시접속자 수가 충분치 않아, 서버 과부하나 버그 등, 다수의 유저가 접속했을 때 발생할 수 있는 문제들을 제대로 확인하기 어렵다.

    이를 해결하기 위한 대처법으로 오토 매크로 봇을 활용한 '봇 테스트'를 진행하기도 한다. 이걸로도 꽤 많은 버그와 부하 문제를 사전에 걸러낼 수 있지만, 예상치 못한 행동을 하는 사람의 모든 행위에 대처할 수는 없다. 그래서 나머지 부족한 역할을 충족하기 위해 QA 팀을 구성하는 것이라고 할 수 있다. QA 팀은 인간의 상상력을 적용한 봇 테스트 시나리오를 구축, 실행하는 작업을 수행한다.

    두 번째 이유는 클라이언트와 달리 서버는 버그 발생 시 파장이 크다는 데 있다. 클라이언트 프로그램은 문제가 생겨도 다른 플레이어에 영향을 끼치지 않지만, 서버 프로그램 문제는 다른 플레이어에게까지 영향을 끼친다. 한 명의 원인 사용자 때문에 전체나 일부 다수의 플레이어들이 동시에 문제가 발생할 수 있으므로, 서버는 더 신중하게 개발하고, 테스트를 진행해야만 한다.




    만약 버그가 발견됐다면 그 원인을 특정해야 하는데. 클라이언트에서는 이를 즉시 확인할 수 있고, 디버거를 붙여서 원인을 추적하기도 쉽다. 디버거를 쓰면 화면에 나타나지 않는 것들, 즉 화면 뒤에 숨어있는 프로그램의 상세한 데이터와 상태까지 훑어볼 수 있다. 프로그램을 고치고 강제로 재시작을 하더라도 별다른 문제가 발생하지 않는다. 하지만 서버에서는 그렇지 않다.

    서버 개발자들은 자체적으로 모니터링 툴을 만들거나 알려진 것을 가져다 써야만 하는데, 이는 디버거만큼 세세하게 서버의 내부 데이터를 보여주지 못한다. 서버 개발자들도 클라이언트처럼 디버거를 붙여볼 수 있다는 생각을 하지만, 그랬다가는 서버가 멈춰버리게 된다. 디버거를 붙이는 것은 서비스 중이 아닌, 사내 개발 중일 때나 할 수 있는 셈이다. 그는 불행하게도 디버거가 필요한 상황은 사내 테스트 때가 아닌, 실제 출시 후에 더 많이 발생한다고 설명했다.

    이렇다보니 서버 개발자들은 디버거 같은 양질의 툴 대신, 부족하더라도 '차선책'을 택하게 된다. 사소한 행적까지 모두 남은 서버의 기록, 바로 로그를 훑어보는 것이다. 당연히 로그를 전부 볼 순 없으므로, 오동작과 관련된 로그를 추려서 원인을 추정하게 된다. 디버거 같은 툴만큼 확실하진 못하지만, 그나마 최선의 방법인 셈이다.




    배현직 CTO는 현재 거의 모든 상용화되는 게임 서비스가 수평확장된 서버 클러스터에서 작동하고 있고, 수평확장된 서버는 단일 서버보다 훨씬 복잡한 설계를 갖추고 있다고 말했다. 복잡한 설계로 이루어진 만큼, 버그가 발생했을 때 원인을 추적하는 것도 어렵다.

    아이러니하게도 수평확장을 추구한 설계가 역으로 서버에 과부하를 일으키는 경우도 있다. 이때 각각의 서버 기기는 별로 하는 일이 없는데, 서버 클러스터 전체에 걸쳐 게임 플레이 처리가 마치 도미노처럼 기하 급수적으로 지연되기도 한다. 이런 상황에선 서버 댓수를 늘려도 문제 해결에 큰 영향을 주지 못한다. 이러다보니 수평확장 서버 설계는 단순함과 수평확장 유연성 사이에 절충점을 찾아야 한다.



    ■ 그렇다면, 이러한 서버 문제의 해결 방법은? - '프라우드넷2'

    그렇다면 일련의 서버 문제를 해결하려면 어떻게 해야할까. 배현직 CTO는 서버팀과 서버 설계에 불필요한 요소가 있는지 항상 논의하고, 서버팀이 불필요한 요소를 자각하고 단순화할 수 있도록 유도해야한다고 설명했다. 게임시스템과 컨텐츠에 대한 정보가 부족하면, 수평확장을 위한 서버 설계가 복잡해질 수 있다. 이를 미리 방지하기 위해 여러가지 컨텐츠상의 제한 요소를 최대한 알려주는 것이 좋다는 것이다. 그는 서버 설계의 각 요소는 '분명한 이유'가 설명되지 못하면 위험할 수 있으므로, 설명되지 못하는 복잡함은 걷어내고, 단순함을 추구해야 미래가 편해질 수 있다고 강조했다.




    이러한 노력이 있더라도, 가끔은 불가피하게 복잡한 구조의 수평확장 서버 설계가 나오게 된다. 이때 서버팀은 복잡해진 수평확장 서버 설계에 대비해야한다. 문제 발생 시 빠르게 추적할 수 있는 스킬을 갖추고, 이를 위한 강력한 무기 툴을 갖추는 식이다. 배현직 CTO는 이때 활용할 수 있는 강력하고 새로운 툴 중 하나로 '프라우드넷2'가 있다고 소개했다.

    프라우드넷2는 게임 개발자들이 서버를 개발하면서 마주하게 되는 여러 서버 문제에 대해서 빠르게 원인을 찾고, 찾은 원인을 빠르게 해결해줄 수 있는 서버 엔진이다. 프라우드넷2의 '디버그 트레이스' 기능은 디버거를 붙이되 서버는 중지시키지 않는 방식으로 작동한다. 서버가 특정 일을 하는 순간, 그 순간에 서버 내부의 데이터가 어떤 상태인지 상세하게 로그로 남길 수도 있다.


    프라우드넷2에는 '서버메모리 뷰어'라는 툴도 포함되어 있다. 서버메모리 뷰어를 이용하면 게임 서버 안의 메모리 내용을 상세하게 열람할 수 있다. 물론 이를 위해 서버가 일시 정지하거나 느려지는 일 없이 라이브 서비스에서도 열람할 수 있는 것이 특징이다.

    이외에도 서버의 어떤 지점에서 처리량 병목이 있는지 확인할 수 있는 '성능분석 기능', 서버 크래시 발생 시 해당 지점을 디버거 레벨로 남겨 원인을 찾기 쉽게 돕는 '크래시 리포트 기능', 문제의 원인을 찾아 해결한 뒤 즉시 패치할 수 있게 도와주는 '핫리로딩' 기능 등이 포함됐다.

    배현직 CTO는 프라우드넷2를 활용하면 수평확장으로 설계한 서버에서도 로그나 롤링업데이트에 의존하는 것보다 더 빠르게 버그의 원인을 찾고, 해결할 수 있다고 설명했다. 그는 넷텐션의 프라우드넷1이 네트워크와 서버 밑바닥 개발 과정에서 발생하는 다양한 어려움을 해결해주었다면, 이제 '프라우드넷2'가 복잡한 서버 콘텐츠 개발의 어려움을 해결해줄 것이라는 포부를 전하며 발표를 마무리했다.

    넷텐션의 '프라우드넷2'는 오는 2022년 초에 정식 출시될 예정이다. 현재 프라우드넷 홈페이지를 통해 베타 버전의 신청이 가능하며, 정식 출시일까지 누구나 무료로 활용해볼 수 있다.



    댓글

    새로고침
    새로고침

    기사 목록

    1 2 3 4 5