스프링 부트를 사용한 프로젝트 진행 중 JMeter를 사용한 부하테스트에서 해당 문제가 발생하였다.
hikaripool-1 - connection is not available request timed out after 30000ms
해당 문제를 해결해 가는 과정에 대해 적고자 한다.
스프링부트 3.0이상에서는 JDBC에서 Hikari를 사용하게 된다.
hikaripool-1 - connection is not available request timed out after 30000ms
해당 오류가 부하테스트 중에 발생하였으므로 너무 많은 쿼리가 발생하여 커넥션 풀에 남은 커넥션이 없을 것이라 판단하였다.
따라서 최대 풀 개수를 증가시키고자 하였다.
spring:
datasource:
hikari:
connection-timeout: 3000
maximum-pool-size: 100
max-lifetime: 30000
로컬에서 부하테스트를 증가시키는 것이 목표였으므로 풀 개수에 대한 생각없이 증가하였고 로컬에서 해당 예외가 발생하지 않았다.
하지만 배포를 위한 RDS에서는 다시 해당 오류가 발생하였다.
RDS 최대 커넥션 수 의심
로컬에서 사용한 h2DB와 개발환경에서 사용할 RDS MySQL의 차이를 최대 커넥션 수로 의심했다.
의심의 이유는 로컬과 달리 RDS의 프리티어의 리소스를 못믿었기 때문이다.
최대 커넥션 수를 조절해봤고 해결되지 않았다.
Hikari connection-timeout
connection-timeout
: 클라이언트가 Hikari Pool에서 커넥션을 얻어오는데 걸리는 최대 시간
가설) connection-timeout이 너무 짧고 RDS의 최대 커넥션 수가 부족하여 커넥션을 얻어오기가 오래걸리게 되어 문제가 발생한다.
결론) 의미있는 해결책이 아니다.
이 프로젝트의 구조는 다음과 같다.
대략적인 동작방식은
문제점은 FastAPI서버에서 비동기로 실행되어야 할 부분이 잘못 짜여져 있어서 동기로 진행되었고
그러다보니 분석시간이 갈수록 길어지기 시작했다.
이렇게 스프링에서 할당받은 커넥션들의 대기시간이 30초가 길어지자 다음 커넥션을 기다리고 있던 요청은 Hikari의 connection-timeout을 넘기게 되어 문제가 발생한 것이었다.
의도치 않게 Hikari 설정의 중요성을 알게 되었고 더욱 공부를 해야겠다 배우게 된 경험이였다.
HikariCP Dead lock에서 벗어나기 (이론편) | 우아한형제들 기술블로그
[장애회고] ORM(JPA) 사용 시 예상치 못한 쿼리로 인한 HikariCP 이슈
Connection is not available, request timed out after 30000ms.