Skip to main content Link Menu Expand (external link) Document Search Copy Copied

created at 2024-01-07

Table of contents

  1. refreshToken 확인하는 interceptor 지연시간 이전과 이후
  2. Repository 지연시간 이전과 이후
  3. Repository 지연시간 max time 이전과 이후
  4. 왜 오히려 감소하지? :(

저는 채팅서버의 Interceptor 에서 Redis Session 에 저장된 refreshToken 을 find 하도록 설정했습니다.

그리고 이러한 Interceptor 메소드와 Redis 지연시간을 io.micrometer 로 측정해보았는데요. 아래와 같은 결과가 나왔습니다.

image

image

image

우리가 봐야할 부분은 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%
MetricChange1 (%)Change2 (%)
TPS_Average-5.42%🔴-6.66%🔴
TPS_p952.59% 🔴-1.26% 🔴
TPS_p991.66% 🔴-0.52% 🔴
MTTFB_Average-1.53% 🔴-1.64% 🔴
MTTFB_p95-29.20% 🔴-15.68% 🔴
MTTFB_p99-31.13% 🔴-6.34% 🔴

image

결과부터 말씀드리면 낮은 CP 가 오히려 성능지표가 더 좋게 나왔습니다. 여전히 Redis Repository Latency 가 다른 RDB Latency 보다 높습니다 ㅜㅜ 😂

refreshToken 확인하는 interceptor 지연시간 이전과 이후

image

image

Repository 지연시간 이전과 이후

image

image

Repository 지연시간 max time 이전과 이후

image

image

  • CP 증가 이후

image

왜 오히려 감소하지? :(

  • 네트워크 bandwidth 부족문제
    → 네트워크 1.5Mbps 만 써서 네트워크 bandwidth 는 충분했습니다 😟
  • 과도한 cpu usage 문제
    image → cpu usage 그래프 확인해보면 거의 사용량이 매우 낮습니다.
  • 메모리 fragementation? 아니면 메모리 사용량이 너무 높은가요?
    image → 잔여 메모리가 40% 이상 남아있습니다. 그래서 Memory fragementation 은 제외했습니다.
  • Key indexing 이 제대로 안되어있어서 찾기가 힘든가요?
    image Redis HASH search O(1) 로 빠르게 찾아요. 즉 indexing 은 제대로 되어있어요!
  • Race Condition 문제인가요?
    Redis 는 싱글스레드로 동작하기때문에 Race 경합문제가 발생하지 않는다고 알고있습니다(물론 경우에 따라 멀티스레드로 전환할 수 있긴 하지만요).

아직 이유를 파악하지 못했습니다 😭 혹시 어떤 이유인지 알고 계신다면 ghkdqhrbals@gmail.com 으로 연락주시면 너무너무 감사하겠습니다! 🙏