728x90

2편에서 이어진다.
영상에서의 텍스트 추출은 Voice2Text를 사용했으며, 텍스트의 정리는 LLM의 도움을 받았다.
GC in Golang
https://youtu.be/EVBFXZhS07E?si=J4pbgVWShF76FSdf
1. 발표 개요
- 주제: Go 언어의 가비지 컬렉션(GC)에 대한 설계와 동작 원리.
- 목표: GC의 기본 알고리즘, 동시성 문제 해결 방법, Go의 GC 특징, 그리고 GC가 트리거되는 방식 등을 이해.
- 대상: GC에 대해 처음 접하는 분부터 깊이 있게 알고 싶은 분까지.
2. GC란 무엇인가?
- 정의: GC는 메모리를 관리하는 방법 중 하나로, 사용하지 않는 메모리를 자동으로 회수하는 역할.
- 장점: 개발자가 직접 메모리를 관리하지 않아도 되며, 메모리 누수 문제를 줄일 수 있음.
- 단점: GC가 실행되는 동안 성능 저하가 발생할 수 있음.
3. Go의 GC 알고리즘: Concurrent Mark and Sweep (CMS)
- CMS: Go의 GC는 Concurrent Mark and Sweep 알고리즘을 사용.
- Mark 단계: 사용 중인 객체와 사용하지 않는 객체를 표시.
- Sweep 단계: 사용하지 않는 객체를 메모리에서 해제.
- 동시성 문제 해결: CMS는 동시성 환경에서도 안정적으로 동작하기 위해 Write Barrier를 사용.
- Write Barrier: 객체가 참조될 때, GC가 이를 감지하고 적절히 처리.
4. Go GC의 특징
- Non-Generational: Go의 GC는 세대별 GC(Generational GC)를 사용하지 않음.
- 모든 객체를 동일하게 관리하며, 세대별로 나누지 않음.
- 장점: 단순성 유지.
- 단점: 메모리 단편화 문제 발생 가능성.
- Non-Compacting: 객체를 메모리에서 이동시키지 않음.
- 객체가 할당된 위치를 변경하지 않음.
- 장점: 객체 이동으로 인한 오버헤드 감소.
- 단점: 메모리 단편화 문제 발생 가능성.
5. 메모리 할당과 단편화 문제
- 메모리 단편화: 메모리가 조각나서 효율적으로 사용되지 않는 현상.
- Go의 해결책: TCMalloc 기반의 메모리 할당자를 사용.
- 스레드별 캐시를 통해 메모리 할당을 효율적으로 관리.
- 작은 객체, 중간 크기 객체, 큰 객체를 각각 다른 방식으로 관리.
6. GC 트리거
- GC 트리거 조건:
- 메모리 사용량이 특정 임계값을 초과할 때.
- 개발자가 직접 runtime.GC()를 호출할 때.
- 메모리 할당이 빈번하게 발생할 때.
- GOGC 환경 변수: GC 실행 주기를 조절할 수 있음.
- 기본값은 100이며, 이 값이 낮을수록 GC가 더 자주 실행됨.
7. GC와 성능
- Stop-the-World (STW): GC 실행 중 애플리케이션이 멈추는 현상.
- Go는 STW 시간을 최소화하기 위해 많은 노력을 기울임.
- 백그라운드 마킹: GC 마킹 작업을 백그라운드에서 실행하여 STW 시간을 줄임.
- CPU 사용량: GC는 CPU 리소스를 약 25~30% 사용.
- 이는 GC가 백그라운드에서 실행되기 때문에 발생.
8. Preemption (선점)
- Preemption: 고루틴이 실행 중에 다른 고루틴으로 CPU를 넘겨주는 메커니즘.
- Go는 Non-Cooperative Preemption을 사용.
- 고루틴이 함수 호출 없이도 CPU를 양보할 수 있도록 설계.
- 이를 통해 Tight Loop Problem (긴 루프로 인한 GC 지연)을 해결.
9. 결론
- Go의 GC는 단순성과 낮은 STW 시간을 목표로 설계됨.
- Concurrent Mark and Sweep 알고리즘을 사용하며, Write Barrier를 통해 동시성 문제를 해결.
- Non-Generational 및 Non-Compacting 방식으로 메모리를 관리.
- TCMalloc 기반의 메모리 할당자를 사용해 메모리 단편화 문제를 최소화.
- Preemption 메커니즘을 통해 고루틴이 CPU를 효율적으로 양보하도록 설계.
10. 추가 리소스
- Go GitHub: Go 런타임 및 GC 관련 코드를 직접 확인 가능.
- 디자인 문서: Go의 GC 설계 결정 과정과 트레이드오프를 설명한 문서.
- 오피스 아워: Go 개발팀과 직접 소통할 수 있는 기회.
Profiling and Tracing Tips in Go: OLAP 데이터베이스를 개발하며 얻은 교훈
https://youtu.be/sUbWWplg9Iw?si=VDBd3-TqpQ1R56Qm
1. 발표 개요
- 주제: Go 언어를 사용한 OLAP 데이터베이스 개발에서의 프로파일링과 트레이싱 팁.
- 목표: 성능 최적화를 위한 프로파일링과 트레이싱 방법을 소개하고, 실제 사례를 통해 얻은 교훈을 공유.
- 대상: Go 개발자, 특히 성능 최적화에 관심이 있는 분들.
2. 루프트(Loopt) 소개
- 루프트: 에어브리지(Airbridge)에서 개발한 OLAP 데이터베이스.
- 목적: 유저 행동 분석에 최적화.
- 처리량: 하루 20억 건 이상의 이벤트 처리.
- 특징: 쿼리, 프로세싱, 스토리지 등 모든 계층이 Go로 작성됨.
- 사용자: 데이터 분석가, 마케터 등.
- 쿼리 특징: 긴 시간 범위(1개월 ~ 1년), 복잡한 집계 쿼리(예: 유니크 유저 카운트, 이벤트 순서 분석 등).
- 반응 속도: 밀리초 단위의 빠른 응답을 요구하지 않음.
3. 성능 최적화 대상 쿼리 선정
- 최적화 대상 선정의 중요성: 잘못된 대상을 선정하면 엔지니어링 리소스가 낭비될 수 있음.
- 선정 기준:
- 매우 느린 쿼리(1분 이상): 사용자가 납득할 만큼 복잡한 쿼리.
- 매우 빠른 쿼리(1초 이하): 사용자가 반응 속도에 민감하지 않음.
- 적당히 빠른 쿼리(P90 ~ P95): 사용자 체감 성능을 개선할 수 있는 쿼리.
- 예: 3개월 데이터 퍼널 조회 쿼리(9초), 1개월 데이터 리텐션 조회 쿼리(13초).
4. Go의 프로파일링과 PProf
- 프로파일링: 프로그램의 실행 시간, 메모리 사용량, 함수 호출 등을 측정하여 최적화를 지원.
- PProf: Go에서 제공하는 프로파일링 도구.
- CPU 프로파일: CPU 사용량 분석.
- 힙 프로파일: 메모리 할당 및 사용량 분석.
- 트레이스: 고루틴 상태, 함수 실행 정보, 블록 프로파일 등 다양한 정보 제공.
- PProf 사용법:
- net/http/pprof 패키지를 임포트하면 HTTP 서버에 자동으로 마운트됨.
- go tool pprof를 통해 CLI 또는 웹 UI에서 프로파일 데이터 분석 가능.
5. 실제 최적화 사례
1. 이그지스트(Exists) 필터 개선
- 문제: string에서 interface{}로의 암시적 형 변환으로 인한 불필요한 메모리 할당.
- 해결: 필터를 최적화하여 형 변환을 제거.
- 결과: 쿼리 응답 속도 22% 개선 (13.5초 → 10.5초).
2. 메모리 사용량 개선
- 문제: 스캔 커서에서 메모리 풀 관리 문제로 인한 과도한 메모리 할당.
- 해결: 메모리 풀 관리 로직 개선 및 불필요한 메모리 복사 제거.
- 결과: 쿼리 응답 속도 51% 개선 (8.5초 → 4.2초).
3. gRPC 스트림 줄이기
- 문제: gRPC 스트림 과도 생성으로 인한 블록킹 문제.
- 해결: 스트림 생성 수를 줄이고, 스트림을 공유하도록 개선.
- 결과: 쿼리 응답 속도 56% 개선 (14.7초 → 6.4초).
4. 글로벌 락 제거
- 문제: 메타데이터 접근 시 글로벌 락 경합으로 인한 성능 저하.
- 해결: 글로벌 락을 제거하고, 더 세밀한 락 관리로 전환.
- 결과: P90 쿼리 응답 시간 62% 개선 (19.9초 → 7.6초).
6. 결론 및 교훈
- 성능 최적화의 핵심: 프로파일링과 트레이싱을 통해 문제를 정확히 진단하고, 적절한 최적화 전략을 수립.
- 실제 적용한 팁:
- 형 변환 최소화: string에서 interface{}로의 불필요한 형 변환을 피하라.
- 메모리 재사용: 메모리 할당을 최소화하고, 가능한 한 재사용하라.
- gRPC 스트림 최적화: 불필요한 스트림 생성을 줄이고, 스트림을 공유하라.
- 락 관리: 글로벌 락 대신 더 세밀한 락 관리 전략을 사용하라.
- 성능 개선 결과:
- 이그지스트 필터 개선: 22% 성능 향상.
- 메모리 사용량 개선: 51% 성능 향상.
- gRPC 스트림 줄이기: 56% 성능 향상.
- 글로벌 락 제거: 62% 성능 향상.
7. 추가 리소스
- PProf 공식 문서: Go의 프로파일링 도구에 대한 자세한 설명.
- 고트레이스 UI: 트레이스 데이터를 시각화하는 오픈소스 도구.
- 루프트 GitHub 저장소: 루프트의 소스 코드 및 개발 과정 확인 가능.
프로메테우스는 어떻게 쿠버네티스의 메트릭을 자동으로 가지고 올까요?
https://youtu.be/47dl9vXdt4o?si=xhTdqHK_NervxsaW
1. 프로메테우스와 쿠버네티스의 관계
- 프로메테우스는 CNCF(Cloud Native Computing Foundation)에서 두 번째로 졸업한 프로젝트로, 2018년에 졸업했으며 현재 프로덕션 환경에서 안정적으로 사용할 수 있는 수준입니다.
- 프로메테우스는 고(Golang) 언어로 작성되었으며, 쿠버네티스 또한 고 언어로 작성되어 있어 두 프로젝트 간의 통합이 매우 자연스럽습니다.
2. 프로메테우스의 아키텍처
- 프로메테우스는 폴링(polling) 방식으로 메트릭을 수집합니다. 즉, 프로메테우스가 주기적으로 대상 서비스에 접근하여 메트릭을 가져옵니다.
- 쿠버네티스의 kubelet과 같은 컴포넌트는 메트릭을 노출하고, 프로메테우스는 이를 수집합니다. 이 과정은 코드 레벨에서 이미 구현되어 있어, 프로메테우스를 배포하면 자동으로 메트릭을 수집할 수 있습니다.
3. 쿠버네티스 메트릭 수집 방식
- 쿠버네티스의 메트릭은 kubelet, kube-proxy, kube-state-metrics 등 다양한 컴포넌트를 통해 노출됩니다.
- 프로메테우스는 이러한 메트릭을 수집하기 위해 **서비스 디스커버리(Service Discovery)**를 사용하여 쿠버네티스 API 서버와 통신하고, 수집 대상을 파악한 후 메트릭을 수집합니다.
4. 메트릭 노출 방식의 분류
- 발표자는 쿠버네티스의 메트릭 노출 방식을 세 가지로 분류했습니다:
- 기본형: kubelet과 같은 기본 컴포넌트가 메트릭을 노출하는 방식.
- 설정형: kube-proxy와 같이 설정을 통해 메트릭을 노출하는 방식.
- 애플리케이션형: MetalLB와 같이 애플리케이션 레벨에서 메트릭을 노출하는 방식.
5. 프로메테우스와 쿠버네티스의 강력한 통합
- 프로메테우스와 쿠버네티스는 코드 레벨에서 강력하게 통합되어 있어, 프로메테우스를 배포하면 쿠버네티스의 메트릭을 자동으로 수집할 수 있습니다.
- 이로 인해 프로메테우스는 쿠버네티스 환경에서 메트릭 수집 도구로 널리 사용되고 있습니다.
6. CNCF 프로젝트와 고(Golang) 언어
- CNCF의 많은 프로젝트(쿠버네티스, 프로메테우스 등)는 고 언어로 작성되어 있습니다. 이는 쿠버네티스가 CNCF의 초기 프로젝트였고, 이후 프로젝트들이 쿠버네티스와의 호환성을 위해 고 언어를 사용한 결과입니다.
7. 프로메테우스 사용 권장
- 발표자는 애플리케이션 개발 시 메트릭을 노출해야 할 경우, 이미 프로메테우스와 같은 도구가 잘 구축되어 있으므로 이를 활용할 것을 권장했습니다. 이를 통해 개발자들은 메트릭 수집과 모니터링을 보다 쉽게 구현할 수 있습니다.
8. 광고 및 스폰서 소개
- 발표자는 메가존소프트가 AWS, GCP, OCI 등 다양한 클라우드 서비스의 MSP(Managed Service Provider)를 제공한다고 소개했습니다. 또한, GCP의 고 언어 친화적인 환경과 빅쿼리, Vertex AI 등의 서비스를 강조했습니다.
결론
- 프로메테우스는 쿠버네티스 환경에서 메트릭을 자동으로 수집할 수 있는 강력한 도구이며, CNCF 프로젝트들은 고 언어로 작성되어 있어 서로 간의 통합이 용이합니다. 개발자들은 프로메테우스를 활용하여 애플리케이션의 메트릭을 쉽게 노출하고 모니터링할 수 있습니다.
728x90
'컨퍼런스 정리' 카테고리의 다른 글
GopherCon Korea 2024 Day 1 정리 (0) | 2025.03.22 |
---|---|
GopherCon Korea 2023 정리 4편(최종) (0) | 2025.03.18 |
GopherCon Korea 2023 정리 2편 (0) | 2025.03.18 |
GopherCon Korea 2023 정리 1편 (0) | 2025.03.18 |