PART 4 Β· κ°•μ˜ 3/4

GC 히치 뢄석

Unreal Insights의 GC 트레이슀λ₯Ό ν™œμš©ν•˜μ—¬ GC 슀파이크의 원인을 μ •ν™•νžˆ μ§„λ‹¨ν•©λ‹ˆλ‹€

SECTION 01

GC 히치의 원인

ν”„λ ˆμž„ λ“œλ‘­μ„ μœ λ°œν•˜λŠ” GC κ΄€λ ¨ μš”μΈλ“€

μ£Όμš” 히치 원인

원인증상해결 λ°©ν–₯
λŒ€λŸ‰ 객체 MarkUObject μˆ˜μ‹­λ§Œ 개Cluster GC, DisregardForGC ν™•λŒ€
λŒ€λŸ‰ 객체 Sweepν•œκΊΌλ²ˆμ— λ§Žμ€ 파괴Incremental Destroy, Pooling
κ°•μ œ Full GCIncremental μ‹€νŒ¨κ°μ²΄ 생성 속도 μ œμ–΄
BeginDestroy μ§€μ—°GPU λ¦¬μ†ŒμŠ€ λŒ€κΈ°λ¦¬μ†ŒμŠ€ 사전 ν•΄μ œ
ν΄λŸ¬μŠ€ν„° 해체외뢀 μ°Έμ‘° λ‹€μˆ˜ν΄λŸ¬μŠ€ν„° 멀버 μ™ΈλΆ€ μ°Έμ‘° μ΅œμ†Œν™”
AddReferencedObjects κ³ΌλΆ€ν•˜λ³΅μž‘ν•œ μ»€μŠ€ν…€ 좔적UPROPERTY둜 μ „ν™˜
GC 히치의 νŠΉμ§•

GC νžˆμΉ˜λŠ” 주기적이고 예츑 λΆˆκ°€λŠ₯ν•©λ‹ˆλ‹€. gc.TimeBetweenPurgingPendingKillObjects 간격(κΈ°λ³Έ 60초)λ§ˆλ‹€ λ°œμƒν•˜κ±°λ‚˜, λ©”λͺ¨λ¦¬ μ••λ°• μ‹œ κ°•μ œ μ‹€ν–‰λ©λ‹ˆλ‹€. μΌκ΄€λœ FPSκ°€ μ€‘μš”ν•œ κ²Œμž„μ—μ„œλŠ” λ°˜λ“œμ‹œ Incremental GCλ₯Ό ν™œμš©ν•΄μ•Ό ν•©λ‹ˆλ‹€.

SECTION 02

Unreal Insights GC 트레이슀

Unreal Insights둜 GC 이벀트λ₯Ό 상세 뢄석

Insightsμ—μ„œ GC 좔적

μ‚¬μš©λ²• // 1. 트레이슀 μ‹œμž‘ // μ»€λ§¨λ“œ 라인: -trace=gc,memory,cpu // λ˜λŠ” μ½˜μ†”: Trace.Start gc,memory,cpu // 2. Unreal Insightsμ—μ„œ 뢄석 // Timing Viewμ—μ„œ GC κ΄€λ ¨ 이벀트 확인: CollectGarbage ← 전체 GC μ‹œκ°„ β”œβ”€β”€ MarkReachable ← Mark 단계 μ‹œκ°„ β”‚ β”œβ”€β”€ GatherRoots ← Root Set μˆ˜μ§‘ β”‚ └── ProcessObjects ← μ°Έμ‘° 순회 β”œβ”€β”€ UnhashUnreachable ← Unreachable μˆ˜μ§‘ └── DestroyGarbage ← 객체 파괴 // 3. 슀파이크 ν”„λ ˆμž„ 뢄석 // 히치 ν”„λ ˆμž„μ„ ν΄λ¦­ν•˜μ—¬ GC 이벀트 상세 확인 // μ–΄λŠ 단계가 κ°€μž₯ 였래 κ±Έλ¦¬λŠ”μ§€ 확인
SECTION 03

CPU ν”„λ‘œνŒŒμΌλ§κ³Ό GC 상관관계

GCκ°€ 전체 ν”„λ ˆμž„ μ‹œκ°„μ— λ―ΈμΉ˜λŠ” 영ν–₯ 뢄석

stat unitκ³Ό GC 히치 μ—°κ΄€

μ½˜μ†” // ν”„λ ˆμž„ μ‹œκ°„ λΆ„ν•΄ stat unit Frame: 25.3 ms ← 총 ν”„λ ˆμž„ μ‹œκ°„ (40fps) Game: 12.1 ms ← κ²Œμž„ 둜직 Draw: 8.2 ms ← λ Œλ”λ§ GPU: 10.5 ms ← GPU Swap: 0.5 ms // GCκ°€ Game μ‹œκ°„μ— 포함됨 // GC 히치 μ‹œ: Frame: 45.3 ms ← 히치! (22fps) Game: 32.1 ms ← κ²Œμž„ 둜직 급증 (GC 포함) Draw: 8.2 ms GPU: 10.5 ms // stat game으둜 상세 λΆ„ν•΄ stat game GarbageCollection: 20.0 ms ← GCκ°€ 원인 ν™•μ •!
히치 둜그 μžλ™ 캑처

