Alert

์ด ๊ธ€์€ Claude Code์˜ ๋„์›€์„ ๋ฐ›์•„ ์ž‘์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค

TL;DR

  • Go 1.25์—์„œ ์‹คํ—˜์  ๋„์ž…, Go 1.26์—์„œ ๊ธฐ๋ณธ ํƒ‘์žฌ๋œ ์ƒˆ GC
  • ๊ธฐ์กด mark-sweep ๋ฐฉ์‹์„ ์œ ์ง€ํ•˜๋˜, ๋ฉ”๋ชจ๋ฆฌ ํŽ˜์ด์ง€ ๋‹จ์œ„๋กœ ์Šค์บ”ํ•˜์—ฌ ์ตœ๋Œ€ 40% GC ์„ฑ๋Šฅ ํ–ฅ์ƒ
  • 512๋ฐ”์ดํŠธ ๋ฏธ๋งŒ ์†Œํ˜• ๊ฐ์ฒด๋ฅผ 8KiB span ๋‹จ์œ„๋กœ ์ฒ˜๋ฆฌํ•˜์—ฌ CPU ์บ์‹œ ํšจ์œจ ๊ฐœ์„ 

Source


1. Mark-Sweep GC๋ž€

Green Tea๋ฅผ ์ดํ•ดํ•˜๋ ค๋ฉด ๋จผ์ € ๊ธฐ์กด mark-sweep ๋ฐฉ์‹์„ ์•Œ์•„์•ผ ํ•œ๋‹ค.

๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ(GC)๋Š” ํ”„๋กœ๊ทธ๋žจ์ด ๋” ์ด์ƒ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ž๋™์œผ๋กœ ํšŒ์ˆ˜ํ•˜๋Š” ์žฅ์น˜๋‹ค. Mark-sweep์€ GC์˜ ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ, ์ด๋ฆ„ ๊ทธ๋Œ€๋กœ ๋‘ ๋‹จ๊ณ„๋กœ ๋™์ž‘ํ•œ๋‹ค.

Mark ๋‹จ๊ณ„

ํ”„๋กœ๊ทธ๋žจ์ด ํ˜„์žฌ ์‚ฌ์šฉ ์ค‘์ธ ๋ณ€์ˆ˜(๋ฃจํŠธ)์—์„œ ์ถœ๋ฐœํ•˜์—ฌ, ํฌ์ธํ„ฐ๋ฅผ ๋”ฐ๋ผ๊ฐ€๋ฉฐ ๋„๋‹ฌํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ๊ฐ์ฒด์— โ€œ์‚ฌ์šฉ ์ค‘โ€ ํ‘œ์‹œ๋ฅผ ํ•œ๋‹ค.

๋ฃจํŠธ ๋ณ€์ˆ˜ โ†’ ๊ฐ์ฒดA โ†’ ๊ฐ์ฒดB โ†’ ๊ฐ์ฒดD
                  โ†’ ๊ฐ์ฒดC

์œ„ ์˜ˆ์‹œ์—์„œ A, B, C, D๋Š” ๋ฃจํŠธ์—์„œ ๋„๋‹ฌ ๊ฐ€๋Šฅํ•˜๋ฏ€๋กœ โ€œ์‚ด์•„์žˆ๋Š”โ€ ๊ฐ์ฒด๋‹ค. ์–ด๋””์„œ๋„ ์ฐธ์กฐํ•˜์ง€ ์•Š๋Š” ๊ฐ์ฒด E๊ฐ€ ์žˆ๋‹ค๋ฉด, mark๋˜์ง€ ์•Š๋Š”๋‹ค.

Sweep ๋‹จ๊ณ„

ํž™ ๋ฉ”๋ชจ๋ฆฌ ์ „์ฒด๋ฅผ ํ›‘์œผ๋ฉด์„œ, mark๋˜์ง€ ์•Š์€ ๊ฐ์ฒด์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํšŒ์ˆ˜ํ•œ๋‹ค. ์œ„ ์˜ˆ์‹œ์—์„œ ๊ฐ์ฒด E๊ฐ€ ์ด ๋‹จ๊ณ„์—์„œ ํ•ด์ œ๋œ๋‹ค.

Mark-Sweep์˜ ํ•œ๊ณ„

