IMF를 전후로 국내 게임업계에 ‘온라인 게임’이라는 새로운 조류가 급부상하기 시작했다. 특히 온라인 롤플레잉 게임은 전국의 게임방 열풍과 정부의 IT지원 정책에 힘입어 양적, 질적으로 급격히 성장했다. 온라인게임은 싱글플레이 게임에서는 맛볼 수 없었던 요소가 있다. 바로 사람들끼리의 협력과 경쟁이다. 온라인게임 세상은 마치 사회 축소판과 같기 때문에 어떤 게임보다 감정이입이 강하다. 온라인게임 개발에서 중요한 것은 서버 플랫폼이다.
현재 온라인게임 전신인 머드게임(MUD Game)의 서버 플랫폼은 선(Sun)사의 Solaris 혹은 HP/UX 등 유닉스 플랫폼(UNIX Platform)이 대부분이었다. 이후 리눅스 바람과 월드와이드웹(WWW) 열기에 힘입어 리눅스 기반 서버 개발이 널리 연구되고 사용되기 시작했다.
온라인게임 서버는 크게 리눅스 서버와 윈도 서버로 구분된다. 리눅스 서버와 윈도 서버의 장단점을 비교해보고 최근 각광받고 있는 리눅스 서버의 기술 동향에 대해 살펴본다.
◇리눅스 플랫폼=리눅스의 장점이라면 무엇보다 무료라는 점과 모든 소스가 공개되어 있다는 점이다. OS의 구조나 운용 자체가 투명하게 공개돼 있기 때문에 시스템의 깊은 부분까지 핸들링해야 하는 서버 개발자에게는 더 없이 좋은 환경이다. 또한 많은 서버 개발자들은 실제로 서비스를 하게 되는 머신(Machine)에 설치된 OS가 자신이 제작한 게임 서버의 전용 OS처럼 동작하기를 희망한다. 온라인게임 개발자의 경우, OS에서 필요없는 부가기능을 다 제거하고 오직 게임 서버 동작을 위한 기능만을 원하는 경우도 많다. 이는 속도 측면에서도 빨라지지만, 혹시나 발생할지 모르는 오류를 최소화하기 위한 노력이기도 하다. 이 때문에 윈도의 GUI 환경 자체를 낭비라고 생각하는 경우도 있다. 실제 서비스가 이루어지는 서버는 원격으로 접속, 작업만 가능하면 될 뿐 상대적으로 콘솔 모드보다 많은 시스템 자원을 요구하는 GUI 환경은 사용되지 않는 경우가 많다. 때때로 리눅스 환경에서도 편의를 위해 X윈도 위에서 개발하는 경우도 있지만, 실제 서비스할 때는 콤팩트하게 설치된 서버에서 게임 서버만 동작할 수 있는 최소한의 환경을 만드는 경우가 많다. 그러한 면에서 볼 때 시스템의 아주 미세한 부분까지 오픈돼 있어 개발자가 직접 튜닝이 가능한 리눅스 시스템은 성능과 안정성 면에서 많은 장점이 있다.
이제 단점 부분을 살펴보자. 사용상의 까다로움과 같은 불편함은 단점이 될 수도 있다. 그러나 이부분은 적응만 잘하면 오히려 편하다고 생각하는 경우도 있기 때문에 논의 대상이 아니다라고 본다. 하지만 개발하면서 느낄 수 있는 리눅스 및 유닉스 시스템의 결정적인 문제점은 바로 네트워크 게임 서버로서의 핵심 부분인 소켓(Socket) 처리 부분에 있다. 리눅스에서 서버 개발을 하려면 가장 기본적인 방식이 셀렉트(select), 폴(poll)을 이용한 폴링(polling) 방식이라 할 수 있다. 이 방식은 BSD 소켓에서 다수의 접속을 처리하는 방법으로써 가장 보편적이고 쉬운 방식이기 때문에 지금까지도 많이 사용되고 있다. 그림1 참조, http://chonga.pe.kr 참고
하지만 폴링 방식은 그 설계 특성상, 하나의 데이터 수신 여부를 검사하기 위해 전체 소켓 디스크립터를 처음부터 끝까지 검사해야 하는 방식을 취하고 있다. 예전처럼 하나의 게임에 수십명에서 많아 봐야 백여명이 존재하던 머드 게임들에서는 큰 문제가 없었다고 얘기할 수 있다. 하지만 점차 게임의 규모가 커지고, 지금처럼 최소한 몇 백명에서 많게는 수천명 이상을 처리해야 하는 온라인게임 서버로 사용하기에는 필요없는 성능 낭비가 두드러지게 발생하게 된다. 마치 전화번호부에서 특정 사람을 찾기 위해 가, 나, 다로 정렬된 간편한 인덱스(Index)를 사용하는 것이 아니라 처음부터 끝까지 훑어야 한다는 문제점이 있는 것과 같은 이치다. 그 숫자가 몇십명 정도이면 큰 문제가 되지 않지만, 수백명, 수천명 이상으로 늘어나기 시작할 때는 성능상의 쓸데없는 낭비가 심해지게 된다.
웹 서버, 혹은 DB 서버처럼 서로 간의 클라이언트끼리의 상호작용이 거의 없다면 클라이언트당 하나의 스레드(Thread)를 만들거나, 혹은 스레드 풀을 충분히 활용한다 던지하는 방법으로 충분히 해소가 가능하다. 하지만 클라이언트들끼리의 상호작용이 극단적으로 많은 온라인게임에서는 위의 방법은 오히려 좋은 방법이 되지 못할 수 있다. 그래서 많은 개발자들은 위에서 언급한 문제들을 해결하기 위해 실제로 제작을 할 때는 접속을 받는 접속단을 여러 개의 프로세스로 병렬 처리하고, 중간에 게이트웨이(Gateway) 등을 거쳐서 실제 게임 프로세싱(Processing) 서버를 따로 두는 방식을 사용하기도 했다. 하지만, 그런 방법은 제작도 복잡하고 설치 및 유지 보수 역시 손이 많이 가기 때문에 최근에는 그렇게 사용하는 예가 줄어들고 있다.
다음은 스레드 관련 내용이다. 원래부터 유닉스 자체는 싱글 스레드(싱글 프로세스)를 염두에 두고 만들어진 운용체계이기 때문에 멀티 스레딩의 지원이 불충분한 경우가 많다. 실제로 리눅스의 경우에는 스레드의 기본 개념인 가벼운 과정(lightweight process)과는 달리 실질적으로는 하나의 독립된 프로세스에 가까울 정도로 무겁다. 멀티 스레딩으로 사용할 때 실제로 생성된 스레드 외에도 각각의 스레드들을 관리해주는 별도의 스레드 역시 발생하기 때문에 OS에 주는 부담도 클 수 있다. 하지만, 어디까지나 개념적인 내용이고, 실제로 리눅스에서 멀티 스레딩 서버를 개발하고 운용해 오면서 그다지 큰 문제는 겪어 본 적이 없기 때문에 치명적인 단점이라고는 할 수 없을 것 같다.
◇윈도 플랫폼=이제 윈도 서버 플랫폼에 대해 살펴보자. 유닉스 환경에서만 오랫동안 일을 하다가 우연한 기회에 윈도 서버로 개발 플랫폼을 바꾸게 됐고, 그곳에서 서버를 개발하면서 IOCP를 이용한 환경에서 작업한 경험이 있다. 이러한 개발환경 전환 과정에서 느꼈던 장단점은 다음과 같다.
단점으로는 역시 리눅스나 FreeBSD에서 OS 자체를 미세하게 조절할 수 있었던 것과는 달리 실제로 게임 서버만을 동작시키기에는 불필요한 다른 기능들과 자원들이 소모된다는 점이다. 여러 가지 기능들이 동작하고 다른 서비스들이 많이 있다는 것은 그만큼 사용하기가 편리할 수는 있겠다. 하지만, 시스템상의 오류가 발생할 수 있는 소지가 많고, 외부에서의 악의적인 공격들에 대해서 그만큼 공격당할 구석이 많아진다. 그렇지만, 최근에 와서는 MS의 지속적인 보안 강화 노력 등과 군살 줄이기 노력 등으로 인해 크게 염려할 수준은 되지 않는 것 같다. 실제로 윈도서버 2003 같은 경우에는 상당히 콤팩트 하게 구성되어 있다는 개인적인 생각이다. 그 외에도 상대적으로 비용이 비싸다는 단점도 있다. 중소 개발사의 경우는 결코 무시하지 못할 부담으로 작용하기도 한다.
이제 윈도에서 개발을 할 경우의 장점을 살펴보자. 무엇보다 사용상의 편의점이다. 비주얼 스튜디오로 대변되는 강력한 개발 도구부터, 수많은 벤더에서 제공해주는 다양한 유틸리티들과 편리한 사용 환경 덕분에 처음 개발을 하게 되더라도 그만큼 빨리 익숙해지며, 정보를 얻기도 비교적 쉽기 때문에 개발하는데 있어서 그만큼 많은 이득을 가지고 출발한다고 생각한다.
다음으로는 가장 중요한 게임 서버로서 윈도서버가 제공해주는 강력한 기능인 IOCP를 꼽을 수 있다. 물론 IOCP 자체는 여러가지 용도로 사용될 수 있지만, 네트워크 처리 부분에 사용하게 될 때 폴링방식이 아닌 이벤트 드리븐(Events Driven) 방식으로 클라이언트들에서 오는 데이터를 커다란 성능 손실없이 처리해주는 것 역시 기존 BSD 소켓의 select, poll 등에 비교해 볼 때 확실한 장점으로 꼽을 수 있다. 그리고 윈도NT 기반이 멀티 스레딩 환경을 염두에 두고 개발된 환경이라 스레딩에 대한 지원이 잘 되어 있고, 그 기반에서 작동되는 IOCP는 다중 CPU 환경에서 머신의 능력을 최대한 이끌어낼 수 있는 설계라고 생각한다. 때문에 최근에는 수많은 게임 개발사들에서 윈도 플랫폼에서 개발을 하고 있으며, 많은 상용 게임들 역시 그 기반에서 작성되고 운용되고 있는 실정이다. 물론 몇가지 변수가 있고 게임에 따라 달라지긴 하겠지만, 실제로 상용화됐고 성공한 많은 게임들이 적절한 스레딩 처리와 IOCP의 장점을 십분 활용하고 최근에 나오는 강력한 다중 CPU 머신을 활용하는 경우가 많다. 기존에 커다란 필드를 여러 개의 분산 서버로 나누어 처리했던 것을 하나의 머신에서 하나의 서버 인스턴스(Instance)로 처리하고 있는 것이다.
◇ 최신 동향에 기울여야=앞서 얘기했던 두 플랫폼에서 서버 개발을 할 때 존재하는 장단점들을 해결하기 위한 쉼 없는 노력을 위하여 지금도 개발자들은 밤을 지새우고 있을 것이다. 리눅스에서 RTS(Real Time Signal), /dev/epoll 방식 등이 그 예다. 아직까지는 실제로 서비스되는 게임들 중에 위 방식으로 제작되었다는 구체적인 사례는 알려져 있지 않다. 그러나 사용 사례들이 많아지고 개발 노하우 공유가 크게 이루어진다면 이제 대형 온라인 게임 서버로서 리눅스 플랫폼도 충분히 주목받을 수 있는 기회가 올 것이라고 생각한다. 또한 윈도 플랫폼에서도 서드 파티에 대한 좀더 적극적인 지원이 이루어진다면 세계적인 온라인게임 서버기술력을 보유한 우리로서는 다양성에 고민하지 않을 수 없을 것이다.
peostar@gravity.co.kr
<필자 약력>김상근
◇현대전자 소프트웨어연구소 책임연구원
◇고려대학교 전기전자공학부(인공지능전공) 박사
◇아라아이디시 기술이사
◇이노리소프트 대표이사
◇그라비티 기술이사 및 연구소장