11월 4일 패치 노트 — 서버가 커지는 만큼 자동으로 나뉘어요

게임 서버가 컴퓨터의 코어 수에 맞춰 스스로 여러 프로세스로 나뉘도록 바꿨어요. 테스트 환경에서 1,040명이 동시에 지을 때 블록이 친구 화면에 뜨기까지 4.2초 걸리던 것이 0.2초로 줄었어요.

  • 패치 노트
  • 서버
  • 교실
  • 성능

한눈에 보기

지금까지 게임 서버는 프로세스 하나로 모든 반과 방을 돌렸고, 그 프로세스는 컴퓨터 코어를 하나만 쓸 수 있었어요. 측정해 보니 동시 접속 약 500명에서 그 코어가 꽉 찼어요. 이제 서버는 코어 수에 맞춰 스스로 여러 프로세스로 나뉘고, 반마다 가장 한가한 곳에서 돌아가요. 오늘 운영 서버에서는 걸려 있던 CPU 한도(0.5코어)를 풀어 쓸 수 있는 CPU가 두 배가 됐고, 서버 사양을 올리면 설정을 고치지 않아도 자동으로 나뉘어요.

BEFORE / AFTER

반 40개 × 학생 25명 = 1,040명이 동시에 걷고 블록을 놓을 때 (테스트 환경, 8코어 PC) — 프로세스 하나일 때는 CPU가 100%로 포화돼서 친구 움직임이 0.7초마다 끊겨 도착하고, 블록은 4초 넘게 늦게 떴어요. 4개로 나누니 각 프로세스가 절반만 쓰면서 블록을 0.2초 안에 전해요. 1,560명에서도 마찬가지였어요.

서버 부하 비교: 테스트 환경 1,040명 기준 친구 움직임 간격 p99가 702 ms에서 196 ms로, 블록이 친구 화면에 뜨기까지 p99가 4.2초에서 201 ms로 줄어든 막대 그래프

새로 추가 3

  • 서버가 스스로 몇 개로 나뉠지 정해요켜질 때 쓸 수 있는 코어, CPU 한도, 메모리를 읽어서 정해요. 코어가 하나면 예전처럼 하나로, 두 개 이상이면 코어마다 하나씩 나뉘어요. 메모리가 모자라면 그만큼 덜 나눠요.
  • 반을 가장 한가한 곳에 배정해요새 반은 그 순간 가장 여유 있는 프로세스에서 열리고, 그 반의 선생님과 학생은 언제나 같은 곳에서 만나요. 같은 반이 두 곳에서 동시에 열리는 일은 생기지 않게 막아 뒀어요.
  • 부하 측정 도구실제와 똑같이 걷고 블록을 놓는 가상 학생 수천 명으로 서버를 시험할 수 있게 됐어요. 이번 숫자도 모두 이 도구로 쟀어요.

개선 4

  • CPU 한도를 풀었어요운영 서버가 CPU를 0.5코어만 쓰도록 묶여 있던 것을 풀어, 지금 서버의 코어 하나를 다 써요.
  • 하나가 멈춰도 다른 반은 계속돼요나뉜 프로세스 중 하나에 문제가 생기면 그것만 1초 안에 다시 켜지고, 그 반은 저장된 상태에서 이어져요.
  • 업데이트할 때 반이 저장돼요서버가 다시 켜질 때 모든 프로세스가 각자 반을 저장한 뒤 꺼져요. 다시 켜지는 동안 들어온 접속은 끊지 않고 잠깐 기다렸다가 이어 줘요.
  • 비밀번호 잠금, 접속 수 제한은 나뉜 뒤에도 서버 전체에서 하나로 지켜져요.

기술 스택

  • 언어는 그대로 TypeScript(Node.js 22)예요. 클라이언트와 서버가 같은 코드(레벨 생성, 물 흐름, 통신 규약)를 그대로 함께 써요.
  • 멀티프로세스: Node cluster — 앞문 프로세스 하나가 웹소켓 연결을 받아, TCP 소켓 자체를 IPC로 게임 프로세스에 넘겨요. 넘긴 뒤 게임 데이터는 앞문을 거치지 않아요.
  • 방 디렉토리: 방 → 프로세스 배정을 기억하는 할당기(부하 기준 배정, 소켓 인계 수 비교로 안전하게 반납). 나중에 서버를 여러 대로 늘릴 때 Redis로 바꿔 끼울 수 있게 경계를 나눠 뒀어요.
  • 자동 용량 판단: cgroup v1/v2(cpu.max, CFS)와 process.constrainedMemory()로 컨테이너 한도를 읽어요.
  • 저장: SQLite(better-sqlite3, WAL) 한 파일을 모든 프로세스가 같이 써요. 한 반은 한 프로세스만 쓰기 때문에 서로 덮어쓰지 않아요.
  • 배포: Docker Compose + nginx, GitHub Actions(테스트를 통과해야 배포). 운영 지표는 서버 안에서만 보이는 /metrics(CPU, 이벤트 루프 부하, 지연, 메모리)로 봐요.

알려진 문제 2

  • 이미 열려 있던 교실 탭은 업데이트 뒤 한 번 자동으로 새로고침될 수 있어요. 새로고침하면 같은 반, 같은 자리로 돌아와요.
  • 오늘 운영 서버는 코어가 하나라 아직 하나로 돌아가요. 서버 사양을 올리면 다시 켜는 것만으로 나뉘어요.