로그인

회원가입 | ID/PW 찾기

취재

[지스타 2021] 넷텐션 CTO 배현직 "서버 안정화는 단순함이 비법"

게임 서버 관리에 도움을 줄 '프라우드넷 2'소개

에 유통된 기사입니다.
김승주(4랑해요) 2021-11-18 21:38:26

서버 크래시, 타임 아웃, 랙(Lag) 현상 등 게임을 하다 보면 종종 에러 창이나 플레이에 곤란을 겪는 현상을 경험한다. 보통 우리는 이런 현상을 한마디로 '서버 문제'라고 말하는데 이런 문제는 왜 생기는 걸까? 어떻게 해결해야 할까?

 

배현직 넷텐션 기술최고책임자(CTO)가 지스타 2021 컨퍼런스를 통해 '더 안정적이고 빠른 게임 서버 개발 방법'에 대해 강연했다. 이번 강연은 ▲게임 서버 아키텍처에는 어떤 종류가 있는지 ​게임 서비스를 오픈했을 때 서버에서 발생할 수 있는 문제 ▲서버 개발자들이 겪는 어려움은 무엇이 있는지 설명했다.

 

그리고 서버 문제로 어려움을 겪고 있을 게임사, 서버 개발자에게 도움을 줄 '프라우드넷 2'에 대해 소개했다. 또한 게임 서버 관리에 전문 지식이 없는 참관객을 위해 쉬운 비유를 더했다. 참고로 프라우드넷은 게임서버 '엔진'이라는 말을 만들 정도로 많은 게임에서 사용 중이다.

 

대표적으로 <마비노기 영웅전> 등의 PC 온라인게임을 비롯해 <세븐나이츠> 등의 모바일게임, 그리고 캡콤의 <스트리트파이터 5>에도 사용될 정도로 개발자들에게는 서버의 성능을 끌어올리는 필수적인 엔진으로 자리잡고 있을 정도. 넷텐션은 2017년 펄어비스에 인수되어 자회사가 되었다.

 

배현직 넷텐션 CTO


# 게임 서버의 구조

 

게임 서버 아키텍처는 크게 정해져 있진 않으나, 게임 장르나 유형별로 유사한 형태를 보인다. 가령 싱글 플레이 기반 RPG는 클라이언트가 로드 밸런서를 공유해 게임 서버 클러스터로 연결되고, 인메모리 캐시 클러스터와 데이터베이스에 정보가 구별되어 저장된다.

여기서 클러스터라는 용어는 다수의 서버를 호칭한다.

게임 서버 클러스터에서는 클라이언트의 요청을 처리한다. 영구 저장해야 하는 요소들은 데이터베이스에 저장된다. 데이터베이스도 여러 서버로 구성된 일종의 클러스터다.

일반적인 게임 서버 아키텍처

실시간 멀티 플레이를 기반으로 한 게임은 아웃 게임 서버와 인 게임 서버로 구분된다. 인 게임 서버는 실시간 정보를 담당한다. 로드 밸런서를 공유하지 않고 곧바로 클라이언트와 연결되는데, 몬스터 사냥 결과와 같이 조금이라도 응답이 느려질 경우 불편함을 야기할 수 있는 정보가 포함되어 있기 때문이다. 인 게임 서버는 지연(레이턴시)을 최소화하기 위해 여러 지역(리전)에 나뉘어 배치되기도 한다.

아웃 게임 서버는 실시간 구성되는 정보 외의 모든 요소를 담당한다. 가령 채팅은 1초 정도 늦더라도, 게임 플레이 경험에 큰 문제를 야기하지 않아 아웃 게임 서버에 포함된다. 

인 게임 서버, 아웃 게임 서버 아키텍처 구조

이보다 복잡한 MMORPG 장르는 다수의 존 서버가 추가로 구성된다. 인 게임 서버와 유사한 존1, 존2 서버가 배치되는 셈이다. 여기에 인 앱 결제, 로그인 통합 시스템 등 다른 시스템이 구성되면 서버 구조는 더욱 복잡해진다.

 

 

# 게임 서버에서 발생할 수 있는 문제

 

먼저 가장 치명적이지만, 빠르게 인지할 수 있는 문제는 '서버 크래시' 현상이다.

말 그대로 연결이 끊어졌다는 메시지와 함께 게임이 종료되는 경우를 말한다. 컴퓨터 프로그램이 갑자기 셧다운되는 경우와 유사하다. 서버도 일종의 프로그램이기 때문에, 내부적으로 건드리면 안 되는 요소를 건드려 프로그램이 종료되는 경우를 말한다. 이 경우는 서버 프로그램이 종료된 것이기 때문에 인지하기 쉽다.

서버 크래시

