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

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

콜드 캐시 (재시작 직후) Cold buffer pool after restart

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

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

DB를 재시작하면 메모리 캐시가 비어 있어서 한동안 조회하는 데이터를 모두 디스크에서 읽습니다.

왜 점검으로 DB 재시작 → 그러면 자주 쓰던 데이터가 메모리에 없어 디스크에서 읽음 → 화면에서는 점검 직후 한동안 로그인·로딩이 느림

증상
접속 불가·무한 로딩, 입력 지연
요인
지연
누가 겪나
서버 전체
언제
접속·점검 직후
담당
주 담당 인프라팀·DB 인프라 · 함께 게임개발팀·서버 개발
게임개발팀 할 일
점진적 오픈(로그인 대기열로 로그인 인원을 단계적으로 늘리기).
인프라팀 할 일
재시작 후 캐시 예열(워밍, 버퍼 풀 저장·복원 설정 확인), 스냅샷으로 되살린 DB는 디스크도 미리 읽기.
그래프에서는
접속·점검 직후 폭증 · 디스크 읽기, 버퍼 캐시 적중률
확인할 곳
MySQL은 Innodb_buffer_pool_reads(버퍼 풀에 없어 디스크에서 읽은 횟수)와 Innodb_buffer_pool_read_requests의 비율, 예열 진행 상황 Innodb_buffer_pool_load_status를 봄. PostgreSQL은 pg_stat_database의 blks_read·blks_hit을 봄. DB 서버의 디스크 읽기 수도 함께 봄
이러면 맞음
재시작 직후 디스크 읽기가 솟고 적중률이 낮았다가 시간이 지나며 회복되고 그 구간에 로그인·로딩이 느림
이러면 아님
적중률이 평소와 같은데 점검 직후 느리면 로그인 폭주·N+1(db-login-storm)이나 커넥션 풀(db-pool)
확인 수단
인프라 도구로 확인(게임 코드 불필요)
더 알아보기
MySQL은 꺼질 때 버퍼 풀의 페이지 목록을 저장했다가 켜질 때 백그라운드에서 다시 읽어 오지만, 다 채우기까지는 시간이 걸립니다. 클라우드에서 DB를 스냅샷(디스크 사본)으로 되살렸다면 디스크 자체도 처음 읽는 블록마다 느려서 더 오래 갑니다.
실제 사례
Roblox 2021: Roblox 73시간 장애: 서비스 디스커버리(Consul) 클러스터의 경합

출처

  1. Saving and Restoring the Buffer Pool State MySQL
    재시작 뒤 예열 시간을 줄이려고 꺼질 때 최근 쓴 페이지 목록(기본 25%)을 저장하고 켜질 때 다시 읽음, 둘 다 기본으로 켜져 있음
  2. pg_prewarm — preload relation data into buffer caches PostgreSQL
    공유 버퍼 내용을 주기적으로 기록해 두었다가 재시작 뒤 다시 올림(autoprewarm)
  3. Initialize Amazon EBS volumes AWS
    스냅샷에서 만든 볼륨은 모든 블록을 받아 올 때까지 지연이 늘고 성능이 떨어짐
  4. Server Status Variables MySQL
    Innodb_buffer_pool_reads(버퍼 풀에 없어 디스크에서 직접 읽은 논리 읽기 수), Innodb_buffer_pool_read_requests, Innodb_buffer_pool_load_status(예열 진행 상황)
  5. The Cumulative Statistics System (PostgreSQL Documentation) PostgreSQL
    pg_stat_database의 blks_read(디스크에서 읽은 블록 수)·blks_hit(버퍼 캐시에서 찾은 블록 수)

함께 보면 좋은 원인

같은 층: L12 데이터베이스

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

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