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

본 기록은 성능개선 여정들에 대한 기록입니다.

  • 성능개선을 왜 진행하였나요?

제가 만든 서버가 수치화 되고 이 수치들이 향상되는 것이 매력적이라고 생각해서 성능개선을 진행하였습니다. 멋지지 않나요? 백엔드 자체는 눈에 잘 보이지 않지만, 이러한 성능지표들은 확 눈에 보이죠! 그리고 이런 지표들이 개선되면서 그래프로 상향곡선이 그려지는걸 상상해보세요. 가슴이 웅장해집니다. 물론 이것은 개인적인 이유이고, 또 다른 이유는 서비스의 안정성과 사용자 경험을 향상시키기 위해서입니다. 동시접속자 수가 많을 때 서비스가 느려지거나 불안정해지는 것을 방지하기 위해서 성능개선을 진행하였어요.

  • 초기에는 어떤 방식으로 성능지표를 수집하고 개선하였을까요?

초기에는 성능지표와 서버 성능테스트에 대한 이해가 부족하였습니다. 또한 어떤 툴을 써야되는지도 막막했죠. “이참에 한번 처음부터 끝까지 다 만들어보자!” 라는 마음으로 Golang Http Benchmark Tool 을 직접 만들고, 지연시간들을 그래프로 저장하고 보여주는 로그서버를 올려 10K개의 Http 요청에 걸리는 총 소요시간을 측정하였습니다.

  • 하지만 낮은 효율과 부족한 수집지표들…

이러한 방식은 비효율적이었습니다. 그리고 수집한 지표들 외에 다른 지표들에 대한 존재유무를 파악하지 못했죠. 무엇보다도 툴 부터 만들어나가는 이러한 방식은 실제 서비스에 적용하기에 시간이 오래걸렸습니다.

  • 여러 사람들의 조언과 경험을 토대로 성능지표 가짓수 변화 및 툴 도입!

그래서 linkedin, 지인, 인프런 강사님 등 여러 실무자들이나 Git Discussion, 스택 오버플로우에 물어보았습니다. 어떤 지표가 좋을지, 지금 수집하고 있는 지표들이 적절한지, 어떤 툴을 사용해야할지에 대한 고민을 여쭈어봤었죠. 정말 친절하게도 많은 분들이 답변을 해주셨고, 경험을 공유해주셨습니다!

  • 지금은 어떤 방식으로 성능지표를 수집하고 개선하고 있을까요?

현재는 nGrinder 를 사용하여 여러 부하테스트를 진행하고 있으며 별도의 TPS, MTTFB 의 상위 지표(p50, p95, p99, p99.9)를 뽑아내어 성능개선을 진행하고 있습니다. 그리고 MTTFB 평균 변동률/변동량 또한 추가로 측정하여 서비스의 일관된 지연을 관찰하고 있습니다. 정확한 성능개선과 방향을 잡기 위해 micrometer 와 Spring-actuator, prometheus, grafana 로 여러 병목예상 지점들을 모니터링하고 있습니다.

