게임 렉 백서 › 일부에게만 생기는 문제
특정 캐릭터의 데이터가 비대함 One character with oversized data (inventory, mail, buffs)
원인 ID pt-heavy-char · 주 담당 게임개발팀·서버 개발 · 함께 인프라팀·DB 인프라
그림과 실험이 있는 원본 카드로 열기 →
아이템·우편이 수천 개 쌓였거나 친구·차단 목록, 버프가 유난히 많은 캐릭터는 접속하고 저장하고 주변에 알릴 양이 남보다 몇 배 큽니다. 회선과 상관없이 그 캐릭터로만 느립니다.
왜 오래 키운 캐릭터나 이벤트 보상이 인벤토리·우편함에 수천 개 쌓임 → 그러면 접속·지역 이동·저장 때마다 그만큼 DB를 읽고 쓰고 주변에 보낼 장비·버프 정보도 큼 → 화면에서는 그 캐릭터만 입장 로딩이 길고 인벤토리·우편을 열 때 멈칫. 저장을 게임 스레드에서 기다리는 서버라면 주변 사람까지 잠깐 멈춤
증상 접속 불가·무한 로딩 , 입력 지연 , 멈춤
요인 정체
누가 겪나 나만, 특정 기능만
언제 접속·점검 직후, 특정 행동을 할 때, 이동 중·지역 전환 때
담당 주 담당 게임개발팀·서버 개발 · 함께 인프라팀·DB 인프라
게임개발팀 할 일 인벤토리·우편 보관 한도와 오래된 우편 자동 정리, 필요한 부분만 나눠 불러오기, 저장은 바뀐 부분만 게임 스레드 밖에서.
인프라팀 할 일 느린 쿼리 로그에서 같은 캐릭터로 반복되는 느린 조회를 찾아 게임팀에 전달, 아이템·우편 행 수가 많은 캐릭터 상위 목록 제공.
수치 감각 아이템 한 개가 DB 한 줄이라면, 아이템 5,000개짜리 캐릭터는 접속할 때마다 5,000줄을 읽습니다. 평범한 캐릭터의 수십 배입니다.
그래프에서는 일부만 높음 · 캐릭터별 접속·저장 시간, 캐릭터별 DB 조회 행 수
확인할 곳 DB의 느린 쿼리 로그(MySQL slow query log, PostgreSQL log_min_duration_statement)에서 같은 캐릭터 ID로 반복되는 느린 조회·저장을 찾고, 아이템·우편 테이블의 캐릭터별 행 수 상위 목록을 뽑음 이러면 맞음 느린 쿼리가 몇몇 캐릭터 ID에 몰리고 그 캐릭터의 아이템·우편 행 수가 평균의 수십 배이며 다른 PC·회선에서 접속해도 똑같이 느림 이러면 아님 같은 계정의 다른 캐릭터나 다른 유저도 함께 느리면 DB 장비·잠금 쪽. 그 캐릭터가 다른 PC에서는 멀쩡하면 유저 환경 확인 수단 인프라 도구로 확인(게임 코드 불필요)
더 알아보기 같은 캐릭터로 다른 PC·회선에서 접속해도 똑같이 느리고 같은 계정의 다른 캐릭터는 멀쩡하다면 캐릭터 데이터를 의심합니다. 이를 가려내려면 제보에 캐릭터 이름이 꼭 필요합니다.
출처 Extraneous Fetching antipattern Microsoft Azure 필요 이상으로 데이터를 가져오면 I/O 부담이 커지고 응답이 느려짐 PostgreSQL Documentation: Error Reporting and Logging PostgreSQL log_min_duration_statement: 일정 시간 이상 걸린 SQL을 기록해 느린 쿼리 추적 The Slow Query Log MySQL long_query_time을 넘긴 쿼리를 기록하는 느린 쿼리 로그
함께 보면 좋은 원인
같은 층: 일부에게만 생기는 문제
같은 증상(접속 불가·무한 로딩)의 다른 층 원인
그림과 실험이 있는 원본 카드 보기