[게임 서버] 1.12 스레드 풀링
카테고리: GameServer
태그: GameServer
이 글은 아래의 책을 자세히 정리한 후, 정리한 글을 GPT에게 요약을 요청하여 작성되었습니다.
게임 서버 프로그래밍 교과서, 배현직 저자
📦 1. 멀티스레딩
👉🏻 항목 12: 스레드 풀링
멀티스레드 게임 서버를 만들 때, 스레드는 몇 개를 만들어야 할까?
❌ 클라이언트마다 스레드를 만들면?
클라이언트가 5000명이라면, 스레드도 5000개라고 가정하자.
이 방식은 다음과 같은 문제를 일으킨다:
- 메모리 낭비: 스레드 하나당 스택 등 자원 사용
-
컨텍스트 스위치 증가: CPU가 스레드 전환에 시간 소모
→ 실제 작업보다 스레드 전환 비용이 더 큼
그래서 요즘은 스레드 풀링을 사용한다.
✅ 스레드 풀링(Thread Pooling)
미리 스레드를 여러 개 만들어두고,
작업이 들어오면 대기 중인 스레드에게 할당해서 처리하는 방식
[문] [문] [문] [문] [문]
↑
(두 번째 문이 열려 있음)
사람1: 두 번째 문이 비었다! 저기 가야지~
사람2: 아... 급하다
사람3: 아... 급하다
문 = 스레드, 사람 = 이벤트
⚖️ CPU 개수와 스레드 개수의 관계
1️⃣ CPU > 스레드
- 예: CPU 8코어, 스레드 6개
- 컨텍스트 스위치 없음
- 스레드 병렬 실행 6개
- CPU 자원을 100% 활용하지 못함
2️⃣ CPU = 스레드
- 예: CPU 8코어, 스레드 8개
- 컨텍스트 스위치 없음
- 병렬 실행 8개
- CPU 자원 100% 활용
3️⃣ CPU < 스레드
- 예: CPU 8코어, 스레드 10개
- 컨텍스트 스위치 발생
- 오히려 처리 속도 나빠질 수 있음
- 디바이스 타임(IO 등)도 영향을 줌
💡 결론: 일반적으로 CPU 개수보다 스레드 개수가 적거나 같은 게 좋다.
🧮 스레드 개수는 어떻게 정할까?
스레드는 자주 잠을 잔다 (대기 상태)
→ 이럴 땐 CPU는 놀고 있다.
→ CPU를 더 잘 쓰기 위해 스레드 수를 늘리는 것이 좋다.
예시:
- 총 처리 시간 중
- 25%는 CPU 연산
-
75%는 IO 등 대기
→ 스레드 수 = CPU 개수 × 4 (또는 대략 3~4배)
💬 스레드 개수 결정 규칙
상황 | 권장 스레드 수 |
---|---|
CPU 작업 위주 | CPU 개수와 동일 |
IO 대기 많은 경우 | CPU 개수보다 2~4배 많게 |
🧐 정리
- 스레드 풀링은 서버 성능을 안정적으로 유지하는 핵심 전략
- 스레드 개수는 작업 특성에 따라 조절해야 한다
- CPU 연산 위주: CPU 개수와 동일하게
- IO 대기(디바이스 타임) 많은 경우: 더 많은 스레드로 커버
댓글남기기