최적화 목록

  • 2023-01-16 도커 리소스 추가와 수동 수평확장
    • 10K request test 시, 총 소요시간 110초 -> 49초
  • 2023-01-17 JPA Batch 적용
    • 10K request test 시, 총 소요시간 49초 -> 23초
  • 2023-01-24 Multiple Insert JDBC Batch 적용

  • 2023-01-27 JDBC Batch 최적화 및 Postgresql 병렬 프로세서 확장
    • 10K request test 시, 총 소요시간 80초 -> 29초
  • 2023-03-05 AWS-RDS 그래프 지표 관찰 및 db connection 증가
    • 10K request test 시, 총 소요시간 51초 -> 26초
  • 2023-03-11 부하 테스트를 위한 툴 제작 및 실제 테스트 결과
  • 2023-03-16 RDB 인덱싱 활성화

  • 2023-05-01 이벤트 전송 스레드 증가
    • 1000개 동시요청 시, 평균 딜레이타임 8680ms -> 4194 ms
  • 2023-12-21 HPA(max 3), ReadinessProbe, CPU limit, EKS NodeGroup AutoScaling O(CPU usage 50%), Caching, 톰켓 최적화

    성능지표 개선수치 확인

    img img img

    MetricBeforeAfterChange
    Total Tests40,228181,050349.29% 🟢
    Error Rate51.11%(20,560)0.00%(0)No Error 🟢
    TPS 평균 (Average)109.27312.16185.94% 🟢
    TPS p5069.00319.00362.32% 🟢
    TPS p954.00217.455362.50% 🟢
    TPS p992.84132.284556.34% 🟢
    TPS p99.91.6396.525852.76% 🟢
    MTTFB 평균 (Average)1605.44 ms950.89 ms-40.68% 🟢
    MTTFB p501636.55 ms919.20 ms-43.90% 🟢
    MTTFB p9524013.28 ms1322.11 ms-94.47% 🟢
    MTTFB p9927690.40 ms1833.22 ms-93.40% 🟢
    MTTFB p99.928157.50 ms2099.12 ms-92.52% 🟢
    MTTFB 차이 평균 (Average Difference)2838.38 ms112.52 ms-96.04% 🟢
    MTTFB 평균적인 변동률 (Average Variability)75.00%10.67%-85.77% 🟢
  • 2023-12-29 Nginx Ingress replicaSet=2~3

    성능지표 개선수치 확인

    img img img

    MetricIngress Pod 1Ingress Pod 2Change
    Total Tests181,050240,58732.93% 🟢
    Error Rate0.00%(0)0.00%(3)N/A
    TPS 평균 (Average)312.16410.5531.51% 🟢
    TPS p50319.00422.5032.38% 🟢
    TPS p95217.45288.6032.69% 🟢
    TPS p99132.28147.6211.62% 🟢
    TPS p99.996.5237.04-61.68% 🔴
    MTTFB 평균 (Average)950.89 ms709.86 ms-25.29% 🟢
    MTTFB p50919.20 ms693.65 ms-24.54% 🟢
    MTTFB p951322.11 ms958.64 ms-27.49% 🟢
    MTTFB p991833.22 ms1117.45 ms-39.05% 🟢
    MTTFB p99.92099.12 ms1396.80 ms-33.54% 🟢
    MTTFB 차이 평균 (Average Difference)112.52 ms58.82 ms-47.66% 🟢
    MTTFB 평균적인 변동률 (Average Variability)10.67%7.67%-28.09% 🟢
  • 2024-01-03 RDB b-tree Long type PK indexing

    성능지표 개선수치 확인
    MetricBeforeAfterChange
    Total Tests220,313236,9577.54% 🟢
    Error Rate0.00%(7)0.00%(0)-
    TPS 평균377.24404.367.18% 🟢
    TPS p50390.25420.507.76% 🟢
    TPS p95270.60277.902.69% 🟢
    TPS p9992.5864.34-30.53% 🔴
    TPS p99.934.0543.1726.74% 🟢
    MTTFB 평균496.27 ms456.42 ms-8.03% 🟢
    MTTFB p50480.31 ms431.84 ms-10.07% 🟢
    MTTFB p95882.81 ms799.67 ms-9.41% 🟢
    MTTFB p991163.81 ms1130.67 ms-2.84% 🟢
    MTTFB p99.91225.86 ms1275.62 ms4.06% 🔴
    MTTFB 차이 평균106.51 ms74.02 ms-30.46% 🟢
    MTTFB 평균적인 변동률20.77%15.27%-26.60% 🟢
  • 2024-02-04 RDB Look-Aside + Write-Around caching

    성능지표 개선수치 확인

    img img img

    MetricBeforeAfterChange
    Total Tests12,35616,78836.00% 🟢
    Error Rate0.00%(0)0.00%(0)0 ⚪
    TPS 평균 (Average)228.81310.8935.87% 🟢
    TPS p50240.50307.5027.84% 🟢
    TPS p95162.40282.8574.20% 🟢
    TPS p99107.09237.47121.77% 🟢
    TPS p99.990.36223.55147.24% 🟢
    MTTFB 평균 (Average)438.32 ms324.82 ms-25.93% 🟢
    MTTFB p50432.94 ms323.11 ms-25.27% 🟢
    MTTFB p95733.43 ms380.09 ms-48.14% 🟢
    MTTFB p99912.43 ms471.73 ms-48.31% 🟢
    MTTFB p99.9951.93 ms496.67 ms-47.85% 🟢
    MTTFB 차이 평균 (Average Difference)65.06 ms24.31 ms-62.68% 🟢
    MTTFB 평균적인 변동률 (Average Variability)13.73%7.67%-44.11% 🟢