๋‹จ์ˆœํ•˜๊ณ  ํ™•์‹คํ•˜์ง€๋งŒ, mark ๋‹จ๊ณ„์—์„œ ๋ชจ๋“  ์‚ด์•„์žˆ๋Š” ๊ฐ์ฒด๋ฅผ ํฌ์ธํ„ฐ๋กœ ๋”ฐ๋ผ๊ฐ€์•ผ ํ•œ๋‹ค๋Š” ์ ์ด ์„ฑ๋Šฅ ๋ณ‘๋ชฉ์ด๋‹ค. ๊ฐ์ฒด๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ ๊ณณ๊ณณ์— ํฉ์–ด์ ธ ์žˆ์œผ๋ฉด, ํฌ์ธํ„ฐ๋ฅผ ๋”ฐ๋ผ๊ฐˆ ๋•Œ๋งˆ๋‹ค CPU ์บ์‹œ ๋ฏธ์Šค๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.


2. ํฌ์ธํ„ฐ ์ถ”์ (Pointer Chasing)์˜ ๋ฌธ์ œ

Mark ๋‹จ๊ณ„์—์„œ GC๋Š” ๊ฐ์ฒด ์•ˆ์˜ ํฌ์ธํ„ฐ๋ฅผ ์ฝ๊ณ , ๊ทธ ํฌ์ธํ„ฐ๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋‹ค์Œ ๊ฐ์ฒด๋กœ ์ ํ”„ํ•˜๋Š” ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•œ๋‹ค. ์ด๊ฒƒ์ด **ํฌ์ธํ„ฐ ์ถ”์ (pointer chasing)**์ด๋‹ค.

๊ฐ์ฒดA (์ฃผ์†Œ 0x1000) โ†’ ํฌ์ธํ„ฐ โ†’ ๊ฐ์ฒดB (์ฃผ์†Œ 0x8F00) โ†’ ํฌ์ธํ„ฐ โ†’ ๊ฐ์ฒดC (์ฃผ์†Œ 0x2400)

๋ฌธ์ œ๋Š” ๊ฐ์ฒด๋“ค์ด ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์—ฐ์†๋œ ์œ„์น˜์— ์žˆ์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ๊ฐ์ฒด๊ฐ€ ํ• ๋‹นยทํ•ด์ œ๋ฅผ ๋ฐ˜๋ณตํ•˜๋ฉด ํž™ ์ „์ฒด์— ํฉ์–ด์ง€๊ฒŒ ๋˜๊ณ , ๋‹ค์Œ ๊ฐ์ฒด์˜ ์ฃผ์†Œ๊ฐ€ ์˜ˆ์ธก ๋ถˆ๊ฐ€๋Šฅํ•œ ์œ„์น˜๋กœ ์ ํ”„ํ•œ๋‹ค. ์ด๊ฒƒ์ด ๋žœ๋ค ํฌ์ธํ„ฐ ์ถ”์ ์ด๋‹ค.

CPU๋Š” ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ฝ์„ ๋•Œ ์ฃผ๋ณ€ ๋ฐ์ดํ„ฐ๋ฅผ ์บ์‹œ ๋ผ์ธ(๋ณดํ†ต 64๋ฐ”์ดํŠธ) ๋‹จ์œ„๋กœ ํ•จ๊ป˜ ๊ฐ€์ ธ์˜จ๋‹ค. ์—ฐ์†๋œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ฝ์œผ๋ฉด ์ด๋ฏธ ์บ์‹œ์— ์˜ฌ๋ผ์™€ ์žˆ์–ด ๋น ๋ฅด์ง€๋งŒ, ๋žœ๋คํ•œ ์ฃผ์†Œ๋กœ ์ ํ”„ํ•˜๋ฉด ๋งค๋ฒˆ ๋ฉ”์ธ ๋ฉ”๋ชจ๋ฆฌ๊นŒ์ง€ ๊ฐ€์•ผ ํ•œ๋‹ค.

  • ์บ์‹œ ํžˆํŠธ (L1 ์บ์‹œ): ~1ns
  • ์บ์‹œ ๋ฏธ์Šค (๋ฉ”์ธ ๋ฉ”๋ชจ๋ฆฌ): ~100ns

