스레드 풀 설정할 때 corePoolSize, maxPoolSize, queueCapacity 3가지 동작에 헷갈리는 경우가 많습니다.
자주 오해하는 동작 방식
많이들 아래와 같이 오해하시는 것 같습니다.
1. corePoolSize 이상의 동시 호출이 발생하면 바로 쓰레드 개수 증가
2. 최대 maxPoolSize까지 쓰레드 개수 증가
3. 이후 동시 요청에 대해서는 queue에서 대기
실제 동작 방식
사실은 아래와 같이 동작합니다.
1. corePoolSize 이상의 동시 호출이 발생하면 설정된 queueCapacity 에 설정된 수만큼의 동시 요청까지는 queue에서 대기
2. queueCapacity 이상 쌓였을 때 새로운 쓰레드를 만들고 최대 maxPoolSize까지 스레드 수 증가
관련 설정 팁
queueCapacity 설정을 높게 잡아 놓은 경우가 있는데요. (아마도 동작 방식에 대한 오해로)
요즘 서버 스펙이 괜찮기 때문에 빠르게 maxPoolSize를 올리기 위해 예 없거나 적은 수치로 운영하는 것도 괜찮습니다.
maxPoolSize도 일반적인 케이스만 생각하고 비교적 높지 않은 수치로 잡아 놓는 경우가 있는데요.
장애 시점에는 동시 요청 수가 급증하면서 오히려 스레드 풀이 병목이 되는 경우가 있습니다.
maxPoolSize 설정 시에는 장애 시점에 최대 몇개까지 처리하게 할 것인가의 관점으로 설정되어야 하고 이는 일반적인 케이스보다 훨씬 높은 수치입니다.
'제안&정리' 카테고리의 다른 글
[Spring] 동일 타입 여러 빈을 @Primary, @Qualifier 으로 사용하기 (0) | 2023.10.29 |
---|---|
[JAVA] LocalDate atStartOfDay (0) | 2023.10.23 |
[SQL] join에서 on vs where (0) | 2023.10.08 |
[Spock] 쉽게 테스트 작성하기 (0) | 2023.08.27 |
[Spring] 동일 클래스의 Async 호출하기 (0) | 2023.07.09 |