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

게임 렉 백서 › L7 서버 OS (커널)

스레드 과다와 컨텍스트 스위칭 Thread oversubscription, context switching

원인 ID so-context · 주 담당 게임개발팀·서버 개발 · 함께 인프라팀·서버 인프라

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

코어보다 훨씬 많은 스레드를 돌리면 OS가 번갈아 실행시키는 데만 CPU를 씁니다.

왜 연결마다 스레드를 만드는 등 스레드가 수백~수천 개 → 그러면 컨텍스트 스위칭(실행 스레드 교체) 비용과 캐시 미스 증가 → 화면에서는 CPU는 바쁜데 처리량은 낮고 틱이 들쭉날쭉해 뚝뚝 끊김·슬로우모션

증상
뚝뚝 끊김, 슬로우모션
요인
정체, 지터
누가 겪나
서버 전체
언제
사람이 몰릴 때
담당
주 담당 게임개발팀·서버 개발 · 함께 인프라팀·서버 인프라
게임개발팀 할 일
코어 수에 맞춘 스레드, 비동기 I/O(epoll·IOCP).
인프라팀 할 일
컨텍스트 스위칭 횟수와 실행 대기 스레드 수(vmstat의 cs·r) 모니터링.
수치 감각
컨텍스트 스위칭 한 번에 수 µs, 그 뒤 캐시 미스 비용까지 합치면 더 큽니다.
그래프에서는
인원·부하를 따라 오름 · 초당 컨텍스트 스위칭 수, 실행 대기 스레드 수
확인할 곳
vmstat 1의 cs(초당 컨텍스트 스위칭)·r(실행 중이거나 CPU를 기다리는 수)을 코어 수와 비교하고, pidstat -w -t로 게임 서버 스레드별 자발적(cswch/s)·비자발적(nvcswch/s) 컨텍스트 스위칭을 봄
이러면 맞음
동접이 늘 때 r이 코어 수보다 훨씬 크게 오르고 cs도 따라 치솟으며 비자발적 컨텍스트 스위칭이 많은 스레드가 수백 개
이러면 아님
r이 코어 수 이하로 머물면 이 원인이 아님. 자발적 스위칭만 많으면 스레드가 락·I/O를 기다리는 것(“락 경합”, “블로킹 I/O 구조”)
확인 수단
인프라 도구로 확인(게임 코드 불필요)

출처

  1. Quantifying The Cost of Context Switch (ExpCS 2007) ACM
    컨텍스트 스위칭 직접 비용 약 3.8µs, 캐시 영향까지 합친 간접 비용은 수 µs~1,000µs 이상(측정 환경 기준)
  2. vmstat(8) — Linux manual page procps-ng
    cs(초당 컨텍스트 스위칭 수)와 r(실행 중이거나 실행을 기다리는 프로세스 수) 항목
  3. I/O Completion Ports Microsoft
    미리 만든 스레드 풀과 IOCP로 많은 비동기 I/O를 처리하고 동시에 도는 스레드 수를 CPU 동시성에 맞춤
  4. pidstat(1) — Linux manual page sysstat
    -w의 cswch/s는 자원을 기다리며 스스로 멈춘 자발적 컨텍스트 스위칭, nvcswch/s는 타임 슬라이스를 다 써서 강제로 바뀐 비자발적 컨텍스트 스위칭, -t로 스레드별

함께 보면 좋은 원인

같은 층: L7 서버 OS (커널)

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

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