1.12 스레드 풀링

멀티스레드 모델의 게임 서버를 개발할 때 스레드의 개수와 어떤 일을 하게 만들면 좋을지?

 

1. 클라이언트마다 스레드를 배정해주는 것

- 개발은 쉽지만 스레드 개수가 많을 경우 여러 문제 발생

문제

1. 많은 메모리가 필요하다.

각 스레드는 호출 스택을 갖는데 수십 킬로바이트에서 수 메가바이트의 크기를 갖는다

만약 스레드가 5000개라면 5000메가바이트의 메모리가 필요하다.

2. 컨텍스트 스위치 현상으로 불필요한 CPU 연산량 발생

클라이언트 5000개가 초당 100회씩 처리해야 하는 이벤트가 발생할 경우 

서버에서 1초에 50만 번 스레드가 깨어났다 잤다를 반복하여

둘 이상의 스레드는 최대 50만번의 컨텍스트 스위치를 하게되어 CPU의 연산량을 늘어난다.

 

스레드 풀링

- 작업처리에 사용되는 스레드를 제한된 개수만큼 정해놓고 작업큐에 들어오는 작업들을 하나씩 스레드가 맡아 처리

 

스레드 개수가 CPU 개수 보다 적으면?

CPU가 8코어 인 경우 스레드가 6개이면 CPU의 6/8 밖에 사용하지 못하여 최고의 효율을 내지 못한다.

 

스레드 개수가 CPU 개수 보다 많으면?

CPU가 8코어 인 경우 스레드가 10개이면 나머지 2개의 스레드가 이미 배정받은 CPU에 중복해서 배정하게 된다

1개의 코어가 컨텍스트 스위치를 하여 2개의 스레드를 실행하여 결과적으로 나쁜 처리속도를 내게 된다.

 

스레드가 잠시 잠자는 디바이스 타임이 많은 경우는?

스레드가 잠자는 시간이 많은 경우 스레드의 개수를 늘려 CPU의 연산량을 높여준다.

 

결론

1. 서버의 주 역할이 CPU 연산만 하는 스레드라면 스레드풀의 스레드 개수는 서버의 CPU 개수와 동일하게 잡아도 충분

2. 서버의 주 역할이 데이터베이스나 파일 등 다른 것을 엑세스하면서 디바이스 타임을 발생시킨다면 스레드 개수는 CPU 개수보다 많아야한다.

+ Recent posts