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

게임 렉 백서 › L11 디스크

동기 로그 쓰기 Synchronous logging

원인 ID dk-sync-log · 주 담당 게임개발팀·서버 개발 · 함께 인프라팀·서버 인프라

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

게임 스레드가 로그 한 줄마다 디스크 완료를 기다리면, 디스크가 바쁠 때 게임 진행도 같이 멈춥니다.

왜 전투·거래 로그를 게임 스레드에서 바로 파일에 씀 → 그러면 확실한 저장(fsync)을 요구하거나 OS의 쓰기 버퍼(페이지 캐시)가 한도에 차면, 디스크가 바쁠 때 쓰기 한 번이 수십 ms → 화면에서는 로그 많은 전투에서 멈칫

증상
뚝뚝 끊김, 멈춤
요인
정체
누가 겪나
특정 장소·채널, 서버 전체
언제
사람이 몰릴 때
담당
주 담당 게임개발팀·서버 개발 · 함께 인프라팀·서버 인프라
게임개발팀 할 일
비동기 로깅(메모리 버퍼 + 별도 스레드), 로그 양 줄이기, 게임 스레드에서 fsync 하지 않기.
인프라팀 할 일
로그 로테이션·압축은 I/O 우선순위를 낮춰 실행, 로그를 데이터와 다른 디스크에, 디스크 쓰기 지연 모니터링.
그래프에서는
가끔 무작위로 튐 · 서버 틱 시간, 디스크 쓰기 지연
확인할 곳
iostat -x 1의 w_await·aqu-sz를 틱 시간과 겹쳐 보고 perf trace -p PID --duration 10으로 게임 서버에서 10ms 넘게 걸린 write·fsync 호출과 그 스레드를 찾음
이러면 맞음
틱이 튄 시각에 게임 스레드의 write·fsync 호출이 수십 ms 걸리고, 그 순간 디스크 쓰기 지연도 솟음. 로그 로테이션·압축 시각과 겹치는 경우가 많음
이러면 아님
게임 스레드에 오래 걸린 시스템 호출이 없는데 틱이 튀면 GC·락·틱 예산 초과 같은 다른 원인. 로그 전용 스레드만 오래 걸리면 게임 진행에는 영향이 없음
확인 수단
인프라 도구로 확인(게임 코드 불필요)
더 알아보기
보통 OS는 쓰기를 먼저 메모리(페이지 캐시)에 받아 두고 나중에 디스크로 내려보내서, 로그 한 줄은 대개 곧바로 끝납니다. 멈춤은 fsync로 확실한 저장을 요구할 때, 밀린 쓰기가 한도를 넘어 OS가 쓰기 호출을 블로킹할 때, 로그 파일을 로테이션하거나 압축할 때 생깁니다. 평소엔 멀쩡하다가 디스크가 바쁜 순간에만 튑니다.

출처

  1. fsync(2) — Linux manual page Linux man-pages
    fsync는 바뀐 데이터를 디스크(디스크 캐시 포함)까지 내려보내고 장치가 완료를 알릴 때까지 블록
  2. Documentation for /proc/sys/vm/ Linux kernel
    밀린 쓰기(dirty)가 dirty_ratio에 닿으면 쓰기를 하는 프로세스가 직접 디스크 기록을 떠맡음
  3. ionice(1) — Linux manual page util-linux
    idle I/O 우선순위로 돌린 작업은 다른 프로그램이 디스크를 쓰지 않을 때만 디스크 시간을 받음
  4. iostat(1) — Linux manual page sysstat
    -x: w_await(쓰기 요청이 대기열에서 기다린 시간을 포함한 평균 처리 시간), aqu-sz(평균 대기열 길이, 예전 이름 avgqu-sz)
  5. perf-trace(1) — Linux manual page perf
    -p로 실행 중인 프로세스의 시스템 호출을 추적, --duration으로 지정한 ms보다 오래 걸린 호출만 표시

함께 보면 좋은 원인

같은 층: L11 디스크

같은 증상(뚝뚝 끊김)의 다른 층 원인

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