LOGIN • JOININ

extreme STABILITY

서버엔진에 있어 안정성이란 매우 중요합니다. 서버엔진에서의 안정성 강조는 몇번을 해도 과하지 않을 것입니다. 또 기능 위주의을 핵심으로 하는 클라이언트 엔진들과 달리 서버엔진은 다양한 범위와 영역으로 제공해주어야 합니다.


Stability.png



1... 다운당하지 않는 꿈의 서버

안정성은 서버에 있어서 생명과 같은 정도로 매우 중요한 요소입니다. 

 하지만 아쉽게도 소프트웨어적인 사소한 실수로도  'Access Violation'이나 'Divide by zero'와 같은 서버를 한번에 비정상 종료시킬 수 있는 오류들이 발생할 수 있습니다.
 아무리 철저하게 디버깅을 하고 조심한다해도 실제 서비스에 들어가게 되면
느닷없이 이런 오류들은 발생할 가능성은 항상 존재합니다. 
 늘 추가와 변경을 해야하는 게임서버의 경우 항상 이런 위험에 노출될 수 밖에 없습니다.


이런 무상태 서버 즉 웹서비스와 같은 경우에는 대체작동(Fail-Over) 시스템을 구축해 어느 정도 대비할수 있지만 상태를 가지는 게임 서버일 경우는 단순히 대체 작동 시스템으로는 해결할 수가 없습니다.
서버가 비정상 종료하게 될 경우 게임 정보 혹은 사용자 정보의 손실과도 연결될 수 있기 때문입니다.

 하지만 많은 서버들은 시스템이 비정상 종료를 맞게 되더라도 단순히 덤프(Dump)만 남길뿐 강제 종료되어 버리는 것이 일반적이고  수많은 서버들은 이런 시스템의 다운의 위험을 감수 한 체 서비스 되고 있는 경우가 많습니다.

CGCII는 이런 오류로 인해 시스템 전체가 다운되는 것을 관리해 줍니다.
'Access Violoation'이나 'Divide by  zero'와 같은 비정상 종료를 유발하는 오류가 발생하더라도 덤프를 남기고 오류가 발생한 처리만 롤백한 후정상적인 동작 시키는 것이 가능합니다.


1) 한 예외 보장과 예외 처리 (Strong Exception Guarantee and Exception Handling)

CGCII엔진은  강한 예외 보장(Strong Exception Guarantee)를 제공합니다.

CGCII는 오류가 발생하더라도 어떠한 스트레스나 메모리 릭 등을 발생시키지 않는 기본적 예외 보장(Basic Exception Guarantee)는 물론 오류 발생 시 롤백이 가능한 강한 예외 보장(Strong Exception Guaratee)를 보장해줍니다.
이는 서버에서 오류가 발생시에도 해당 처리만 롤백 후 계속 정상 처리가 가능하게 해주거나 안정적인 종료를 할수 있도록 해줍니다.

2) 예외 제어 (Exception Control)

 만약 소프트웨어적인 버그(Access Violation, ...)나 예외(Divide by Zero) 혹은 하드웨어적인 오류 등으로 인해 비정상 종료 되어야 할 상황에 처하게 된다면 일반적으로는 Dump를 남기고 느닷없이 서버가 다운되어 버립니다. 

 하지만 CGCII의 경우 시스템이 다운될 경우에도 SEH(Structured Exception Handling)과 C++ Exception처리를 연계해 오류에 대한 덤프(Dump)를 남겨 추후 디버깅이 가능함은 물론 일반적인 C++ Exception과 동일하게 처리해 오류난 부분만을 롤백한 후 서버를 계속 동작시키거나 혹은 안전하게 종료할 수 있도록 해줍니다.




2... 안정성(Stability)

안정성이란 간단하게 서버의 동작 중 오류를 발생하지 않는 것을 의미합니다.

