yongsa0221의 고물상
little-writer-v2 threadpool 설정하기 2 본문
Springboot에서 ThreadPoolExecutor는 java.util.concurrent.ThreadPoolExecutor 에 기반한다.
java.util.concurrent.ThreadPoolExecutor 요녀석은 어떻게 동작 하는 것일까?
java doc에 따르면 ,,,
요런 식으로 동작한다고 한다
재미있는 사실은 corePoolSize만큼 항상 먼저 스레드풀을 할당하지 않는 다는 것.
ThreadPoolExecutor (Java SE 23 & JDK 23)
An ExecutorService that executes each submitted task using one of possibly several pooled threads, normally configured using Executors factory methods. Thread pools address two different problems: they usually provide improved performance when executing la
docs.oracle.com
아무튼 async를 위해 설정한 ThreadPoolExecutor에서 “정책에 따라 처리”(기본적으로 RejectedExecutionException ) 까지 가지 않게 하기 위해서는 corePoolSize와 maxPoolSize, queueCapacity를 적절하게 설정하는 것이 중요하다
corePoolSize
corePoolSize 의 경우는 JVM이 사용하는 logical core수로 맞추어 주면 된다.
lightsail 저렴이 에디션은 2개의 vcpu를 지원하므로 corePoolSize = 2로 해주면 되겠다.
maxPoolSize
Java Cuncurrency in practice에서는 적절한 쓰레드 풀의 크기를 다음의 수식을 통해 구할 수 있다고 한다.
현재 lightsail녀석은 2개의 논리적 cpu를 가지고 있으므로
Ncpu = 2
그리고 생성형 ai의 응답시간이 보통 15초이상이었으므로 w=15000ms, 작업시간은 넉넉잡아 500ms라고 가정하고 계산해본다면 대략 30라는 값이 나온다.
cpu바운드 작업도 아니고, 대기시간도 엄청 길어서 Ncpu*Ucpu값은 별로 의미가 없어져버렸다.
실제로 테스트를 해보아야 겠지만 아직 리팩터링을 마치치 못한 상태라서 lightsail에 올려 돌려볼수가 없다;;
queueCapacity
queueCapacity 의 경우 얼마나 사용자가 얼마나 대기해야 하는지를 고려해야 한다.
stackOverFlow의 한 낭인의 말에 의하면….
클라이언트 서비스가 submitted한 작업이 100초 이내에 완료되어야 한다고 예상하고, 각 작업이 1~2초 걸린다는 것을 알고 있다면, 큐의 크기를 50~100개의 작업으로 제한하는 것이 좋을 것이다. 큐에 이미 100개의 작업이 대기 중이라면, 다음 작업은 100초 이내에 완료되지 않을 가능성이 매우 높으므로, 서비스가 의미 없이 기다리지 않도록 작업을 거부하는 것이 좋다.
즉 (클라이언트에서 응답대기할 수 있는 최대 시간 / 작업 완료에 걸리는 시간) 로 설정 가능하다
How to decide on the ThreadPoolTaskExecutor pools and queue sizes?
This is may be more general question, on how to decide on the thread pool size, but let's use the Spring ThreadPoolTaskExecutor for this case. I have the following configuration for the pool core a...
stackoverflow.com
대략적으로 클라이언트에서 최대 2분동안 기다릴 수 있고(참을성이 많은 사람들이라고 가정), 생성형ai응답이 넉넉잡아 30초 정도 걸린다면 queueCapacity는 4정도,,,,
당연한 이야기지만 결국 프로젝트 리팩터링을 완전히 끝내지 못한 시점에서 threadPoolExecutor의 설정값을 최적화하기는 불가능.
그래서 대략적으로 예상한 값을 통해 일단 설정해놓고 완료후 측정해보면서 수정해야 할듯하다.
그래서 일단
lightsail 인스턴스 코어 수 : 2
생성형 ai api 응답 완료 시간 : 넉넉히 30초
사용자가 최대로 대기 가능한 시간 : 120초
ThreadPoolExecutor 설정 시:
- corePoolSize는 사용 가능한 vCPU 수에 맞추어 설정 (2로 설정).
- maximumPoolSize는 30
- queueCapacity는 2분/30초 해서 4
로 설정해보자,,,,
queueCapacity가 너무작지만 maxPoolSize가 커서 여러 요청을 동시에 작업가능하게 되는 것
생성형 ai api호출시 거의 대기만 해야 되서 이렇게 나온 것 같다.
생성 속도 측정다시 해보고 리팩터링 완료되면 다시 한번 계산해봐야 할듯…
그리고 DB 커넥션과 HTTP client 커넥션 도 같이 고려해야되는데 나중에 해봐야겠다
일단 먼저 프로젝트를 어느정도 완성시켜야될듯,,,,
'프로젝트 > 리팩터링' 카테고리의 다른 글
little-writer-v2 thread pool 설정하기 (2) | 2024.10.03 |
---|---|
DIP과 추가 수정사항들… (0) | 2024.09.30 |
little-writer-v2 ai의존성 분리 (0) | 2024.09.20 |
little-writer-v2 전략패턴 사용하기 (0) | 2024.09.20 |
little-writer-v2 시작하기 (1) | 2024.09.20 |