또 다른 문제는 '서버 무응답'이다. 서버는 멀쩡히자만, 클라이언트에서 보내는 요청을 처리하지 못하는 상태다. 쉽게 말하면 서버가 얼었다고 표현할 수 있다. 유저 입장에서는 인지하기 힘들지만, 타임아웃 관련한 오류 메시지가 여기 포함된다.

서버 무응답

가장 골치 아픈 경우는 서버가 일을 처리하는 것보다, 클라이언트에서 요청하는 일이 훨씬 많은 경우다. 가령 서버가 1초에 10만 개의 정보를 처리하는데, 클라이언트에서 초당 11만 개의 정보를 보내면 초당 1만 개의 정보가 쌓인다. 이것이 누적되면 1초 늦어지던 것이 2초 늦어지고, 결국 몇 분이 지나도록 응답 지연이 발생한다. 

여기까지 오면 사실상 무응답 상태에 빠진다. 캐릭터가 전혀 움직임이 없거나, 한쪽으로만 계속 이동하는 식이다. MMORPG에서는 '모내기 버그'라고 불리기도 한다. 이 문제는 서버 크래시보다 해결 난이도가 높다.

다음은 서버 렉 현상이다. 서버 렉은 서버 무응답 상태와 비슷해 보이지만, 분명한 차이가 있다. 덕분에 서버 팀과 다른 팀과의 커뮤니케이션이 꼬이는 경우가 발생한다. 렉 현상도 서버의 처리량보다 클라이언트의 요구량이 많아 발생하는 것은 같지만, 클라이언트 요구량이 많아졌다, 작아졌다 하는 식이다.

서버 내부 문제로 렉 현상이 발생하기도 한다. 클라이언트나 서버 간 연결에 문제가 생기거나, 먼 지역의 서버와 클라이언트가 매칭되면 통신 기간이 길어져 렉 현상이 발생한다. 렉 현상은 일단 게임 플레이가 가능하단 점에서 서버 크래시 문제보다 시급함이 떨어지긴 하지만, 방치되면 유저 불만이 크게 상승한다.

서버 렉

서버 오동작 현상도 있다. 서버가 다운된 것도 아니고, 응답에 문제가 있는 것도 아닌데 결과값이 이상해지는 경우다. 예를 들어 플레이어 간 아이템 교환을 했는데, 한쪽만 아이템을 받는 식이다. 몬스터를 처치했는데 엉뚱한 아이템이 나오거나, 아이템이 복사되는 문제, 백섭 문제가 여기 포함된다.

이 문제는 프로그래머의 실수로 볼 수도 있지만, 서버의 복잡한 구조로 인해 발생할 수도 있다. 뒤에서 언급한 '수평 확장' 설계를 한 서버의 경우에도 오동작이 발생하기도 한다.

서버 오동작

마지막 문제는 해킹이다. 모든 것이 완벽하지만, 유저가 클라이언트를 해킹해 이를 망칠 수도 있다. 기본적으로 게임 클라이언트에서 발생한 일은 서버가 믿어선 안 된다.

서버 개발자들은 해킹이 들어오더라도 막을 수 있도록 해야 하지만, 쉽지는 않은 문제다. 해킹 원천 차단을 위해선 클라이언트가 하는 일을 없애고, 모든 일을 서버가 담당해야 한다. 그렇게 한다면 서버 유지비용이 천문학적으로 증가한다. 인터넷 품질이 약간만 나빠져도 렉 현상이 크게 늘어나기도 한다. 현실적으로는 매우 힘든 셈이다. 그렇기에 서버 개발자들은 일정 부분 타협하기도 한다.

대표적인 예로 FPS 장르의 '에임핵' 문제가 있다. 에임핵은 보통 서버에서 막지 않고, 클라이언트에서 별도 프로그램을 사용해 차단한다. 유저 입장에선 불편하지만, 에임핵을 서버에서 막는다면 유지비용이 크게 증가하고, 인터넷 회선이 조금만 느려져도 게임에 렉 현상이 발생하는 등 더욱 큰 문제를 겪을 수 있다.


# 서버 문제 대응의 어려움


이를 방지하기 위해 게임사는 서버를 미리 테스트한다. 서버 테스트 커버리지는  ▲유닛 테스트  ▲​사내 테스트  ▲​봇 테스트  ▲​소프트 런칭 네 가지 정도로 나뉜다.

 

아무리 철저한 테스트 과정을 거치더라도 서비스 시작 이후 발생하는 오류를 완벽히 방지하기는 힘들다. 가령 봇 테스트의 경우, AI는 사람과 다르다. 사람이 입력한 대로만 한다. 창의적인 시도를 하기 힘들다.​ 

 

그렇기에 별도로 구성된 QA팀이 각종 창의적인 행위를 해 보고, 이를 봇 테스트 시나리오로 구축하기도 한다. 하지만 게임 론칭 후 QA팀에서 생각했던 영역을 넘어서는 행동이 금세 나타난다.

 

최대한 모든 상황을 가정하더라도, 론칭 후에는 예상치 못한 일이 발생한다

 

