Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
Tags
- Alembic
- 스레드풀
- 스케줄링
- 회고
- 메모리구조
- CPU스케쥴링
- 백엔드 개발자
- 쿠버네티스
- 분산처리
- 로드밸런서
- Django
- 캐시서버
- Python
- 쿠베네티스
- 싱글톤 디자인 패턴
- 2022년
- gunicorn
- 멀티스레드
- uvicorn
- nodejs
- 가비지컬렉션
- AWS
- EKS
- alb
- K8S
- golang
- nestjs
- SQLAlchemy
- 글또
- FastAPI
Archives
- Today
- Total
서버에서 살아남기
스레드 풀 본문
개념
멀티 스레딩 환경에서 스레드들을 효율적으로 관리하는 기술입니다.
나의 경우
- Django에서 pool을 별도로 관리하지 않고, threading 모듈로 멀티 스레딩만 구현한 상황
- 이 상황에서 생길 수 있는 문제
1) 대규모에 부적합
- 스레드 풀을 관리하고 있지 않기 때문에 효율적인 관리가 안됨
2) 데드락 가능성
- 스레드 간에 서로 의존성을 가지고 있다면 데드락이 발생 할 수 있습니다.
- 데드락 : 멀티스레드나 멀티 프로세스 환경에서 두 개 이상의 작업이 서로 상대방의 작업이 끝나기를 기다리면서 무한 대기하는 상태
그렇다면 어떻게?
- 스레드풀을 이용하여 스레드들을 효율적으로 관리해야합니다. 미리 정해진 개수의 스레드들을 생성하고 관리하며, 작업이 들어오면 생성된 스레드들을 이용하여 작업을 처리하는 방식으로 동작합니다.
1) 동작 방식
- Django에서 스레드 풀을 이용한 동작 흐름
1. http 요청이 도착하면 Django는 요청을 처리하기 위해 스레드 풀을 활용
2. 스레드 풀에는 미리 생성해둔 일정 개수의 스레드가 대기 중
3. 스레드 풀에서 빈 스레드를 하나 가져와서 해당 요청을 처리하기 위해 할당됨
4. 각 스레드는 독립적으로 요청을 처리하며 다른 스레드와는 별개로 실행함
5. 요청 처리가 완료되면 다시 스레드 풀에 반환
6. 모든 풀이 사용중인 상태면 새로운 요청은 대기하게 됨
2) 그럼 적절한 스레드풀은 어떻게 설정해야하는지
- 시스템 CPU코어 수, 메모리 용량, 디스크 I/O 등을 고려하고
- 동시에 처리할 수 있는 요청의 수에 맞추어서 설정하고,
- CPU작업인 경우 CPU 코어 수에 맞게 스레드 풀의 크기를 설정하기
번외
- 여러 블로그 혹은 책에서 언급된 적정 스레스 개수
적정 스레드 개수 = cpu 수 * (1+ 대기, 유휴 시간/서비스 시간)