게임 렉 백서 › L9 서버 게임 프로세스
게임 스레드의 동기 호출 Synchronous DB / file I/O on the game loop
원인 ID sp-sync-call · 주 담당 게임개발팀·서버 개발
그림과 실험이 있는 원본 카드로 열기 →
틱 도중 DB 응답이나 파일 쓰기를 기다리면, 그 시간만큼 서버의 게임 진행 전체가 멈춥니다.
왜 틱 안에서 DB 조회·저장, 로그 쓰기, 외부 API 호출을 기다림 → 그러면 DB가 100ms 걸리면 틱도 100ms 멈춤 → 화면에서는 DB·디스크가 느려질 때마다 필드 전체가 멈칫
- 증상
- 멈춤, 뚝뚝 끊김
- 요인
- 정체
- 누가 겪나
- 특정 장소·채널, 서버 전체
- 언제
- 특정 행동을 할 때, 가끔 무작위로
- 담당
- 주 담당 게임개발팀·서버 개발
- 게임개발팀 할 일
- 느린 일(DB 조회·저장, 로그 쓰기, 외부 API 호출)은 모두 비동기로 넘기고 결과는 다음 틱에 반영(타임아웃만 두면 기다리는 동안은 여전히 멈춤).
- 수치 감각
- 같은 데이터센터 DB 왕복 0.5ms도 한 틱에 100번 부르면 50ms. 20틱 예산을 혼자 다 씁니다.
- 그래프에서는
- 가끔 무작위로 튐 · 서버 틱 시간, DB 쿼리 지연
- 확인할 곳
- 틱 시간 그래프와 DB 쿼리 지연(slow query log 등)·디스크 지연을 같은 시간축에 놓고 봄. 틱 지표가 없으면 bcc offcputime -p로 게임 스레드가 어디서 기다리는지
- 이러면 맞음
- 틱이 튄 시각이 DB·파일 지연이 튄 시각과 겹치고 게임 스레드의 대기 시간이 DB 응답 수신·파일 쓰기 호출 스택에 몰려 있음
- 이러면 아님
- DB·디스크 지연이 조용한데 틱이 튀면 GC 멈춤이나 락 경합 쪽
- 확인 수단
- 게임 서버·클라이언트의 로그·지표가 필요
출처
- Designs, Lessons and Advice from Building Large Distributed Systems Google
LADIS 2009 기조연설(Jeff Dean). 같은 데이터센터 안 왕복 약 0.5ms(500,000ns) - ASP.NET Core Best Practices Microsoft
데이터 접근·I/O·오래 걸리는 작업은 비동기로 호출, 동기 블로킹 호출은 스레드 풀 고갈과 응답 지연을 부름 - Demonstrations of offcputime, the Linux eBPF/bcc version IO Visor
스레드가 멈춰 CPU를 떠난 시간(off-CPU)을 호출 스택별로 합산, -p로 프로세스 지정
함께 보면 좋은 원인
같은 층: L9 서버 게임 프로세스
같은 증상(멈춤)의 다른 층 원인
그림과 실험이 있는 원본 카드 보기