일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- buildSrc
- 낙관적 락
- MSA
- AWS
- 자료구조
- HTTP
- 자바
- 갱신 이상
- 비관적 락
- Kafka
- null
- well-know port
- java
- DB
- 3-way handshaking
- JPA
- 네트워크
- Spring
- ocp
- 페이지네이션
- 캐시 오염
- 삽입 이상
- gatway
- Redis
- 스레드 풀
- 삭제 이상
- 정규화
- Dirty Checking
- 데이터베이스
- Kotlin
Archives
- Today
- Total
어 나 갱수.
[운영체제] 스레드 풀(thread pool) 🐻 본문
728x90
우리가 스레드를 계속해서 만들면, 운영 체제의 자원이 빨리 소진될 수 있습니다.
서버는 동시 접속자가 많아지면 스레드가 무한대로 생성되면서 서버가 다운될 위험이 있습니다.
스레드의 개수를 관리하기 위해서는 스레드 풀을 사용할 수 있습니다.
스레드를 단순하게 사용하면 ?
- 스레드 생성비용이 크기 때문에 요청에 대한 응답시간이 늘어난다.
- 스레드가 너무 많으면 여러 가지 문제를 발생시킨다. 메모리 문제가 발생할 수 있고 CPU 오버헤드가 증가한다.
스레드 풀 이란?
스레드 풀은 미리 일정 개수의 스레드를 풀(Pool)이라는 곳에 생성해 놓고 필요할 때마다 사용하고 다 사용한 스레드는 다시 풀(Pool)에 반환하도록 작동합니다. 스레드 풀을 사용하면 스레드 생성 및 삭제에 따른 오버헤드를 줄일 수 있습니다. 이를 통해 자원을 효율적으로 관리하고 성능을 향상할 수 있습니다.
위 사진과 같이 처음 스레드 풀로 요청이 들어오면 작업 큐로 요청이 가고 큐에서 스레드 풀에 있는 각각에 스레드로 작업 요청을 보내고 스레드는 작업을 처리합니다. 작업을 마친 스레드는 다시 스레드 풀로 돌아와서 다른 요청을 기다립니다.
장점
- 자원 효율성
- 스레드 풀을 미리 정해진 개수의 스레드를 생성하여 관리하기 때문에, 스레드 생성 및 삭제에 따른 오버헤드를 줄일 수 있습니다.
- 이는 시스템의 자원을 효율적으로 관리하고 성능을 향상시킬 수 있습니다.
- 응답성 및 처리량 향상
- 스레드 풀에서 스레드들은 항상 대기 상태로 유지하여 작업 처리 속도를 향상시킬 수 있습니다.
- 스레드 작업이 발생하면 스레드 풀에 있는 스레드 중에 하나를 선택해서 작업을 할당하므로, 작업 처리를 병렬로 진행할 수 있습니다.
- 작업 제어
- 스레드 풀을 사용하면 동시에 처리할 수 있는 작업의 개수를 제한할 수 있습니다.
- 스레드 풀의 크기를 조절하면서 시스템의 부하를 조절하고, 과도한 작업 요청으로 인한 성능 저하를 방지할 수 있습니다.
- 스레드 관리
- 스레드 풀은 스레드의 생성, 재사용, 종료 등을 관리하므로, 스레드의 안전한 운영을 도와줍니다.
Java, Tomcat의 스레드 풀
동시 요청을 안정적으로 처리해야 하는 Web Server에서 스레드 풀을 사용한다.
SpringBoot에서 Tomcat 스레드 풀 설정
server.tomcat.threads.max
- 스레드 풀에서 사용할 최대 스레드 개수, 기본 값은 200
- 요청 수에 비해 너무 많게 설정 -> 놀고 있는 스레드가 많아져서 비효율 발생
- 너무 적게 설정 -> 동시 처리 요청수가 줄어든다. -> 응답 시간 감소
- 기본적으로 스레드가 많아지면 오버헤드가 발생할 수 있다는 걸 고려해야 한다.
server.tomcat.threads.min-spare
- 스레드 풀에서 최소한으로 유지할 스레드 개수, 기본 값은 10
- 너무 많이 설정 -> 스레드 풀이 항상 유지하고 있어야 하는 스레드의 수가 너무 많아진다.
server.tomact.max-connections
- 동시에 처리할 수 있는 최대 Connection의 개수, 기본 값은 8192
- 사실상 서버의 실절적인 동시 요청 처리 개수라고 생각할 수 있다.
server.tomact.accept-count
- max-connections 이상의 요청이 들어왔을 때 사용하는 요청 대기열 Queue의 사이즈의 기본값은 100
- 너무 크게 설정 -> 대기열이 커지면서 메모리 문제를 유발할 수 있다.
- 너무 작게 설정 -> Queue의 요청이 많아지면 새로 들어오는 요청을 거절할 수 있다.
- 이 설정을 하는 이유는 요청이 한 번에 너무 많이 쌓이게 돼서 서버에 장애를 발생시키는 것을 방지하기 위해서이다.
정리
- 스레드 풀은 응답 시간에 영향을 주는 하나의 요소이다.
- 잘 조정된 스레드 풀은 시스템의 성능을 끌어내고 안정적인 애플리케이션 운영을 가능하게 한다.
- 부적절하게 사용된 스레드 풀은 오버헤드를 일으킬 수 있다.
728x90
'운영체제' 카테고리의 다른 글
[운영체제] 동시성 vs 병렬성 (0) | 2024.07.09 |
---|