또한 클라이언트 문제와 달리 서버 문제는 각 서버에 할당된 클라이언트에 모두 영향을 미치며, 발생을 확인하기 힘들다. 디버거를 사용하기도 어렵다. 디버거를 붙이면 서버에 할당된 클라이언트는 일시 정지된다. 당장 문제가 생기는 것은 아니지만, 서버 프로그램을 고쳐 새로 적용한다면 모든 클라이언트를 재시작해야 한다.

 

수평 확장도 문제가 발생한다. 론칭한 게임들은 보통 수평 확장 방식을 통해 서버를 늘려나간다. 집으로 비유하면 단층 집에 층수를 쌓아가는 식이다. 그만큼 단일 서버보다 복잡해지고, 버그를 찾아내야 할 범위도 넓어진다. 수평 확장을 위한 설계를 고려하더라도, 이 설계가 역으로 과부하를 일으키기도 한다. 일종의 오버 엔지니어링이다.

 

가령 십자로 연결된 사슬을 생각해 보자. 사슬이 단단히 연결되어 있더라도, 가운데 연결된 사슬이 풀리면 나머지 사슬도 네 갈래로 풀려난다. 서버도 같다. 클러스터 하나의 문제가 전체로 퍼진다. 이는 '단일 실패 지점'이라 불린다.

 

따라서 단순함과 완벽함 사이에서 절충점을 잘 찾아야 한다.

 

 

# 단순한 설계, 서버 팀과의 명확한 커뮤니케이션이 중요


이에 배현직 CTO는 서버 팀과의 의견 교환 중요성을 강조했다. 또한 앞서서 언급한 문제를 해결하는 데 도움을 줄 수 있는 툴 '프라우드넷 2'도 소개했다.

 

먼저 의견 교환의 중요성이다. 적절한 커뮤니케이션을 통해 서버 구조를 최대한 단순화하고, 설계에 대한 이유를 물어 불필요한 부분을 서버 팀이 자각하게 도와주는 것이 좋다. 콘텐츠의 상세한 내용과 세부적인 요구 조건으로 서버 팀이 무리하게 복잡한 서버 구조를 설계하지 않도록 할 수도 있다.

 

 



마지막으로, 넷텐션이 새롭게 개발한 서버 엔진 '프라우드넷 2'를 소개했다. 배현직 CTO는 수 년 동안 수백 개의 게임 서버 회사에 프라우드넷을 납품한 노하우를 바탕으로 프라우드넷 2를 개발했음을 밝혔다.

 

게임 서버 회사에 서버 프로그램을 납품하면서 알게 된 문제점은 서버 엔진을 잘 짜더라도, 콘텐츠를 새로이 추가했을 때 발생하는 문제 해결에 어려움을 겪는다는 것이다. 프라우드넷 2는 이런 문제를 해결하기 위해 만들어졌다. 원인을 빠르게 해결하고 조치할 수 있도록 돕는다.

 

가령 디버그 트레이서는 서버에서 디버깅을 해야하는 곳을 알 수 있도록 돕는다. 특정 지점이 실행될 때마다 로그를 남겨 당시 어떤 일이 있었는지 디버거 수준으로 상세히 알 수 있다. 즉, 서버를 멈추지 않고도 문제점을 찾을 수 있도록 돕는다는 것이 배현직 CTO의 설명이다. 

 

서버 메모리 듀얼을 통해 메모리 내용을 상세히 표기해 주기도 한다. 최적화를 통해 라이브 서비스에 영향을 주지 않는 선에서 실시간으로 문제점을 찾을 수 있도록 했다. 성능 분석 기능을 통해 서버 프로그램내에서 어떤 부분이 처리 성능을 차지하는지 분석할 수도 있다. 크래시 리포트 기능도 포함되어 있어, 서버가 크래시나면 자동으로 서버를 재시작하며 어떤 부분에서 문제가 발생했는지 찾을 수 있도록 한다.

 

핫 리로드 기능도 포함되어 있다. 배현직 CTO는 이를 이용하면 동시 접속자를 유지한 상태에서 서버를 수정할 수 있다고 밝혔다. 또한 자동화 기능으로 전체 코딩의 약 80%을 자동화할 수 있도록 함으로써 실수에 민감한 서버 개발자들에게 도움을 줄 수 있다고 설명했다.

 

프라우드넷 2의 정식 출시일은 2021년 말에서 2022년 초로 예정되어 있다. 현재 베타 버전을 신청할 수 있으며, 정식 출시일까지는 무료로 제공될 예정이다. 배현직 CTO는 "수평 확장 서버 설계, 복잡한 서버 콘텐츠를 개발하더라도 발생한 문제를 해결할 수 있는 것"이 목표라고 밝혔다.



최신목록 291 | 292 | 293 | 294 | 295 | 296 | 297 | 298 | 299 | 300