AS-IS 대비 지연 시간을 약 390배 단축하고, 처리량을 4,200% 향상시켜 서비스 가용성 100%를 확보
| 지표 | 최적화 전 (AS-IS: 200 VU) | 최적화 후 (TO-BE: 150 VU) | 개선율 |
|---|---|---|---|
| p(99) Latency | 59.99s | 154ms | 약 390배 개선 |
| Request Failed | 75.53% | 0.00% | 장애 완전 해소 |
| Throughput | 7.59 ops/s | 319.9 ops/s | 약 4,200% 향상 |
200 VU 부하 시 p(99) 지연 시간이 60s에 도달하며, Connection Timeout으로 인한 전체 요청의 75.53% 응답 불능 상태
![[지표] 부하 발생 직후 응답 시간이 60초를 기록하며 서비스 가용성이 1/4 수준으로 붕괴](attachment:86d71f64-a00a-459d-80a9-255f902cf07e:k6-1.png)
[지표] 부하 발생 직후 응답 시간이 60초를 기록하며 서비스 가용성이 1/4 수준으로 붕괴
초당 약 1,750만 행을 전수 조사하는 Sequential Scan 발생으로 인한 Cache Thrashing 및 Cache Hit Rate이 50.81% 급감 확인
![[분석] 과도한 풀 스캔으로 인해 유효 데이터가 캐시에서 밀려나며 메모리 적중률이 50.81% 까지 하락](attachment:96707315-ae90-4383-81f8-db2816879013:MergedImages.png)
[분석] 과도한 풀 스캔으로 인해 유효 데이터가 캐시에서 밀려나며 메모리 적중률이 50.81% 까지 하락
LIKE %keyword% 조건으로 인한 Parallel Seq Scan 발생shared hit(15,277) 대비 read(19,132) 수치가 높게 나타나며, 메모리 내 유효 데이터가 축출되는 Cache Thrashing 확인-> Parallel Seq Scan on tb_coupon c1_0
Filter: (((title)::text ~~ '%NIKE%'::text) AND ((use_status)::text <> 'ALL'::text))
Rows Removed by Filter: 285,781
Buffers: shared hit=15,277 read=19,132
Execution Time: 183.064 ms
[개선 내용] 데이터 구조 분리를 통한 검색 성능 확보 시도