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

게임 렉 백서 › L12 데이터베이스

로그인 폭주와 N+1 쿼리 Login storm, N+1 queries

원인 ID db-login-storm · 주 담당 게임개발팀·서버 개발 · 함께 인프라팀·DB 인프라

그림과 실험이 있는 원본 카드로 열기 →

캐릭터 하나를 불러올 때 수십 번 따로 조회하면, 수만 명 동시 로그인이 쿼리 수백만 개가 됩니다.

왜 캐릭터 로딩 때 아이템·스킬·퀘스트를 따로따로 조회 → 그러면 점검 직후 동시 로그인으로 쿼리 폭증 → 화면에서는 로그인 무한 로딩, 게임 중인 사람의 저장까지 밀림

증상
접속 불가·무한 로딩, 입력 지연
요인
정체, 지연
누가 겪나
서버 전체
언제
접속·점검 직후
담당
주 담당 게임개발팀·서버 개발 · 함께 인프라팀·DB 인프라
게임개발팀 할 일
한 번에 묶어서 조회, 로그인 대기열, 캐시, ORM 지연 로딩이 만드는 조회 수 점검.
인프라팀 할 일
호출 횟수가 많은 쿼리 순위를 뽑아 공유, 점검 직후 로그인 시간대의 쿼리 수·커넥션 수 모니터링.
그래프에서는
접속·점검 직후 폭증 · DB 초당 쿼리 수, 로그인 수
확인할 곳
점검 직후 로그인 수와 DB의 초당 쿼리 수(MySQL은 Questions 증가량)를 겹쳐 보고 로그인 한 건당 쿼리 수를 계산함. 호출 횟수 상위 쿼리는 MySQL events_statements_summary_by_digest의 COUNT_STAR, PostgreSQL pg_stat_statements의 calls로 뽑음
이러면 맞음
로그인 한 건당 쿼리가 수십 개이고 상위 쿼리가 캐릭터 ID 하나로 조회하는 같은 모양의 짧은 쿼리들임. 패치 뒤 로그인당 쿼리 수가 늘었다면 그 패치가 출발점
이러면 아님
로그인당 쿼리 수는 적은데 쿼리 하나하나가 느리면 콜드 캐시(db-cold-cache)나 인덱스(db-no-index)
확인 수단
인프라 도구로 확인(게임 코드 불필요)
더 알아보기
ORM(DB 조회를 대신 만들어 주는 라이브러리)의 지연 로딩이 개발자도 모르는 사이 이런 조회를 만듭니다. 개발 서버에서는 캐릭터 몇 개라 티가 안 나고 라이브의 동시 로그인에서 처음 드러납니다.

출처

  1. Efficient Querying .NET
    ORM의 지연 로딩은 항목마다 쿼리를 한 번씩 더 보내는 N+1 문제를 만들어 성능을 크게 떨어뜨림, 한 번에 묶어 불러오기(eager loading) 권장
  2. pg_stat_statements — track statistics of SQL planning and execution PostgreSQL
    문장별 실행 횟수(calls)와 총 실행 시간을 모아 호출이 많은 쿼리 순위를 뽑음
  3. Performance Schema Statement Digests and Sampling MySQL
    events_statements_summary_by_digest로 같은 모양의 쿼리를 묶어 횟수·시간 집계
  4. Statement Summary Tables MySQL
    요약 테이블의 COUNT_STAR(실행 횟수)·SUM_TIMER_WAIT(총 시간)
  5. Server Status Variables MySQL
    Questions: 클라이언트가 보낸 문장 수

함께 보면 좋은 원인

같은 층: L12 데이터베이스

같은 증상(접속 불가·무한 로딩)의 다른 층 원인

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