게임 렉 백서 › L8 소켓과 프로토콜
블로킹 I/O 구조 Blocking I/O model
원인 ID sk-blocking-io · 주 담당 게임개발팀·서버 개발
그림과 실험이 있는 원본 카드로 열기 →
소켓 하나를 기다리는 동안 스레드가 다른 일을 못 하는 구조에서는 사람이 늘수록 전체가 느려집니다.
왜 연결마다 읽기·쓰기를 기다리는 방식 → 그러면 한 연결의 지연이 같은 스레드의 다른 연결로 번짐 → 화면에서는 동접이 늘수록 전체가 슬로우모션·입력 지연
- 증상
- 슬로우모션, 입력 지연
- 요인
- 정체
- 누가 겪나
- 서버 전체
- 언제
- 사람이 몰릴 때, 저녁 피크 시간
- 담당
- 주 담당 게임개발팀·서버 개발
- 게임개발팀 할 일
- epoll·IOCP·io_uring 기반 비동기 I/O로 전환.
- 그래프에서는
- 인원·부하를 따라 오름 · 응답 시간, 스레드 수
- 확인할 곳
- pidstat -w -t로 게임 서버 스레드 수와 스레드별 자발적 컨텍스트 스위칭(cswch/s, 자원을 기다리며 멈춘 횟수)을 보고 동접에 따른 응답 시간과 비교
- 이러면 맞음
- 동접이 늘수록 응답 시간이 가파르게 오르고 연결 수만큼 늘어난 스레드 대부분이 자발적 스위칭만 많고 CPU는 거의 쓰지 않음(소켓 대기)
- 이러면 아님
- 스레드가 대기 없이 CPU를 계속 쓰고 있으면 계산 과부하(“틱 예산 초과”)
- 확인 수단
- 인프라 도구로 확인(게임 코드 불필요)
출처
- epoll(7) — Linux manual page Linux man-pages
많은 fd를 한 번에 감시하도록 확장되는 I/O 이벤트 알림 - I/O Completion Ports Microsoft
많은 비동기 I/O를 미리 만든 스레드 풀로 처리하는 윈도우 방식 - pidstat(1) — Linux manual page sysstat
-w의 cswch/s: 자원을 기다리며 스스로 멈춘 자발적 컨텍스트 스위칭, -t로 스레드별
함께 보면 좋은 원인
같은 층: L8 소켓과 프로토콜
같은 증상(슬로우모션)의 다른 층 원인
그림과 실험이 있는 원본 카드 보기