게임빌 엔진과 10배의 시작
게임 서버 엔진 게임빌을 소개하고, 0.9 알파부터 정식 1.0까지 버전별 대규모 성능 테스트 수치를 보여준다. 코드를 몰라도 설명 가능한 결함·다이어트·최적화 주제만 추려 약 1년간의 리팩토링 경험을 풀어낼 것임을 예고한다.
경량 스레드인 파이버들이 유저·방처럼 서로 관계를 맺을 때, 일반 큐로 처리하면 서스펜드 상태가 꼬여 두 파이버 상태를 신뢰할 수 없게 된다. 파이버 채널과 파이버 리스트릭터로 잘못된 관계를 예외로 드러내 하나씩 추적·수정했다.
게이트웨이 노드에서 패킷마다 ConcurrentHashMap의 겟 패킷 파서를 4회씩 호출하던 '고지혈증' 코드를 다룬다. 세그먼트 단위 락 경합을 유발하던 이 코드를 파서 스태틱화와 최초 접속 시 1회 호출로 리팩토링해 통신 경로의 병목을 제거했다.
스레드마다 노드 정보 관리자를 두면 락이 필요 없다는 단순한 발상이 낳은 결함이다. 1600개 노드가 서로 정보를 교환하며 유휴 CPU가 20%까지 치솟자, 프로세스당 하나의 관리자와 델타 값만 교환하는 원자적 리스트 교체 구조로 재설계했다.
CPU 스틸 타임(SD), 물리 서버 클럭 차이, VM 구성 차이로 같은 스펙 VM도 성능이 달라진다. 유저·방 개수만 보던 단순 로드 밸런싱이 쏠림을 일으키자, 노드 정보 관리자가 각 VM 상태와 처리 속도를 반영하도록 알고리즘을 고도화했다.
프로토콜 헤더의 과한 필드와 비대한 노드 인포를 줄이고, 수십 바이트 문자열 아이디를 4~8바이트 정수로 바꿨다. 프로토콜 버퍼의 지그재그 인코딩 특성까지 고려해 값을 최적화하며, 통로를 넓히는 작업과 메시지 크기를 줄이는 작업을 병행했다.
퓨처 관리용 HashMap을 ArrayList로 바꿔 해싱·박싱을 없애고 O(1) 접근만 수행하도록 했다. ConcurrentLinkedQueue의 이중 루프 CAS 연산을 사이즈 기반 처리로 개선하고, 불필요한 스레드 로컬 스토리지 접근도 멤버·매개 변수 전달로 대체했다.
꼬인 섬유 등 결함 수정과 다이어트로 0.10에서 약 2.5배, 비좁은 통로·락프리·VM 함정을 잡은 정식 1.0에서 0.9 대비 11.5배 향상을 이뤘다. '정말 10배인가'라는 질문에 '아니요, 11.5배입니다'라고 답하며 발표를 마친다.