created at 2024-01-07
Table of contents
- refreshToken 확인하는 interceptor 지연시간 이전과 이후
- Repository 지연시간 이전과 이후
- Repository 지연시간 max time 이전과 이후
- 왜 오히려 감소하지? :(
저는 채팅서버의 Interceptor 에서 Redis Session 에 저장된 refreshToken 을 find 하도록 설정했습니다.
그리고 이러한 Interceptor 메소드와 Redis 지연시간을 io.micrometer 로 측정해보았는데요. 아래와 같은 결과가 나왔습니다.
우리가 봐야할 부분은 UserRedisSessionRepository 의 지연시간입니다! 이 지연시간이 다른 RDB 와 비교했을 때 너무나도 높았습니다. 아니 빠르게 데이터를 찾기위해 Redis remote in-memory 를 쓰는데, RDB 보다 성능이 낮다니요… 그래서 저는 Redis 의 성능을 높이기 위해 Lettuce 가 제공하는 connection pool 을 쓰기로 했습니다. Lettuce CP(Connection Pool)의 default 값들을 수정하면서 여러 성능지표들을 모아보았습니다.
기존(max-active:8, max-idle: 8, min-idle: 0) = Original
- TPS 평균: 362.60
- TPS p95: 438.80
- TPS p99: 494.42
- MTTFB 평균: 590.52 ms
- MTTFB p95: 875.44 ms
- MTTFB p99: 1167.77 ms
- MTTFB 차이 평균 : 78.26 ms
- MTTFB 평균적인 변동률: 11.81%
변경(max-active:100, max-idle: 50, min-idle: 10) = Change1
- TPS 평균: 342.94
- TPS p95: 450.15
- TPS p99: 502.65
- MTTFB 평균: 599.58 ms
- MTTFB p95: 1131.07 ms
- MTTFB p99: 1531.29 ms
- MTTFB 차이 평균 : 122.83 ms
- MTTFB 평균적인 변동률: 19.00%
변경(max-active:150, max-idle: 70, min-idle: 50) = Change2
- TPS 평균: 338.45
- TPS p95: 433.25
- TPS p99: 491.85
- MTTFB 평균: 600.22 ms
- MTTFB p95: 1012.68 ms
- MTTFB p99: 1241.76 ms
- MTTFB 차이 평균 : 104.21 ms
- MTTFB 평균적인 변동률: 16.47%
Metric | Change1 (%) | Change2 (%) |
---|---|---|
TPS_Average | -5.42%🔴 | -6.66%🔴 |
TPS_p95 | 2.59% 🔴 | -1.26% 🔴 |
TPS_p99 | 1.66% 🔴 | -0.52% 🔴 |
MTTFB_Average | -1.53% 🔴 | -1.64% 🔴 |
MTTFB_p95 | -29.20% 🔴 | -15.68% 🔴 |
MTTFB_p99 | -31.13% 🔴 | -6.34% 🔴 |
결과부터 말씀드리면 낮은 CP 가 오히려 성능지표가 더 좋게 나왔습니다. 여전히 Redis Repository Latency 가 다른 RDB Latency 보다 높습니다 ㅜㅜ 😂
refreshToken 확인하는 interceptor 지연시간 이전과 이후
Repository 지연시간 이전과 이후
Repository 지연시간 max time 이전과 이후
- CP 증가 이후
왜 오히려 감소하지? :(
- 네트워크 bandwidth 부족문제
→ 네트워크 1.5Mbps 만 써서 네트워크 bandwidth 는 충분했습니다 😟 - 과도한 cpu usage 문제
→ cpu usage 그래프 확인해보면 거의 사용량이 매우 낮습니다. - 메모리 fragementation? 아니면 메모리 사용량이 너무 높은가요?
→ 잔여 메모리가 40% 이상 남아있습니다. 그래서 Memory fragementation 은 제외했습니다. - Key indexing 이 제대로 안되어있어서 찾기가 힘든가요?
Redis HASH search O(1) 로 빠르게 찾아요. 즉 indexing 은 제대로 되어있어요! - Race Condition 문제인가요?
Redis 는 싱글스레드로 동작하기때문에 Race 경합문제가 발생하지 않는다고 알고있습니다(물론 경우에 따라 멀티스레드로 전환할 수 있긴 하지만요).
아직 이유를 파악하지 못했습니다 😭 혹시 어떤 이유인지 알고 계신다면 ghkdqhrbals@gmail.com 으로 연락주시면 너무너무 감사하겠습니다! 🙏