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