너무나 당연한 것이라고요? 하지만 다중 쓰레드환경에서 많은 접속자들을 처리해야하는 서버의 환경에서는 그렇게 쉬운 것만은 아닙니다. 또 실제 이런 문제로 인해 어려움을 겪는 경우가 매우 많습니다.

 서버는 특성상 구현에 오류가 있거나 잘못처리한 것이 있다해도 바로 문제가 되지 않아 인지를 못하는 경우도 상당히 많아 제대로 예외처리를 하지 않더라도 테스트를 할때는 별 문제가 발생하지 않는 경우가 많습니다.

 그러나 실제 서비스에서 많은 부하가 몰리게 되면 비로소 이런 문제들이 드러나게 시작합니다.

 부하가 증가하면 매우 낮은 확률의 오류조차 그 확률이 기하급수적으로 높아져 낮은 부하에서는  1조분에  1정도도 안되는 낮은 확률의 문제도 실제 서비스에서는 매우 빈번히 나타나기도 합니다.

 특히 다중쓰레드 환경에서 동작하는 아주 미묘한 동기화의 오류로 인해 문제가 발생하는 문제로부터  엔진 코어의 안정성을 확보하기란 더더욱 쉬운일이 아닙니다.

 CGCII는 오랜 개발과 서비스 경험 그리고 다양한 테스트를 통해 아주 기본적이고 당연한 기능이지만 기능과 동작에 대한  안정성을 제공합니다.


1) No Stress, No Leak

무오류성과 안정성의 가장 기본은 동작 중 서버에 스트레스를 쌓지 않아야 한다는 것입니다.

서버가 지속적으로 동작하게 되면 미세하게라도 메모리 릭을 발생시키는 경우가 많습니다.
이럴 경우 이 메모리릭이나 스트레스들이 누적되어 연속적으로 서비스하기 힘들게 될수도 있습니다.


2) 자동적 동적 메모리

CGCII에서는  참조계수와 RAII(Resource Acquisition Is Initialization) 등을 통해 동적할당 객체 관리의 자동화를 지원해 줍니다. 또 이런 동작들은 모두 다중 쓰레드 환경에서도 안정적으로 동작하도록 설계되었습니다.

NEW<T>, CGPTR<T> 등 제공해주는 기능을 사용하면 동적 할당한 객체가 언제 할당해제되는지에 대해서 굳이 신경쓰지 않아도 자동적으로 할당해제처리가 수행됩니다. 

또 예외의 발생으로 인한 메모리의 누출 등도 막아 주는 '기본  예외 보장(Basic Exception Guarantee)'은 기본적으로  제공해줍니다.


3) 부하조정 및 작 안정성 (Load Balancing and Stability)

서버의 부가는 접속자 수에 산술적으로 비례하지 않습니다.
부하가 가중될수록 부하가 부하를 발생시키는 악순환으로 인해 부하량을 더욱 유발하는 경우가 많기 때문입니다. 
어느 정도까지는
부하의 증가가 아주 미미한 수준이다가도  어느 정도의 선을 넘어서면 기하급수적으로 가중되는 경우가 많습니다. 

또 부하가 증가하게 되면 처리의 쏠림 현상으로 인해 상황을 더욱 악화시키기도 합니다.

CGCII는 락프리(Lock-Free)처리, 루핑의 최소화,  캐쉬 적중률 최적화 처리, 부하 적응형 알고리즘 채택 등 다양한 방법을 통해 이런 문제를 향상시켜 왔습니다. 


4) 훅 함수의 짝 호출 보장 (Pairing Guarantee of Hook function)

프레임웍을 제공해주는 서버 엔진의 경우 다양한 콜백함수나 훅함수들을 제공해줍니다.  
또 이 콜백이나 훅함수들에 있어 짝지어 처리되어야할 함수의 보장은 매우 중요합니다. 

예를 들어 소켓이 접속되었을 때 호출되는 OnConnect()함수가 호출되어 정상적으로 처리가 되었다면 어떠한 상황에서도 접속이 해제될 때는 OnDisconnect()가 호출되는 것을 보장해 주어야 합니다. 

이것은 마치 생성자가 호출되었으면 소멸자도 호출되어야 하는 것과 동일한 것입니다. 

OnConnect()/OnDisconnect()뿐만 아니라 Group시스템에서 OnMemberEnter...()함수와 OnMemberLeave...() 등 다양한 짝지어진 함수들이 존재합니다.