t.HitchFrameTimeThreshold을 μ„€μ •ν•˜λ©΄ ν•΄λ‹Ή μ‹œκ°„μ„ μ΄ˆκ³Όν•˜λŠ” ν”„λ ˆμž„μ΄ μžλ™μœΌλ‘œ λ‘œκ·Έμ— κΈ°λ‘λ©λ‹ˆλ‹€. GCκ°€ 원인인 히치λ₯Ό μžλ™ νƒμ§€ν•˜λŠ” 데 μœ μš©ν•©λ‹ˆλ‹€.

SECTION 04

GC 히치 ν•΄κ²° μ „λž΅

원인별 ꡬ체적인 ν•΄κ²° 방법

원인별 ν•΄κ²°μ±…

ν•΄κ²° μ „λž΅ // 원인 1: Mark 단계가 느림 // β†’ Cluster GC ν™œμ„±ν™” gc.CreateGCClusters 1 // β†’ DisregardForGC ν™•λŒ€ gc.MaxObjectsNotConsideredByGC 500000 // β†’ Incremental ν™œμ„±ν™” gc.AllowIncrementalReachability 1 // 원인 2: Sweep/Destroyκ°€ 느림 // β†’ Incremental Destroy ν™œμ„±ν™” gc.IncrementalBeginDestroyEnabled 1 // β†’ Object Pooling λ„μž… // 원인 3: κ°•μ œ Full GC λ°œμƒ // β†’ μž¬μ‹œλ„ 횟수 증가 gc.NumRetriesBeforeForcingGC 20 // β†’ 객체 생성 속도 μ œν•œ // 원인 4: λΆˆν•„μš”ν•œ GC μ‹€ν–‰ // β†’ GC 간격 μ‘°μ • gc.TimeBetweenPurgingPendingKillObjects 120.0 // β†’ μ€‘μš” μˆœκ°„μ— GC μ–΅μ œ GEngine->DelayGarbageCollection();
SUMMARY

핡심 μš”μ•½

이 κ°•μ˜μ—μ„œ 배운 λ‚΄μš©
  • GC 히치의 μ£Όμš” 원인은 λŒ€λŸ‰ Mark, λŒ€λŸ‰ Sweep, κ°•μ œ Full GCμž…λ‹ˆλ‹€
  • Unreal Insights의 GC 트레이슀둜 Mark/Sweep 각 λ‹¨κ³„μ˜ μ†Œμš” μ‹œκ°„μ„ λΆ„μ„ν•©λ‹ˆλ‹€
  • stat unit + stat game으둜 GCκ°€ ν”„λ ˆμž„ μ‹œκ°„μ— λ―ΈμΉ˜λŠ” 영ν–₯을 ν™•μΈν•©λ‹ˆλ‹€
  • 원인별 ν•΄κ²°: Cluster, Incremental, Pooling, GC 간격 μ‘°μ • 등을 μ μš©ν•©λ‹ˆλ‹€
  • DelayGarbageCollection()으둜 μ€‘μš” κ²Œμž„ν”Œλ ˆμ΄ μˆœκ°„μ— GCλ₯Ό μ–΅μ œν•  수 μžˆμŠ΅λ‹ˆλ‹€
PRACTICE

도전 과제

배운 λ‚΄μš©μ„ 직접 μ‹€μŠ΅ν•΄λ³΄μ„Έμš”

μ‹€μŠ΅ 1: GC 히치 μž¬ν˜„ 및 μΈ‘μ •

10,000개의 UObjectλ₯Ό ν•œ λ²ˆμ— 생성 ν›„ μ°Έμ‘° ν•΄μ œν•˜κ³ , ForceGarbageCollection()을 ν˜ΈμΆœν•˜μ—¬ GC 히치λ₯Ό μž¬ν˜„ν•˜μ„Έμš”. stat unit으둜 ν•΄λ‹Ή ν”„λ ˆμž„μ˜ Game Thread μ‹œκ°„ 슀파이크λ₯Ό μΈ‘μ •ν•˜κ³  stat gc와 ꡐ차 λΆ„μ„ν•˜μ„Έμš”.

μ‹€μŠ΅ 2: Unreal Insights둜 GC 타이밍 뢄석

Unreal Insights(utrace)λ₯Ό ν™œμ„±ν™”ν•˜κ³  GCκ°€ λ°œμƒν•˜λŠ” ꡬ간을 μΊ‘μ²˜ν•˜μ„Έμš”. Timing λ·°μ—μ„œ GarbageCollect 이벀트의 μ •ν™•ν•œ μ†Œμš” μ‹œκ°„κ³Ό μ„œλΈŒ νƒœμŠ€ν¬λ³„ 뢄포λ₯Ό λΆ„μ„ν•˜μ„Έμš”.

심화 과제: GC 히치 λ°©μ§€ μ‹œμŠ€ν…œ 섀계

κ²Œμž„ν”Œλ ˆμ΄ 쀑 GC 히치λ₯Ό λ°©μ§€ν•˜κΈ° μœ„ν•œ μ’…ν•© μ‹œμŠ€ν…œμ„ μ„€κ³„ν•˜μ„Έμš”. 객체 풀링, 점진적 ν•΄μ œ, GC 타이밍 μ œμ–΄(gc.TimeLimitSeconds), μ€‘μš” κ΅¬κ°„μ—μ„œμ˜ GC μ–΅μ œ(IsIncrementalPurgePending) 등을 μ‘°ν•©ν•œ μ „λž΅μ„ κ΅¬ν˜„ν•˜μ„Έμš”.