Chris940915 / geo_benchmark

0 stars 0 forks source link

서버 성능 측정. #20

Open Chris940915 opened 3 years ago

Chris940915 commented 3 years ago

image

서버 성능 측정의 척도는 여러가지 존재.

그 중 2가지가 중요.

클라이언트에겐 응답 시간이 3초 이상이 되면 느리고, 6초 이상이 되면 불편함을 느낀다.

현재 프로젝트 성능 저하가 생기는 것에는 2가지 종류로 정리 가능. 1) 원래 서비스에서도 성능 저하를 일으키는 기능. 2) Migration한 서비스에서만 성능 저하를 일으키는 기능.

1 기능들은 NCC pipeline에 Grafana 혹은 Ngrinder를 이용하여 확인. 2 기능들은 Microbenchmarking(jmh) 을 이용하여 확인. https://www.baeldung.com/java-microbenchmark-harness

먼저 응답 시간을 줄이기 위해 실사용을 통해 느린 부분의 API들을 정리 및 확인.

Chris940915 commented 3 years ago

Byte Array 로 Return 시 성능 떨어짐.

Sample Page - 136초 , 12초

CPU, Memory 그림.

  1. 데이터 return 방식 변경.
  2. RestTemplate, Web....
Chris940915 commented 3 years ago

보안적인 문제인 경로 유출을 막기 위하여 blob으로 image src 가리는 방법 사용.

Chris940915 commented 3 years ago

ModelMapper

앞서 dto mapping에 도움을 주는 라이브러리로 ModelMapper를 사용. 이상하게 성능이 떨어지는 현상 발견.

그래서 dto mapping을 위해 ModelMapper를 사용해도 되는지 확인 수행.

image

각각은 1,000 번의 변환 작업을 하며 총 10번 실행. ModelMapper 가 setter를 이용한 변환에 비하여 느린 성능을 보임.

원인.

검색 결과, API를 호출할때마다 ModelMapper에서 새로운 인스턴스를 생성하며 오용된다. 문제는 사용이 끝난 인스턴스가 GC를 통해 소멸되지 않아 메모리 누수가 발생된 것으로 추정. 이 정도 추정을 통해 ModelMapper를 사용함에 위험이 있다고 판단.

https://www.baeldung.com/java-performance-mapping-frameworks https://github.com/modelmapper/modelmapper/issues/375 https://github.com/arey/java-object-mapper-benchmark

하지만, Object Mapping 라이브러리를 사용하지 않고 직접 다 매핑하는걸로 결론.

사람들이 많이 사용하고 좋다고 하니까 이 기술을 사용하는게 아니라 직접 사용해보고 결론을 내리자.

Chris940915 commented 3 years ago

Spring boot 서버 성능 향상 부분.

image

성능 확인 도중 Spring boot 서버가 기존의 Django 서버에 비해 뛰어난 성능을 보이는 부분이 발견됨. Infer server 와 request/response 과정에서 성능 차이가 발생. (배포된 서비스 기준 0.5 ~ 1.5초) 정확한 원인은 모르겠으나 Spring boot은 RestTemplate, Djnago는 requests 라이브러리 사용.

Chris940915 commented 3 years ago

Django : requests , Spring : restTemplate

두 모듈(라이브러리) 모두 wrapper로 default로 HTTP 1.1 을 이용하며 connection pool 을 끊는다.

Django : 최대 0.712, 최소 0.286, 평균 0.425 Spring : 최대 0.681, 최소 0.282, 평균 0.398

image

서버가 불안정.