한국어English日本語简体中文繁體中文DeutschไทยTiếng ViệtРусскийPortuguês (Brasil)EspañolBahasa Indonesia

게임 렉 백서 › 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 멈춤이나 락 경합 쪽
확인 수단
게임 서버·클라이언트의 로그·지표가 필요

출처

  1. Designs, Lessons and Advice from Building Large Distributed Systems Google
    LADIS 2009 기조연설(Jeff Dean). 같은 데이터센터 안 왕복 약 0.5ms(500,000ns)
  2. ASP.NET Core Best Practices Microsoft
    데이터 접근·I/O·오래 걸리는 작업은 비동기로 호출, 동기 블로킹 호출은 스레드 풀 고갈과 응답 지연을 부름
  3. Demonstrations of offcputime, the Linux eBPF/bcc version IO Visor
    스레드가 멈춰 CPU를 떠난 시간(off-CPU)을 호출 스택별로 합산, -p로 프로세스 지정

함께 보면 좋은 원인

같은 층: L9 서버 게임 프로세스

같은 증상(멈춤)의 다른 층 원인

그림과 실험이 있는 원본 카드 보기