서버에서 살아남기

스레드 풀 본문

운영체제

스레드 풀

개발롬 2023. 7. 23. 15:16

개념

멀티 스레딩 환경에서 스레드들을 효율적으로 관리하는 기술입니다.

나의 경우

  • Django에서 pool을 별도로 관리하지 않고, threading 모듈로 멀티 스레딩만 구현한 상황
  • 이 상황에서 생길 수 있는 문제
1) 대규모에 부적합
- 스레드 풀을 관리하고 있지 않기 때문에 효율적인 관리가 안됨

2) 데드락 가능성
- 스레드 간에 서로 의존성을 가지고 있다면 데드락이 발생 할 수 있습니다.
- 데드락 : 멀티스레드나 멀티 프로세스 환경에서 두 개 이상의 작업이 서로 상대방의 작업이 끝나기를 기다리면서 무한 대기하는 상태

그렇다면 어떻게?

  • 스레드풀을 이용하여 스레드들을 효율적으로 관리해야합니다. 미리 정해진 개수의 스레드들을 생성하고 관리하며, 작업이 들어오면 생성된 스레드들을 이용하여 작업을 처리하는 방식으로 동작합니다.

1) 동작 방식

  • Django에서 스레드 풀을 이용한 동작 흐름
1. http 요청이 도착하면 Django는 요청을 처리하기 위해 스레드 풀을 활용
2. 스레드 풀에는 미리 생성해둔 일정 개수의 스레드가 대기 중
3. 스레드 풀에서 빈 스레드를 하나 가져와서 해당 요청을 처리하기 위해 할당됨
4. 각 스레드는 독립적으로 요청을 처리하며 다른 스레드와는 별개로 실행함
5. 요청 처리가 완료되면 다시 스레드 풀에 반환
6. 모든 풀이 사용중인 상태면 새로운 요청은 대기하게 됨

2) 그럼 적절한 스레드풀은 어떻게 설정해야하는지

  • 시스템 CPU코어 수, 메모리 용량, 디스크 I/O 등을 고려하고
  • 동시에 처리할 수 있는 요청의 수에 맞추어서 설정하고,
  • CPU작업인 경우 CPU 코어 수에 맞게 스레드 풀의 크기를 설정하기

번외

  • 여러 블로그 혹은 책에서 언급된 적정 스레스 개수
    적정 스레드 개수 = cpu 수 * (1+ 대기, 유휴 시간/서비스 시간)

'운영체제' 카테고리의 다른 글

메모리 구조  (0) 2023.07.31
CPU 스케쥴링  (0) 2022.07.10