분산 lock으로 인해 성능이 저하되던 부분을 원자적 쿼리로 대체하고, 불필요한 쿼리들도 일부 제거했지만 JMeter 테스트 상으로는 오히려 더 느리게 나오는 문제가 발생했다.
또한 같은 테스트를 수행할 경우에도 평균 응답 시간의 편차가 꽤 있었기에, 이에 대한 원인을 분석해보았다.
정확하지는 않지만 Tomcat → Spring Thread Pool, Spring Thread Pool → MySQL innodb_buffer_pool 간 병목 현상이 발생하고 있다고 판단하였다.
그 증거로 Spring 서버 내에서의 서비스 로직 처리 시간은 일정하지만, JMeter로 실행한 요청에 대한 응답 시간은 표준편차가 상당히 컸기 때문이다.
JMeter로 측정했을 때는 응답 시간이 최대 7s까지도 차이가 나는 모습을 보였다.
따라서 이러한 병목을 처리할 수 있는 방안들에 대해 생각해보았고, 크게 구간 별 처리속도 향상, pool size 증가가 떠올랐다.
처리속도 향상
현재 서비스 로직 상에서는 필요한 부분들만 남기고 모두 추려냈다고 생각했다.
따라서 수행되는 DB 쿼리 자체가 더 빨리 적용될 수 있도록 인덱싱을 적용할 수는 있지만, 현재 테스트 환경에서는 데이터 수가 적어 굳이 인덱싱이 필요하다고 판단이 서진 않았다.
JOIN 연산이 발생하는 곳에 적용 가능한 최적화 방식에 대해서는 생각해봐야 할 것 같다.
pool size 증가
일반적으로 제일 간단명료하게 응답속도를 늘릴 수 있는 방법이다.
다만 size를 늘리는 만큼 점유하게 되는 메모리가 증가하게 되므로 실행 환경을 생각하며 size를 조정해야 할 것 같다.