Notice
Recent Posts
Recent Comments
Link
Archives
Today
Total
관리 메뉴

카레제육 블로그

GopherCon Korea 2024 - Image 서버 성능 72% 개선, 백경준 본문

Daily

GopherCon Korea 2024 - Image 서버 성능 72% 개선, 백경준

kare jeyuk 2024. 10. 15. 12:43

 

10월 12일에 이루어진 고퍼콘에 대한 요약 내용이다. 세션에 직접 참여하지는 못했지만 온라인 영상을 통해 내용을 확인할 수 있었다.
두 번째 세션은 백패커의 데브옵스 개발자 백경준님의 성능 최적화와 테스트에 관한 발표였다.

Image 서버 성능 72% 개선

이런 분들에게 도움이 됩니다 !!

  • 레거시 서비스를 빠르게 Golang으로 마이그레이션하고 싶으신 분
  • Golang의 장점은 알지만 실제 적용에 어려움을 겪고 계신 분
  • Go 애플리케이션의 이미지 처리와 컨테이너 환경 운영에 관심 있는 분

테스트하기

golang 백엔드 프레임워크

프레임워크 성숙도
(Github Star, Fork, etc ... )
성능 기타 특징
Gin 매우 성숙 보통 좋은 문서화
Echo 성숙 보통 다양한 플러그인을 통한 확장 용이
Fiber 중간 높음 빠른 성능

 

PHP vs Golang 가설

  • Golnag을 사용하면, Image 서버의 속도가 더 빨라질 것이다.
    -> 일반적으로 인터프리터 언어인 PHP보다 컴파일 언어인 Golang의 실행속도가 빠르다.
  • Golang을 사용하면, Image 서버의 리소스 사용량이 더 적어질 것이다.
    -> 정적 컴파일과 경량 스레드를 지원하기 때문

부하 테스트 구성

LOCUST를 사용하여 동일한 부하를 높여 준다.

결과: Golang이 Request throughput, Latency, CPU, Memory 모든 면에서 뒤쳐지는 모습을 보였다!!
가설이 다 틀림. 왜?

-> 이미지 리사이징에서 bottleneck 현상이 발생하는것을 발견했다. go에서 사용한 nfnt/resize이 적절하지 못했다는것을 발견, c언어 기반으로 동작하는 libvips를 사용하기로 변경! 그 결과..

  • Request throughput은 비슷했지만, Latency에서 압도적으로 큰 효과를 얻을 수 있었다. CPU, Memory 또한 매우 양호.

배포 전략

문제 발생 시 빠른 롤백이 가능한 환경 구성하기

최소한의 리소스로 만드는 것이 목표이므로 검증도 신속하게 진행하기

안정성을 위해 점진적으로 배포하기

  • 카나리 방식으로 트래픽 전달. Istio Virtural Service를 통해 동일한 Endpoint에 Weight 조정으로 빠르게 롤백 가능하도록 구성

성능 개선 결과

  • Resource 비용 및 사용률: 요청당 평균 vCPU 사용량 74.7% 개선
  • Latency: 평균 응답 시간 43.21%, p50 44.64%, p75 52.84%, p99 33.30% 개선
  • CI/CD: go는 빌드가 빨라. 실행 시간 74.03%, 빌드 크기 86.67% 개선

Golang 컨테이너 환경 최적화 Tip !!

func GOMAXPROCS(n int) int

go언어 내부에 존재하는 gomaxprocedure가 있다. 이것은 go 런타임에서 최대로 사용할 수 있는 CPU 수를 지정할 수 있다.

  • GO 1.5 >=
    default: node 전체의 vCPU = GOMAXPROCS
    예) 16vCPU node의 경우, GOMAXPROCS=16
  • GO 1.5 <
    default: GOMAXPROCS=1

GOMAXPROCS를 임의로 설정해야하는 경우

하나의 노드에서 여러개 서비스의 동작으로인해 제한이 필요

 

1. automaxprocs (Uber의 오픈소스)
CPU Limit 값을 기준으로 GOMAXPROCS 값을 자동으로 설정

 

2. 환경변수 설정 GOMAXPROCS

설정 값은 0.x 단위를 올림하여 적용된다. 예) 1500m -> 2 CPU

 

안정적인 GOMAXPROCS 설정값 찾기

설정값에 따라 수치 차이가 발생하는 이유는? 할당된 CPU 수 (CPU Limit)가 런타임에 사용하는 CPU 최대 수 (GOMAXPROCS) 보다 작기 때문에 Context Switch 부하 발생

-> GOMAXPROCS의 적정값 할당은 P95, P99 등의 Latency를 개선해줄 수 있다.