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

게임 렉 백서 › L9 서버 게임 프로세스

락 경합 Lock contention

원인 ID sp-lock · 주 담당 게임개발팀·서버 개발

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

여러 스레드가 같은 데이터를 쓰려고 락 하나를 기다리면, 스레드를 늘려도 한 번에 하나씩만 실행됩니다.

왜 경매장·길드 창고처럼 공용 데이터를 여러 스레드가 동시에 사용 → 그러면 락을 잡은 스레드가 끝날 때까지 나머지는 대기 → 화면에서는 특정 기능만 느림, 심하면 전체 틱 지연

증상
입력 지연, 멈춤
요인
정체
누가 겪나
특정 기능만, 서버 전체
언제
사람이 몰릴 때
담당
주 담당 게임개발팀·서버 개발
게임개발팀 할 일
락을 잘게 나누기, 락 안에서 하는 일 줄이기, 메시지 기반 구조(데이터마다 담당 스레드를 정하고 다른 스레드는 메시지로 요청만 보내기).
수치 감각
락 안의 일이 작업의 20%면 스레드를 아무리 늘려도 처리량은 1개일 때의 최대 5배, 40%면 2.5배에서 멈춥니다.
그래프에서는
인원·부하를 따라 오름 · 요청 처리 시간, 스레드별 CPU·컨텍스트 스위칭
확인할 곳
pidstat -w -t 1로 스레드별 자발적 컨텍스트 스위칭(cswch/s, 자원을 기다리며 멈춘 횟수), bcc offcputime -p로 스레드가 CPU를 떠나 어디서 기다리는지(호출 스택별 대기 시간). .NET은 dotnet-counters의 락 경합 수(.NET 9 이후 dotnet.monitor.lock_contentions, 8 이하 Monitor Lock Contention Count)
이러면 맞음
부하가 늘어도 CPU 사용률은 낮게 머무는데 처리 시간이 늘고 대기 시간의 대부분이 락을 잡으려는 호출 스택에 몰려 있으며 락 경합 수가 함께 오름
이러면 아님
CPU가 꽉 차 있으면 계산량 문제(틱 예산 초과, 단일 스레드 지역 과부하). 기다리는 곳이 DB·파일 호출이면 게임 스레드의 동기 호출 쪽
확인 수단
인프라 도구로 확인(게임 코드 불필요)
더 알아보기
여러 스레드가 게임 데이터를 함께 고치는 구조에서 생깁니다. 지역·기능마다 스레드 하나가 맡고 메시지로만 주고받는 구조는 락이 거의 없는 대신, 한 스레드에 일이 몰리는 문제(단일 스레드 지역 과부하)를 조심해야 합니다. 게임 스레드가 느린 저장 작업이 잡은 락을 기다리면 그 틱 전체가 멈춥니다.
실제 사례
Roblox 2021: Roblox 73시간 장애: 서비스 디스커버리(Consul) 클러스터의 경합

출처

  1. Amdahl's Law in the Multicore Era IEEE
    IEEE Computer 2008 논문(저자 공개본). 병렬로 나눌 수 없는 비율이 1−f면 코어를 아무리 늘려도 속도 향상은 1/(1−f)를 넘지 못함(암달의 법칙)
  2. Request scheduling Microsoft
    Orleans의 그레인(액터)은 요청을 하나씩 끝까지 처리하는 단일 스레드 실행 모델이라 상태를 동시에 고치지 않음, 서로의 응답을 기다리면 데드락 가능
  3. pidstat(1) — Linux manual page sysstat
    -w의 cswch/s는 자원을 기다리느라 멈춘 자발적 컨텍스트 스위칭 수, -t로 스레드별 표시
  4. Demonstrations of offcputime, the Linux eBPF/bcc version IO Visor
    스레드가 멈춰 CPU를 떠난 시간(off-CPU)을 호출 스택별로 합산, -p로 프로세스 지정
  5. Well-known EventCounters in .NET Microsoft
    Monitor Lock Contention Count(monitor-lock-contention-count): 모니터 락을 잡으려다 경합이 생긴 횟수
  6. .NET runtime metrics .NET
    .NET 9부터 dotnet.monitor.lock_contentions: 프로세스 시작 뒤 모니터 락을 잡으려다 경합이 생긴 횟수

함께 보면 좋은 원인

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

같은 증상(입력 지연)의 다른 층 원인

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