개발 기록 목록

마비노기 서버 이야기

안녕하세요 매드포순대입니다.


마비노기의 게임서버 이야기 그 첫 번째 시간!

싱글 스레드와 멀티 스레드에 관해 이야기를 해보려고 합니다.

먼저 설명과 이해를 돕기 위해 적절한 예시를 들어보도록 하죠!


우리는 스타트업 회사에 다니고 있고, 어제 새로운 프로그램 개발 요청이 들어왔습니다.

손님에게 요청이 오면, 순대를 하나 나눠주는 프로그램인데

프로그램 이름을 "순대"로 짓고, 손님에게 순대를 나눠주는 데 걸리는 시간은 1초로 설정하였습니다.

이때, "순대" 프로그램을 사용하여, 10명의 손님에게 10개의 순대를 나눠주는 데 걸리는 시간은 얼마일까요

혹시 정답을 아시겠습니까?

이 문제의 정답은 "순대"가 멀티스레드 기반으로 개발되었는가에 따라 답이 여러 개가 될 수 있습니다. 


구분

싱글스레드

멀티스레드(10 스레드)

스레드 개수

1

10

소요시간

10

1.xx


네 그렇습니다. 소요 시간을 보고 유추할 수 있듯이

싱글 스레드와 멀티 스레드의 가장 큰 차이점은, 멀티 스레드는 병렬처리가 가능하다는 점입니다.

그렇다면 현재 마비노기 게임서버는 싱글 스레드일까요? 멀티 스레드일까요?

예상하셨다시피 현재 마비노기의 게임서버는 싱글 스레드 기반으로 제작이 되어있습니다.

서드파티 모듈과 클라이언트의 패킷의 입출력을 담당하는 부분은, 멀티 스레드 기반으로 되어있지만

실제 클라이언트의 요청을 처리하는 게임로직 스레드는 싱글 스레드로 되어있습니다.

때문에 나의 클라이언트가 요청한 패킷이 서버에서 처리되려면, 앞서 요청 온 모든 패킷이 먼저 처리되기를 기다려야 합니다. 

따라서 한꺼번에 클라이언트의 요청이 몰리게 되면, 서버에서 병목현상이 발생하고

이에 따라 흔히 알고 있는, 렉 현상을 경험하시게 되는 것입니다.


이터니티 프로젝트를 진행하면서 위 이슈에 대해 많은 논의를 진행했고

결론적으로는 게임 로직 스레드를 멀티 스레드로 변경하는 작업을 진행하기로 하였습니다.

그래야만 병목 현상을 최소화할 수 있다고 판단했습니다.

위 표에서 "순대"를 멀티스레드로 개발했을 때  소요시간이, 왜 1초가 아닌 1.xx초 일까요?

수학적으로 계산해 본다면 스레드의 개수가 N개가 될 때, 프로세스의 퍼포먼스도 N배가 되어야 하지만

현실에서는 그렇지 않습니다. 하드웨어/소프트웨어적 한계가 존재하기 때문입니다.

하드웨어의 한계는 CPU의 성능을 뜻하기 때문에 따로 설명하지 않고, 소프트웨어적인 한계만 설명해 드리도록 하겠습니다.

멀티 스레드 환경에는 스레드 간 메모리 영역을 공유하는 "임계영역"에 접근할 때, 대기 시간이 발생합니다. 

때문에 1초가 아닌 1.xx초가 되는 것 입니다.

대기 시간이 발생하는 이유는 다음과 같습니다.

다시 "순대"로 예를 들어보자면, "순대"의 임계영역은 "순대 10개가 놓인 접시"입니다.

여러 개의 스레드가 접시에서 동시에 순대를 가져가려고 한다면

순대가 찢어지거나, 순대가 3개가 남아있는 줄 알았는데 알고 보니 2개만 남아있다거나 하는 등의

"동기화 오류"가 발생할 수 있습니다.

그 때문에 이를 방지하기 위해, 프로그래머가 직접 "동기화 오류" 방지 코드를 작성해 주어야 하고

이 코드는, 먼저 접근한 스레드가 일을 마칠 때까지 다른 스레드를 대기시키는 역할을 하므로

대기시간이 발생하는 것입니다.


마비노기 콘텐츠의 필드레이드를 예시로 "임계영역"을 추가로 설명 드리겠습니다.

모쿠르칼피에게 수많은 스킬이 난무하고 있습니다.

이때 모쿠르칼피의 생명력 수치가 "임계영역"으로 처리되어야 합니다.

싱글 스레드에서는 순차적으로 스킬이 처리되므로 따로 추가 처리가 필요 없었지만

멀티 스레드에서는 다수의 스레드에서 모쿠르칼피의 생명력 수치를 감소시키는 상황이 발생하므로

추가 처리가 필요한 것입니다.


예시처럼 마비노기 게임서버 코드에는 "임계영역"이 무수히 많이 존재하고 있는데요.

멀티 스레드 환경으로 전환한다는 것은, 이 모든 "임계영역"에 "동기화 오류"가 발생하지 않도록

코드를 전면 수정해야 한다는 뜻이기에 많은 노력과 시간이 필요한 작업입니다.

그러나 밀레시안 분들께 지금보다 더 쾌적한 에린 환경을 마련해 드리는 것이

저희 개발팀이 해야 할 일이란 것을 잘 알기 때문에 최선을 다해 노력하겠습니다. 많은 응원 부탁드립니다.

긴 글 읽어주셔서 감사드립니다!


감사합니다.

안녕하세요 밀레시안 여러분.
왜 에린에는 순대가 없을까요? 하핫...

링크 복사