100๋ฐฐ ์ฐจ์ด๊ฐ€ ๋‚˜๊ธฐ ๋•Œ๋ฌธ์—, ๊ฐ์ฒด๊ฐ€ ์ˆ˜๋ฐฑ๋งŒ ๊ฐœ์ธ ํ”„๋กœ๊ทธ๋žจ์—์„œ GC ์„ฑ๋Šฅ์ด ํฌ๊ฒŒ ์ €ํ•˜๋œ๋‹ค.


3. Green Tea GC์˜ ์ ‘๊ทผ

Go 1.26๋ถ€ํ„ฐ ๊ธฐ๋ณธ ํ™œ์„ฑํ™”๋œ ์ƒˆ๋กœ์šด ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ๋‹ค. ๊ธฐ์กด GC์™€ ๋™์ผํ•œ mark-sweep ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜์ง€๋งŒ, ๊ฐœ๋ณ„ ๊ฐ์ฒด๊ฐ€ ์•„๋‹Œ ๋ฉ”๋ชจ๋ฆฌ ํŽ˜์ด์ง€ ๋‹จ์œ„๋กœ ์Šค์บ”ํ•˜์—ฌ ๋žœ๋ค ํฌ์ธํ„ฐ ์ถ”์  ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•œ๋‹ค.

  • ์ „์—ญ ์ˆ˜์ค€์—์„œ๋Š” ํŽ˜์ด์ง€ ๋‹จ์œ„๋กœ ์ถ”์ 
  • ํŽ˜์ด์ง€ ๋‚ด๋ถ€์—์„œ๋Š” ๊ฐœ๋ณ„ ๊ฐ์ฒด๋ฅผ ๋กœ์ปฌ๋กœ ์ถ”์ 
  • 512๋ฐ”์ดํŠธ ๋ฏธ๋งŒ ์†Œํ˜• ๊ฐ์ฒด๋ฅผ 8KiB span ๋‹จ์œ„๋กœ ๋ฌถ์–ด์„œ ์ฒ˜๋ฆฌ

๊ธฐ์กด GC๊ฐ€ ๊ฐ์ฒดA โ†’ ๊ฐ์ฒดB โ†’ ๊ฐ์ฒดC๋ฅผ ํฌ์ธํ„ฐ๋กœ ํ•˜๋‚˜์”ฉ ์ซ“์•„๊ฐ”๋‹ค๋ฉด, Green Tea๋Š” 8KiB ํŽ˜์ด์ง€ ์•ˆ์˜ ๊ฐ์ฒด๋“ค์„ ์ˆœ์„œ๋Œ€๋กœ ์ญ‰ ์Šค์บ”ํ•œ๋‹ค. ๋žœ๋ค ์ ํ”„ ๋Œ€์‹  ์ˆœ์ฐจ ์ฝ๊ธฐ๊ฐ€ ๋˜๋ฏ€๋กœ CPU ์บ์‹œ ํ”„๋ฆฌํŽ˜์นญ์ด ๋™์ž‘ํ•˜๊ณ , ์บ์‹œ ํžˆํŠธ์œจ์ด ์˜ฌ๋ผ๊ฐ„๋‹ค.


4. ์„ฑ๋Šฅ ๊ฐœ์„ 

  • ๋Œ€๋ถ€๋ถ„์˜ ์›Œํฌ๋กœ๋“œ์—์„œ GC ์‹œ๊ฐ„ ์•ฝ 10% ๊ฐ์†Œ
  • ์ผ๋ถ€ ์›Œํฌ๋กœ๋“œ์—์„œ ์ตœ๋Œ€ 40% ๊ฐ์†Œ
  • ์ตœ์‹  AMD64 CPU์—์„œ ์ถ”๊ฐ€ 10% ๊ฐœ์„  ๊ธฐ๋Œ€

5. ์ ์šฉ ๋ฐฉ๋ฒ•

Go 1.26์—์„œ๋Š” ๊ธฐ๋ณธ ํ™œ์„ฑํ™”๋˜์–ด ๋ณ„๋„ ์„ค์ •์ด ํ•„์š” ์—†๋‹ค.

# Go 1.25์—์„œ ์‹คํ—˜์  ์‚ฌ์šฉ
GOEXPERIMENT=greenteagc go build
 
# Go 1.26์—์„œ ๋น„ํ™œ์„ฑํ™” (์˜ตํŠธ์•„์›ƒ, 1.27์—์„œ ์ œ๊ฑฐ ์˜ˆ์ •)
GOEXPERIMENT=nogreenteagc go build