NDC 참관기: 메이플스토리 개발스토리 – 더 잘되는 게임을 위한 라이브 코어 개발

훌륭한 엔지니어인 황의권 군의 발표. 오늘 들은 세 개 세션 중 가장 재밌게 들었다.

내용 요약:

라이브 서비스이기 때문에, 제일 중요한 것은 ‘방어’. 그렇지만 ‘공격적인 업데이트’를 통해서(빅뱅 업데이트) 재탄성 했다. 이를 위해 지속적인 개선과정과 그에 따른 이슈 처리가 필요했다.

  1. 창모드와 해상도 확장

DX8이 화면 주파수 동기화가 안되는 문제. 그리고 일부 고성능 머신의 GPU의 경우, 과부하가 걸리는 문제가 생겼음. 그래서 DX 9으로 이전하고, 잘 점검하고 실험하는걸로 해결.

해상도 확장의 경우 게임 화면, View-port, 툴, 데이터를 변경하는 문제가 있어서 생각보다 일이 컸다고 한다. 의외로 뷰포트를 ‘유저에게 친화적인’ 화면 아래쪽, 상태 표시 줄 쪽에 중심을 두는 방식으로해서 작업량을 적당히 유지할 수 있어다 한다.

  1. 동접 갱신과 이에 따른 서버 부하 관리

우선 장비를 업그레이드. 하지만 32bits OS의 한계로 메모리 제한(2GiB)에 부딪힘. /3GB 플래그로 유저 스페이스를 늘렸더니 kernel I/O 퍼포먼스가 떨어지고, 이로 인해 MS SqlServer 성능문제가 심해서 이 방법은 포기 했다. 그리고 WoWx64의 경우 테스트에 필요한 시간이 모자라서 채택하지 않음(제일 중요한건 ‘방어’). 어떤 의미론 정석대로 코드를 분석해서 메모리 사용량을 줄이는 걸로 대응하고, 메모리 사용량에 따라 ‘동시 접속자 수 제한(대기)‘을 구현해서 해결했다.

  1. 개발 환경 개선과 신규 시스템 추가

다음과 같은 변화를 줌.

  • VC6에서 VS 2008로 이전
  • 락 순서에 대한 Assertion추가1
  • CC.net 을 사용해서 지속적인 빌드를 만듬
  • TBB의 concurrent_hash_map 도입
  • lua 스크립트를 도입

레거시 코드 문제 때문에,

  • VS 6 호환성 옵션 활용
  • (일부 상황에 대해) lock-order assertion을 끄고, 예외를 인정하기로
  • 라이브러리 리뷰/수정 및 일부 사항에 대해선 예외를 인정하고 타협
  1. 의의 및 정리
  • 검증이 중요 (라이브 서비스!)
  • (비슷하게) 실수가 용납되지 않는다

검토가 중요하고, 현재까지 수정한 매몰 비용을 생각할게 아니라, 수정에 따른 총 비용을 생각해야 한다. 특히 남들이 말리는 리팩터링이나 패치 전 자잘한 수정은 금기사항.

정리: 개인의 만족과 조직의 발전 사이의 어떤 지점. 라이브 서비스를 만드는 구성원들에게 ‘더 나아지고 있다’는 느낌을 준다는게 중요하다.

촌평

라이브 서비스의 절대 목표 ‘서비스를 유지’하는 것을 전제로, 어떤 문제를 겪고, 이걸 해결하는 방법에 대한 이유를 잘 설명해 준 것 같다.

내용 요약에 추가할 점, 잘못된 점 등을 지적해주면 매우매우 감사하겠다.


  1. 이건 데드락을 피하기 위한 매우 표준적인 방법이다. ↩︎