GO · 성능
GC 튜닝
GOGC와 GOMEMLIMIT 환경 변수로 가비지 컬렉터 동작을 조정합니다.
성능고급gcgogcgomemlimittuning
핵심 설명
GOGC와 GOMEMLIMIT 환경 변수로 가비지 컬렉터 동작을 조정합니다.
Go code
package main
import (
"fmt"
"runtime"
"runtime/debug"
)
func main() {
// 현재 GC 설정 확인
fmt.Println("GOGC:", debug.SetGCPercent(-1))
debug.SetGCPercent(100) // 기본값 복원
// GC 통계
var stats debug.GCStats
debug.ReadGCStats(&stats)
fmt.Printf("GC 횟수: %d\n", stats.NumGC)
if len(stats.Pause) > 0 {
fmt.Printf("마지막 GC 일시정지: %v\n", stats.Pause[0])
}
// GOMEMLIMIT 설정 (Go 1.19+)
// 컨테이너 환경에서 메모리 제한
debug.SetMemoryLimit(512 * 1024 * 1024) // 512MB
// 메모리 통계
var m runtime.MemStats
runtime.ReadMemStats(&m)
fmt.Printf("힙 사용: %d MB\n", m.HeapAlloc/1024/1024)
fmt.Printf("힙 시스템: %d MB\n", m.HeapSys/1024/1024)
fmt.Printf("GC CPU 비율: %.2f%%\n", m.GCCPUFraction*100)
fmt.Println("\n환경 변수:")
fmt.Println(" GOGC=200 # GC 빈도 감소 (메모리 ↑, CPU ↓)")
fmt.Println(" GOGC=50 # GC 빈도 증가 (메모리 ↓, CPU ↑)")
fmt.Println(" GOMEMLIMIT=512MiB # 메모리 제한 (Go 1.19+)")
fmt.Println(" GOGC=off GOMEMLIMIT=1GiB # 소프트 메모리 제한만 사용")
}학습 팁
GOMEMLIMIT과 GOGC=off를 함께 사용하면 메모리 한도 내에서 GC를 최소화하여 처리량을 극대화합니다.
주의할 점
GOGC=off만 설정하면 메모리가 무한히 증가합니다. 반드시 GOMEMLIMIT과 함께 사용하세요.
자주 묻는 질문
GC 튜닝란 무엇인가요?
GOGC 와 GOMEMLIMIT 환경 변수로 가비지 컬렉터 동작을 조정합니다.
GC 튜닝 학습 시 주의할 점은 무엇인가요?
GOGC=off 만 설정하면 메모리가 무한히 증가합니다. 반드시 GOMEMLIMIT 과 함께 사용하세요.