Performance Engineering on Hard Mode with Andrew Hunter: Summary
Performance Engineering on Hard Mode
์ด ํฌ์คํธ๋ Jane Street์ ๊ธฐ์ ํ์บ์คํธ Signals and Threads์ 18๋ฒ์งธ ์ํผ์๋ โPerformance Engineering on Hard Modeโ์ ๋ด์ฉ์ ํ์ต ๋ฐ ๊ณต์ ๋ชฉ์ ์ผ๋ก ์์ธํ๊ฒ ์ ๋ฆฌํ ๊ธ์ ๋๋ค.
๊ตฌ๊ธ์ tcmalloc ํ
ํฌ ๋ฆฌ๋ ์ถ์ ์ด์ ํ์ฌ Jane Street์ ๋ง์ผ ๋ฐ์ดํฐ ํ์์ ๊ทผ๋ฌดํ๊ณ ์๋ ์ค๋๋ฅ ํํฐ(Andrew Hunter)์ ์งํ์ ๋ก ๋ฏผ์คํค(Ron Minsky)๊ฐ ๋๋ ๋๋ด์ ๋ฐํ์ผ๋ก ์์ฑ๋์์ต๋๋ค. ํ์ดํผ์ค์ผ์ผ ์ต์ ํ์ ๋ ์ดํด์ ๋ฏผ๊ฐํ ํธ๋ ์ด๋ฉ ์ต์ ํ์ ๊ทผ๋ณธ์ ์ฐจ์ด, ํ๋กํ์ผ๋ง ๋๊ตฌ์ ๋์ ์๋ฆฌ, OCaml๊ณผ C++์ ๋ฉ๋ชจ๋ฆฌ ๋ชจ๋ธ ๋์กฐ, ๊ทธ๋ฆฌ๊ณ ํ๋์จ์ด ์ํคํ
์ฒ์ ๊ฐ๋ฐ ๋ฐ๋ณต ์ฃผ๊ธฐ๊ฐ ์ฑ๋ฅ ์์ง๋์ด๋ง์ ๋ฏธ์น๋ ์ํฅ ๋ฑ์ ์ ๋ฆฌํ์ต๋๋ค.
1. ์ฑ๋ฅ ์์ง๋์ด๋ง์ ์ธ๊ณ์ ๋๊ธฐ (The World and Motivation of Performance Engineering)
์ฑ๋ฅ ์์ง๋์ด๋ง์ด๋ผ๋ ๊ณ ๋์ ๊ธฐ์ ์์ญ์ ์ ๋ฌธํ๋ ๋๊ธฐ์ ์ง๋ฃจํด ๋ณด์ด๋ ์ ์์ค ์ธ๋ถ ์ฌํญ์ ํํค์น๋ ํ์ต ํ๋์ ๊ดํ ์ ๋ฆฌ์ ๋๋ค.
- ์ฑ๋ฅ ์์ง๋์ด๋ง์ ์ค๋
์ฑ๊ณผ ๋๊ธฐ (The Addictive Nature of Performance Optimization)
- ์ ๊ธฐ์ ์ธ ํฌ์ด(Electric High): ๋ณต์กํ ์ฝ๋๋ ์์คํ ์ ํ๋กํ์ผ๋งํ๊ณ ๊ฐ์ ํ์ฌ ์คํ ์๋๋ฅผ ๋ ๋น ๋ฅด๊ฒ ๋ง๋ค์์ ๋ ๋ง๋ณด๋ ์ง์ ์ ์ธ ์ฑ์ทจ๊ฐ๊ณผ ์๋๋ ๋ ๋ฆฐ์ด ๋๋ ฅ์ ๋๋ค.
- ์ธ๋ถ ์ฌํญ์ ๋ํ ์ด์ : ์ผ๋ฐ ๊ฐ๋ฐ์ ๊ด์ ์์๋ ๋ค์ ์ง๋ฃจํ๊ฑฐ๋ ๋ณต์กํ๊ฒ ๋๊ปด์ง๋ CPU์ ์๋ ๋ฐฉ์, ๋ฉ๋ชจ๋ฆฌ ๋ฒ์ค ์ธํฐ์ปค๋ฅํธ, ์ปดํ์ผ๋ฌ ์งํ, ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ๋งคํ ๋ฑ์ ํ๋ถ ๋ํ ์ผ์ ๋ํด ๊น์ ํธ๊ธฐ์ฌ์ ๊ฐ๋ ๊ฒ์ด ํต์ฌ ๊ฒฝ์๋ ฅ์ ๋๋ค.
- ๊น์ด ์๋ ์ง๋ฌธ๊ณผ ์์ค ์ฝ๋ ๋ถ์ (Deep Investigation Without Boundaries)
- ํ์ต ๋ฐฉ์: ์ด์์ฒด์ (OS) ์์ ์ ๋ค์ ๋ ๊ต๊ณผ์์๋ง ๋จธ๋ฌด๋ฅด์ง ์๊ณ , ๋ฆฌ๋ ์ค์ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ(Virtual Memory) ๊ตฌํ ์์ค ์ฝ๋๋ฅผ ๋๊น์ง ์ด์ด๋ณด๋ ์ง์ํจ์ด ์ง์์ ๊ธฐ๋ฐ์ ํ์ฑํฉ๋๋ค.
- โ๋ฒ์ ๋ฐ(Out of scope)โ ๋ถ์ : ๋ถ์ ์ค ๋ง๋ฅ๋จ๋ฆฌ๋ ์๋ฌธ์ ๋ํด โ์ด๊ฒ์ ๋ด๊ฐ ์ ํ์ ์๋ ์ ์์ค ์์ญ์ด๋คโ๋ผ๊ณ ์ ์ ๊ธ์ง ์๊ณ , ํ๋์จ์ด์ ์ปค๋ ๊น์ํ ๊ณณ๊น์ง ์ง๋ฌธ์ ๋์ง๋ฉฐ ์์คํ ์ ์ฒด์ ๋งค์ปค๋์ฆ์ ํ์ ํด์ผ ํฉ๋๋ค.
- ๋ํ์ ํ์ ์ฐ๊ตฌ vs. ์ค์ ํ๋ก๋์
๋ฐ์ดํฐ (Academia vs. Industrial Reality)
- ํ๊ณ์ ์ฐ๊ตฌ: ํน์ ์์ด๋์ด๋ ์๋ก์ด ์ํํธ์จ์ด/ํ๋์จ์ด ์ค๊ณ๋ฅผ ๋ ผ๋ฌธ์ผ๋ก ๋ฐํํ๊ณ ๊ฒ์ฆํ๋ ๋ฐ ์ด์ ์ ๋ง์ถ์ง๋ง, ๋ฐํ ์ดํ ์ฝ๋๋ ์ผํ์ฑ์ผ๋ก ์ฌ๋ผ์ง๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค.
- ์ฐ์ ํ์ฅ์ ์ค์ ์์คํ : ์ฝ๋๊ฐ ์ค์ ์ฌ์ฉ์์ ๋ฐ์ดํฐ์ ํธ๋ํฝ ํ์ ๋ฐฐํฌ(Rollout)๋ ์ดํ ํผ๋๋ฐฑ์ด ์ค๊ธฐ ์์ํฉ๋๋ค. ์์คํ ๋ฐฐํฌ ์ดํ ๋ฐ์ํ๋ ๊ธฐ์ดํ ์ฃ์ง ์ผ์ด์ค๋ค์ ์ง์์ ์ผ๋ก ํจ์นํ๊ณ ๊ธฐ๋ฅ์ ๊ฐ์ ํ๋ ๊ธฐ๋๊ธด ํผ๋๋ฐฑ ๋ฃจํ๊ฐ ์ง์ ํ ์์ง๋์ด๋ง ์ญ๋์ ์ฑ์ฅ์ํต๋๋ค. โ์ฝ๋๋ฅผ ์ ์ถํ๊ณ A ํ์ ์ ๋ฐ์ ๋๋๋ ๋ํ ๊ณผ์ โ์ ๊ฐ์ ๋ง์ธ๋์์ ๋ฒ์ด๋๋ ๊ฒ์ด ํ๋ก๋ก์์ ์ฒซ๊ฑธ์์ ๋๋ค.
2. ํ์ดํผ์ค์ผ์ผ(Hyperscale) vs. ๋ ์ดํด์ ๋ฏผ๊ฐํ(Low-Latency) ์ต์ ํ
์น ์๋น์ค ์ค์ฌ์ ๋น ํ ํฌ ๊ธฐ์ ๋ค์ด ๋ค๋ฃจ๋ ํ์ดํผ์ค์ผ์ผ ์์คํ ์ต์ ํ(์ด์ง ๋ชจ๋)์ ํธ๋ ์ด๋ฉ ์์คํ ๊ณผ ๊ฐ์ ๊ทน๋จ์ ์ธ ๋ ์ดํด์ ์ ์ฝ ํ์ ์์คํ ์ต์ ํ(ํ๋ ๋ชจ๋)์ ๊ทผ๋ณธ์ ์ธ ํ๊ฒฝ ์ฐจ์ด๋ฅผ ๋น๊ตํฉ๋๋ค.
- ํ์ดํผ์ค์ผ์ผ ์ธํ๋ผ ์ต์ ํ: โ์ด์ง ๋ชจ๋(Easy Mode)โ
- ๊ตฌ๊ธ์ tcmalloc ์ฌ๋ก: Andrew๋ ๊ตฌ๊ธ์์ 7๋
๊ฐ ๋ฉํฐ์ค๋ ๋ ์ํคํ
์ฒ๋ฅผ ์ฐ๊ตฌํ๊ณ ๊ตฌ๊ธ ์ ์ฌ์ ์ฑ๋ฅ์ ์ฃผ์ถ์ด ๋๋ ํ์ฅ์ฑ ๋์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ธ
tcmallocํ๋ก์ ํธ์ ํ ํฌ ๋ฆฌ๋๋ก ํ์ฝํ์ต๋๋ค. - ๋์ ์ง๋ ๋ ํจ๊ณผ(Leverage): ๊ตฌ๊ธ์ด๋ ๋ฉํ์ ๊ฐ์ด ์๋ฐฑ๋ง ๋์ ์๋ฒ๋ฅผ ์ด์ํ๋ ํ๊ฒฝ์์๋ ๋จ 0.5%์ CPU ์ฑ๋ฅ ๊ฐ์ ๋ง์ผ๋ก๋ ์์ฒ๋ง ๋ฌ๋ฌ์ ์๋ฒ ๊ตฌ๋งค ๋น์ฉ ๋ฐ ์ ๋ ฅ ์๊ธ์ ์๋ ์ ์์ต๋๋ค.
- ๋ฐ์ดํฐ ์ผํฐ ํ์ค(Data Center Tax): ๋๊ท๋ชจ ์์คํ ์ฌ์ดํด์ ์ฝ 10~20%๋ ๋ฉ๋ชจ๋ฆฌ ํ ๋น(malloc), ์ง๋ ฌํ(serialization), ๋ก๊น (logging), ์ปดํ์ผ ์ต์ ํ, ์์ถ ๋ฑ ๊ณตํต ์ธํ๋ผ ์ํํธ์จ์ด๊ฐ ์๋นํฉ๋๋ค.
- ํ๊ฒ ๋ฐ์ง ํ๊ฒฝ(Target-Rich Environment): ๊ณตํต ์ธํ๋ผ์ ์์ฃผ ์ผ๋ถ๋ถ๋ง ๊ฐ์ ํด๋ ์ ์ฒด ์๋ฒ ํ์ ๋น์ฉ ์ ๊ฐ์ผ๋ก ์ด์ด์ง๋ฏ๋ก, ํ๋กํ์ผ๋ฌ ์์ ๋์ ๋ณด์ด๋ ํซ์คํ(Hotspot)์ ์์ฐจ์ ์ผ๋ก ์ ๊ฑฐํด ๋๊ฐ๋ ์ง๊ด์ ์ธ ์์ ์ด ๊ฐ๋ฅํฉ๋๋ค. ์ด๋ก ์ธํด ์ต์ ํ ์์ฒด์ ๋์ด๋์๋ ๋ณ๊ฐ๋ก โ๋ฌด์์ ๊ฐ์ ํด์ผ ํ๋๊ฐโ์ ๋ํ ํ๋จ์ด ๋ช ํํ๋ฏ๋ก โ์ด์ง ๋ชจ๋โ๋ผ๊ณ ์ง์นญํฉ๋๋ค.
- ๊ตฌ๊ธ์ tcmalloc ์ฌ๋ก: Andrew๋ ๊ตฌ๊ธ์์ 7๋
๊ฐ ๋ฉํฐ์ค๋ ๋ ์ํคํ
์ฒ๋ฅผ ์ฐ๊ตฌํ๊ณ ๊ตฌ๊ธ ์ ์ฌ์ ์ฑ๋ฅ์ ์ฃผ์ถ์ด ๋๋ ํ์ฅ์ฑ ๋์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ธ
- ๋ ์ดํด์ ๋ฏผ๊ฐํ ํธ๋ ์ด๋ฉ ์ต์ ํ: โํ๋ ๋ชจ๋(Hard Mode)โ
- ์ง์ฐ ์๊ฐ๊ณผ ๊ผฌ๋ฆฌ ๋ ์ดํด์(Tail Latency) ์ค์ฌ: ๋ฐ์ดํฐ ์ผํฐ์ ์ด CPU ์ฒ๋ฆฌ๋์ 1% ๊ฐ์ ํ๋ ๊ฒ์ ํธ๋ ์ด๋ฉ์์ ๊ฑฐ์ ๋ฌด๊ฐ์นํฉ๋๋ค. ์ค์ํ ๊ฒ์ ๊ฐ์ฅ ๋ฐ์ ๊ฑฐ๋ ์๊ฐ(Burst context)์ ์์คํ ์ด ๋ฐ์ํ๋ ๊ทน์์์ ์ต์ ์ง์ฐ ์๊ฐ(ํ ์ผ ๋ ์ดํด์)์ ๊น์๋ด๋ ๊ฒ์ ๋๋ค.
- ์๋์ ๋ฌด์(Intentional Idling): ๊ณ ์ฑ๋ฅ ํธ๋ ์ด๋ฉ ์์คํ ์ ์ปค๋ ๋ชจ๋ ์ ํ์ ์ง์ฐ์ ๋ง๊ธฐ ์ํด ์ ์ ๊ณต๊ฐ ํด๋ง IO(User Space Polling IO) ๋ฐฉ์์ ์ทจํฉ๋๋ค. ์ฆ, CPU ์ฝ์ด๋ฅผ 100% ์ ์ ํ๋ฉฐ ๋ฌดํ ๋ฃจํ๋ฅผ ๋๋ฉฐ ํจํท ์ ์ ์ ๋๊ธฐํ๋ฏ๋ก, ์ผ๋ฐ ํ๋กํ์ผ๋ฌ๋ฅผ ๋๋ฆฌ๋ฉด 95~99%์ ์๊ฐ ๋์ โ์๋ฌด๊ฒ๋ ํ์ง ์์(idle spinning)โ์ผ๋ก ์ง๊ณ๋์ด ๋ถ์์ด ์ด๋ ต์ต๋๋ค.
- ๊ตฌ์ฒด์ ์ธ ๋๊ธฐ ๋ ์ดํด์ ๋ณ๋ชฉ ์ฌ๋ก:
send_order์ฐ์ฐ ์์ฒด๋ ํ๋กํ์ผ๋ฌ ๋ถ์ ๊ฒฐ๊ณผ CPU ์ฌ์ดํด ์๋ชจ์จ์ด 5% ๋ฏธ๋ง์ธ ๊ฐ๋ฒผ์ด ์์ ์ผ๋ก ๋ํ๋ฌ์ผ๋, ์ค์ ๋น์ฆ๋์ค ๋ก์ง ํ๋จ ์ดํ ๋คํธ์ํฌ๋ก ์ ์ก๋๊ธฐ๊น์ง 200๋ง์ดํฌ๋ก์ด๋ ์์๋๋ ๋ณ๋ชฉ์ด ์์์ต๋๋ค. ์์ธ์ ์ฑ๋ฅ์ ์น๋ช ์ ์ด์ง ์์ ํธ๋ํฝ์ผ ๊ฒ์ด๋ผ๋ ์๋ API ์ค๊ณ ์์ ๊ฐ์ ๋๋ฌธ์ ์ ์ฐ์ ์์ ํ(Low Priority Queue)์ ๋ฉ์์ง๊ฐ ์์ฌ ์ง์ฐ๋ ํ์ด์์ต๋๋ค. ์ด๋ ํต๊ณ์ CPU ํ๋กํ์ผ๋ฌ๋ก๋ ํฌ์ฐฉ์ด ๋ถ๊ฐ๋ฅํ๋ฉฐ, ๋ค์์ ์ธ๊ธํ Retrospective Tracing ๋๊ตฌ๋ฅผ ์ฌ์ฉํด eager API๋ก ์ฆ์ ๊ต์ฒดํจ์ผ๋ก์จ ํด๊ฒฐ๋์์ต๋๋ค. - โ์ธก์ ์ ์ต์ ํ ๊ธ์งโ ๊ฒฉ์ธ์ ๋์ด์๋ ๊ธฐ๋ณธ ๋ง์ธ๋์ : Andrew๋ ํ๋ถ ์์ ๊ต์๋ค์ด ๊ฐ์กฐํ๋ โ์ธก์ ํ๊ณ ๋ณ๋ชฉ์ ํ์ธํ๊ธฐ ์ ์๋ ์ ๋ ์ต์ ํํ์ง ๋ง๋ผโ๋ ๋๋ฆฌ ํผ์ง ๊ฒฉ์ธ์ด ๊ณ ์ฑ๋ฅ ์์คํ ์์ญ์์๋ ์๋ชป๋์๋ค๊ณ ์ฃผ์ฅํฉ๋๋ค. ๊ณ ์ฑ๋ฅ์ด ์ ์ ๋์ด์ผ ํ๋ ํต์ฌ ์์คํ ์ ๊ตฌ์ถํ ๋๋, ์ฝ๋๊ฐ ๋๋ฌด ๋ณต์กํ๊ฑฐ๋ ์ํํด์ง์ง ์๋ ์ ์์ ์ฝ๋ฉ ์์ ๋ถํฐ ํญ์ ์ฑ๋ฅ์ ํจ์จ์ ์ธ ๋ฐฉ์์ ๋ ์์ ๊ธฐ๋ณธ ์ค์ (Default)์ผ๋ก ์ ํํ๋ ์์จ ๊ท์จ์ ์ฒดํํด์ผ ํฉ๋๋ค.
- ๊ธฐ๊ณ์ ๋๊ฐ(Mechanical Sympathy)์ ๋ณธ์ง: ์ด ์ฉ์ด๋ ์ ์ค์ ์ธ F1 ๋ ์ด์ฑ ๋๋ผ์ด๋ฒ์ธ ์ฌํค ์คํ์ดํธ(Jackie Stewart)๊ฐ ์ฃผ์ฐฝํ ์ฒ ํ์์ ์ ๋ํ์ต๋๋ค. ๋ ์ด์๊ฐ ์ฐจ์ ํ๊ณ ์คํผ๋๋ฅผ ์ด๋์ด๋ด๊ธฐ ์ํด ์์ง๊ณผ ๊ธฐ์ด์ ๊ธฐ๊ณ์ ์๋ ๊ตฌ์กฐ์ ๊ณต๊ฐํ๊ณ ์ดํดํด์ผ ํ๋ ๊ฒ์ฒ๋ผ, ์ฑ๋ฅ ์์ง๋์ด ์ญ์ ์์ ์ถ์ํ ์์ค์ ์ฝ๋๋ฅผ ์งค ๋๋ CPU ์บ์, ๋ฉ๋ชจ๋ฆฌ ๋ฒ์ค, ๋ช ๋ น์ด ํ์ดํ๋ผ์ธ์ด๋ผ๋ ์ค์ ๋ฌผ๋ฆฌ์ ํ๋์จ์ด ์ํคํ ์ฒ์ ๊น์ด ๊ณต๊ฐํ๊ณ ์ด๋ฅผ ์์ํ๋ฉฐ ๊ตฌํํด์ผ ํฉ๋๋ค.
3. ์ฑ๋ฅ ์ธก์ ๋ฐ ํ๋กํ์ผ๋ง ๋๊ตฌ (Measurement & Profiling Tools)
์ฑ๋ฅ ํฅ์์ ๊ธฐ๋ฐ์ด ๋๋ ๋ค์ํ ์ธก์ ๋ฐ ํ๋กํ์ผ๋ง ๋๊ตฌ๋ค์ ์์ธ ๋์ ์๋ฆฌ์ ์ฅ๋จ์ ์ ๋๋ค.
- ์ํ๋ง ํ๋กํ์ผ๋ฌ (Sampling Profilers) - ๋ฆฌ๋
์ค
perf- ๋์ ์๋ฆฌ: ํ๋์จ์ด ์ฃผ๊ธฐ ํ์ด๋จธ๋ CPU ์นด์ดํฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์คํ ์ค์ธ ํ๋ก๊ทธ๋จ์ ์ ๊ธฐ์ ์ผ๋ก(e.g., 100๋ง์ดํฌ๋ก์ด ๋จ์) ์ผ์ ์ ์ง(interrupt)์ํจ ํ, ํ์ฌ CPU ๋ช ๋ น ํฌ์ธํฐ(IP)์ ์คํ ํธ๋ ์ด์ค(Call Stack) ์ ๋ณด๋ฅผ ์์ถ ๊ธฐ๋กํ์ฌ ํต๊ณ์ ์ผ๋ก ์๊ฐํํฉ๋๋ค.
- ํ๋์จ์ด ์ฑ๋ฅ ๋ชจ๋ํฐ๋ง ์นด์ดํฐ(PMC): ๋จ์ํ ์๊ฐ ๊ฐ๊ฒฉ๋ฟ๋ง ์๋๋ผ L2/L3 ์บ์ ๋ฏธ์ค(Cache Misses), ๋ถ๊ธฐ ์์ธก ์คํจ(Branch Misprediction Misses) ๋ฑ์ ํ๋์จ์ด ์ด๋ฒคํธ๋ฅผ ํ๊ฒ์ผ๋ก ์ํ๋งํ ์ ์์ด ๋ณ๋ชฉ ์ง์ ์ ์ธ๋ถ ๋ฉ์ปค๋์ฆ์ ์ถ์ ํ ์ ์์ต๋๋ค.
- ํ๊ณ: ์ํ๋ง์ ์ด ์คํ ์๊ฐ ๋๋น ๋น์จ์ ์ธก์ ํ๊ธฐ ๋๋ฌธ์, ์คํ ์๋๋ ๋น ๋ฅด์ง๋ง ๋ด๋ถ ๋ฒ๊ทธ๋ ์ค์ ์ค๋ฅ๋ก ํ(Queue)์ ๋ค์ด๊ฐ ์ฑ ์คํ ๋๊ธฐ๋ฅผ ํ๋ฉฐ ๋ฐ์ํ๋ ๋๊ธฐ ๋ ์ดํด์ ๋ณ๋ชฉ์ ๊ฐ์งํ ์ ์์ต๋๋ค.
- Retrospective ํธ๋ ์ด์ฑ ๋๊ตฌ - ๋งค์ง ํธ๋ ์ด์ค (Magic-trace)
- ๋์ ์๋ฆฌ: Intel ํ๋ก์ธ์์ ํ์ฌ๋ ํ๋์จ์ด ๊ฐ์ ๊ธฐ๋ฅ์ธ Intel Processor Trace(PT)๋ฅผ ์ด์ฉํฉ๋๋ค. CPU๊ฐ ๋ถ๊ธฐํ ๋๋ง๋ค ๋จ 1๋นํธ์ ์ ๋ณด ๋ฑ์ผ๋ก ๊ทน๋๋ก ์์ถํด ๋ชจ๋ ์คํ ๋ธ๋์น๋ฅผ CPU ๋ง ๋ฒํผ์ ์์ ๊ธฐ๋กํฉ๋๋ค. ํน์ ๋ฌธ์ ๋ ๋๊ธฐ ํ ์ผ ์ง์ฐ(Trigger)์ด ๊ฐ์ง๋๋ ์๊ฐ ๋ง ๋ฒํผ์ ์ค๋ ์ท์ ํ๋ํ์ฌ ์ด์ ์ ๋ฐ๋ฆฌ์ด ๋์์ ๋ชจ๋ ํจ์ ํธ์ถ ๊ฒฝ๋ก๋ฅผ ๋ง์ดํฌ๋ก/๋๋ ธ์ด ์ ๋ฐ๋์ ํ์๋ผ์ธ ๊ทธ๋ํ๋ก ์์ ๋ณต์ํด ๋ ๋๋ค.
- ๋ถ์ ์ฐ์: ํต๊ณ ๊ธฐ๋ฐ์ ์ํ๋ง๊ณผ ๋ฌ๋ฆฌ, ํซ ์คํ ๋ฒ์ ๋ด์์ ๋ฐ์ํ ๋ฃจํ ํธ์ถ ํ์, ํจ์ ์ง์ ๋ฐ ํ์ถ์ ์ ํํ ํ๋ฆ์ ์ํ ํ๋ฆ์ฒ๋ผ ์์ฐจ์ ์ผ๋ก ์ถ์ ํ ์ ์์ต๋๋ค. 1,000๋ฒ ํธ์ถ๋์ด ์ ์ฒด 40%์ ์๊ฐ์ ์๋ชจํ ํจ์๊ฐ ํ ๋ฒ ํฌ๊ฒ ๋ฐ๋ฆฐ ๊ฒ์ธ์ง, ์๋๋ฉด ์์ฃผ ๊ฐ๋ฒผ์ด ํธ์ถ์ด ํ์ดํธํ ๋ฃจํ ์์์ ๋นํจ์จ์ ์ผ๋ก ๋ฐ๋ณต๋ ๊ฒ์ธ์ง ๋ช ํํ๊ฒ ํ๋ณํด ์ค๋๋ค.
- ์ค๋ฒํค๋: ์ค๋ฆฌ์ฝ ๋ ๋ฒจ ๊ฐ์์๋ ๋ถ๊ตฌํ๊ณ ์คํ ์ฑ๋ฅ์ด ์ฝ 5~15% ๊ฐ์ํ๋ฏ๋ก, ์์ ํ๋ก๋์ ํ๊ฒฝ์ ์ผ๋ ์๋ ์๊ณ ์ฑ๋ฅ ๋ฒ๊ทธ ์ฌํ ๋ฐ ํ ์คํธ๋ฒ ๋ ๊ฒ์ฆ ์ ์ ๋์ ์ผ๋ก ๊ฐ๋ํฉ๋๋ค.
- GC ํ
์ผ ๋ ์ดํด์์ ๋ณธ์ง๊ณผ ํ์ ์ด๋ก (Queuing Theory)
- Major GC ์๋ ์ค๋จ:
magic-trace๋ก ์ต์ ์ ํ ์ผ ์ง์ฐ์ ํฌ์ฐฉํด๋ณด๋ฉด ๊ฐ๋น์ง ์ปฌ๋ ํฐ์ Major GC๊ฐ ๋์ ์ธ๊ณ๋ฅผ ๋ฉ์ถ๊ฒ(Stop-the-world) ๋ง๋๋ ์ํฉ์ด ์ ๋๋ผํ๊ฒ ํฌ์ฐฉ๋ฉ๋๋ค. ์ด ๊ฒฝ์ฐ ๋น์ฐํ ๋ฉ๋ชจ๋ฆฌ ํ ๋น(allocation) ์์ฒด๋ฅผ ์ค์ด๋ ํ๋์ด ํด๋ต์ ๋๋ค. - ํ ์ผ ์ง์ฐ์ ์จ๊ฒจ์ง ์ค์ฒด: ๊ทธ๋ฌ๋ ๋๋ค์ ์ต์ ์ ์ง์ฐ(Tail Latency)์ ํน๋ณํ๊ณ ๊ธฐ๊ดดํ ์์คํ ๊ฒฐํจ์ด๋ ๋จ์ผ ๋ํ ๋ฒ๊ทธ ๋๋ฌธ์ ๋ฐ์ํ์ง ์์ต๋๋ค. ์ค์์ โ๊ทธ์ ์ง๊ทนํ ์ ์์ ์ธ ์ค๊ฐ๊ฐ(Median) ์ฐ์ฐ๋ค์ด ๋์ผ ์์ ์ ํญ๋ฐ์ ์ผ๋ก ๋ฐ๋ณต ๋์ ๋ ๊ฒโ์ ๋ถ๊ณผํ๋ฉฐ, ์ด๋ ์ฒ ์ ํ ํ์ ์ด๋ก (Queuing Theory)์ ์๋ ดํฉ๋๋ค.
- ๋ฉ์์ง ํญ๋ฐ๊ณผ ๋ฐฐ์น ์ฒ๋ฆฌ ์ต์ ํ: ํ์์๋ ํจํท 1๊ฐ๋น 1๋ง์ดํฌ๋ก์ด ๋ฏธ๋ง์ผ๋ก ์ ์ ์ฒ๋ฆฌ๋์ง๋ง, ์์ฅ์ ๋๋์ ํธ๊ฐ ๋ณ๊ฒฝ ํผ๋(Burst of messages)๊ฐ 10,000๊ฐ ๋ชฐ๋ ค๋ค๋ฉด ๋ค์ชฝ์ ๋๊ธฐํ๋ ํจํท์ ๋๊ธฐ ์๊ฐ(Queue delay)์ด ์์ฌ ๊ฒฐ๊ตญ ์ฌ๊ฐํ ์ง์ฐ์ ๋ง๋ญ๋๋ค. ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๊ฐ๋ณ ํจํท์ ๋ง์ดํฌ๋ก ์์ค์ผ๋ก ๊ณ ์ ์ฒ๋ฆฌํ๋ ๊ฒ๋ ์ค์ํ์ง๋ง, ํญ๋ฐ ์ง์ ์์ ํจํท๋ค์ ๋ฌถ์ด ํ ๋ฒ์ ํฉ์ธ์ด ๊ฐ๋ ๋ฐฐ์น ์ฒ๋ฆฌ(Processing in a Batch) ์ํคํ ์ฒ๋ฅผ ๋์ ํ๋ ๊ฒ์ด ๊ทผ๋ณธ์ ์ธ ํ ์ผ ์ต์ ํ ํ์ ๋๋ค.
- Major GC ์๋ ์ค๋จ:
- ์๋ช
์ฃผ๊ธฐ ๋ฉ๋ชจ๋ฆฌ ํธ๋ ์ด์ฑ -
memtrace- ๋จ์ํ ๋์ ํ ๋น๋์ ๋ณด์ฌ์ฃผ๋ ํ๋กํ์ผ๋ฌ์ ๋ฌ๋ฆฌ, ํน์ ํ๋ณธ(Sampled allocation)์ ๋ํ ๋ฉ๋ชจ๋ฆฌ ํ ๋น ์์ ๋ถํฐ ์ต์ข ๊ฐ๋น์ง ์ปฌ๋ ํฐ(GC) ํด์ ์์ ๊น์ง์ ์์ ํ ๋ผ์ดํ์ฌ์ดํด์ ์ถ์ ํ์ฌ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ ์ง์ ์๊ฐ๊ณผ ๊ฐ๋น์ง ์ปฌ๋ ํฐ ํจ์จ์ ์์ธ ์ง๋จํฉ๋๋ค.
4. ์ฑ๋ฅ ์๊ฐํ ๋ฐฉ๋ฒ๋ก : Flame Graph vs. pprof
์๋ก ๋ค๋ฅธ ํ๋กํ์ผ๋ง ์๊ฐํ ๋๊ตฌ๋ค์ด ์ ๊ณตํ๋ ์ ๋ณด์ ํํ ๋ฒ์์ Join Point์ ์ค์์ฑ์ ๋ํ ์ค๋ช ์ ๋๋ค.
- ํ๋ ์ ๊ทธ๋ํ (Flame Graph)์ ๋ช
๊ณผ ์
- ์ฅ์ : ์คํ์ ๊น์ด์ ๋ฐ๋ผ ๊ฐ๋ก ๋ธ๋ก์ ๋๋น๊ฐ ์ฐจ์งํ๋ ๋น์จ์ ๋ค์ฑ๋ก์ด ํ์ผ ์์์ผ๋ก ๋ณด์ฌ์ฃผ์ด, ํ๋ก๊ทธ๋จ ๋ด์์ ์ด๋ค ํจ์๊ตฐ์ด ์ ์ฒด CPU ํ์์ ์ผ๋ง๋งํผ์ ์ฐจ์งํ๊ณ ์๋์ง ํ๋์ ์์๋ณด๊ธฐ ์ฝ์ต๋๋ค.
- ๋จ์ (Join Points ๋๋ฝ): ๋ค์์ ๊ฐ๋ณ ๋น์ฆ๋์ค ๋ก์ง(Callers)์ด ์คํ๋๋ค๊ฐ ์ต์ข
์ ์ผ๋ก ํ๋์ ๊ณตํต ์ธํ๋ผ ํจ์(Callee, ์:
mallocํน์ ์ง๋ ฌํ ์์ง)๋ฅผ ํธ์ถํ ๋, Flame Graph ์์์๋ ์๋ถ๋ถ(Tippy Top)์ ์์ ์กฐ๊ฐ๋ค๋ก ์กฐ๊ฐ์กฐ๊ฐ ํฉ์ด์ ธ์ ํ๊ธฐ๋ฉ๋๋ค. ์ด๋ก ์ธํด ์ข ํฉ์ ์ผ๋ก ๋ณด๋ฉด 30~40%์ ๋ฌํ๋ ํฐ ๋ณ๋ชฉ์ด ๋ฐ์ํ๊ณ ์์์๋ ์ฐจํธ ์์์๋ ์ธ์งํ์ง ๋ชปํ๊ณ ๋์ด๊ฐ ์ํ์ด ํฝ๋๋ค.
- ๊ตฌ๊ธ
pprof์ Directed Acyclic Graph (DAG) ์๊ฐํ- ๋์ ๋ฐฉ์: ํจ์๋ฅผ ๊ณ ์ ๋ ธ๋(Node)๋ก ์ทจ๊ธํ๊ณ ํธ์ถ ๊ฒฝ๋ก๋ฅผ ์์ง(Edge)๋ก ๋งคํํ๋ ๋ฐฉํฅ์ฑ ๋น์ํ ๊ทธ๋ํ(DAG) ํํ๋ก ํ๋ฉด์ ํ์ํฉ๋๋ค.
- ์กฐ์ธ ํฌ์ธํธ ์๊ฐํ: ์ฌ๋ฌ ๊ฐ๋์ ๋ฌด์์ ์คํ ํธ๋ ์ด์ค์์ ์์ํ์ฌ ๊ณตํต ํจ์๋ก ์๋ ดํ๋ ์ง์ ์ ๋๊บผ์ด ํ์ดํ(Edge)์ ๋จ์ผ ๋
ธ๋๋ก ํฉ์ณ์ ๊ทธ๋ ค์ฃผ๋ฏ๋ก, ํฉ์ด์ ธ ์๋
malloc์ด๋ ํน์ ์ธํ๋ผ ๋ณ๋ชฉ์ ํ๋์ ์๋ณํ๊ณ ์ํ์ ํธ์ถ ๋น์จ์ ํ์ ํ๋ ๋ฐ ๋งค์ฐ ์ ๋ฆฌํฉ๋๋ค. - ๋จ์ : ์ด๋ณด์๋ ์ผ๋ฐ ๊ฐ๋ฐ์ ์ ์ฅ์์ ์ง๊ด์ ์ผ๋ก ํ๋ฉด์ ๋ณต์กํ ๊ทธ๋ํ๋ฅผ Grok(์ดํด)ํ๋ ๋ฐ ์ง์ ์ฅ๋ฒฝ๊ณผ ํ์ต ๊ณก์ ์ด ์์ต๋๋ค.
5. OCaml vs. C++: ๊ณ ์ฑ๋ฅ ์ธ์ด์ ๋์กฐ์ ์ํฌ์์ (OCaml vs C++ in High Performance)
Jane Street๊ฐ ์ฑํํ OCaml ํ๊ฒฝ๊ณผ ์ ํต์ ์ธ ๊ณ ์ฑ๋ฅ ์ธ์ด์ธ C++์ ๋ฉ๋ชจ๋ฆฌ ๋ชจ๋ธ ์ฐจ์ด ๋ฐ ์ด๋ฅผ ๊ทน๋ณตํ๊ธฐ ์ํ ์์ง๋์ด๋ง์ ๋์์ฑ ์ ๋๋ค.
- ์ต์ ํ ๋๊ตฌ ๋ฐ ์ปดํ์ผ๋ฌ ์์ฝ์์คํ
์ ๊ท๋ชจ ๊ฒฉ์ฐจ
- C++: ์์ฒ ๋ช ์ ๋น ํ ํฌ ์ธ์ฌ๋ค์ด LLVM/Clang ๋ฐ GCC์ ๊ฐ์ ์ปดํ์ผ๋ฌ ์ต์ ํ ๋๊ตฌ๋ฅผ ์ ์ธ๊ณ์ ์ผ๋ก ๊ณ ๋ํํ๊ณ ์์ด ์ปดํ์ผ๋ฌ ๋จ์ ์ต์ ํ ์์ค์ด ๋งค์ฐ ๋์ต๋๋ค.
- OCaml: ์๋์ ์ผ๋ก ์คํ์์ค ์ต์ ํ ๋ฐ ๋๊ตฌ ๊ฐ๋ฐ ์ฐธ์ฌ์๊ฐ ํ์ ๋์ด ์์ด ๋ฃจํ ์ ๊ฐ(loop unrolling)๋ ๊ธฐ๊ณ์ด ๋ ๋ฒจ ๋ ์ง์คํฐ ์คํ(register spill)๊ณผ ๊ฐ์ ์ตํ์ ๋ ๋ฒจ ์ปดํ์ผ ์ต์ ํ์์ ํ๊ณ๊ฐ ์์ต๋๋ค.
- ๋ฉ๋ชจ๋ฆฌ ํฌ์ธํฐ ์ธ๋๋ ์
๊ณผ GC ๋ชจ๋ธ์ ๋น์ฉ
- Boxy Representation (๋ฐ์ฑ ๋ฌธ์ ): OCaml์ ๋คํ์ฑ๊ณผ GC ๊ฒ์ฌ์ ์ผ๊ด์ฑ์ ์ํด ๋ง์ ๊ฐ์ฒด๋ค์ ํ ์์ญ์ ๋ฐ์ฑ(Boxing)ํ์ฌ ๋๊ณ ํฌ์ธํฐ๋ฅผ ํตํด ๊ฐ์ ์ฐธ์กฐํ๋ ๋ฐฉ์์ ์ทจํฉ๋๋ค. ๊ตฌ์กฐ์ฒด ๋ด๋ถ์ ํ์ ๋ฉค๋ฒ๋ฅผ contiguously ์ธ๋ผ์ธํ์ฌ ์บ์ ๋ฏธ์ค๋ฅผ ์์ฒ ์ฐจ๋จํ ์ ์๋ C++์ ๋นํด, OCaml์ ์ฆ์ ์บ์ ๋ผ์ธ ๋ฏธ์ค ๋ฐ ํ์ ๊ฐ์ ๋น๊ฐ ๋ฐ์ํฉ๋๋ค.
- GC ๋ฐํ์ ๊ฒ์ฌ์ Nulling Out: ๊ฐ๋น์ง ์ปฌ๋ ํฐ๊ฐ ์คํ ๋์ค ๋ฉ๋ชจ๋ฆฌ ๊ฐ์ ๊ฐ๋ฆฌํค๋ ํฌ์ธํฐ๋ฅผ ์์ ๊ฒ์ฆํด์ผ ํ๋ฏ๋ก, ๋ฏธ์ด๊ธฐํ๋ ๋ฐ์ดํฐ ์์ญ์ด ์์กดํ๋ฉด ์ ๋ฉ๋๋ค. ๋ง์ฝ ํด์ ๋๊ฑฐ๋ ์ฐ์ด์ง ์๋ ๋ฐฐ์ด ์ฌ๋กฏ์ ์์์ ์ฐ๋ ๊ธฐ ๊ฐ์ด ๊ฐ๋ํ๊ณ , GC๊ฐ ์ด ๊ฐ์ ์ฃผ์ ํฌ์ธํฐ๋ก ์ฐฉ๊ฐํ์ฌ ์ซ์๊ฐ๊ฒ ๋๋ฉด ํ๋ก์ธ์ค ํฌ๋์๋ ์ฌ๊ฐํ ํ ์ค์ผ์ด ๋ฐ์ํฉ๋๋ค. ๋ฐ๋ผ์ ์ฌ์ฉ์ด ๋๋ ๋ฐฐ์ด ์์๋ฅผ ๋งค๋ฒ ๋ช ์์ ์ผ๋ก null ์ฒ๋ฆฌ(nulling out)ํ๋ ๋ถ๊ฐ ์ฒญ์ ๋น์ฉ์ด ๋ค๊ฒ ๋ฉ๋๋ค.
- ์ต์ ํ์ ํ์ค์ ๋น์ฉ๊ณผ ์ธ์ด์ Ergonomics
- ์ด์ํ๊ณ ๋ถํธํ ์ต์ ํ์ ๋๊ฐ: OCaml์์ ์ฑ๋ฅ ์ต์ ํ๊ฐ ์์ฒ์ ์ผ๋ก ๋ถ๊ฐ๋ฅํ ๊ฒ์ ์๋๋๋ค. ์๋ฅผ ๋ค์ด ํ๋ก๊ทธ๋จ ์์ ์ 64GB ํฌ๊ธฐ์ ๊ฑฐ๋ํ integer ๋ฐฐ์ด์ ๋ฏธ๋ฆฌ ์ก์๋ ๋ค, OCaml ์์์ C ์คํ์ผ๋ก ํด๋น ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ง ์กฐ์ํ๋ ์ด์ํ ์ฝ๋๋ฅผ ์งค ์๋ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ด๋ ๊ฐ๋ ์ฑ๊ณผ ์์ ์ฑ์ ํ๊ดดํ๋ฏ๋ก ๊ทน๋๋ก ๋ถ์พํ๊ณ ์ด๋ ต์ต๋๋ค.
- ์ฌ๋ฐ๋ฅธ ๊ตฌํ๊ณผ ์ฌ์ฉ ๋น๋์ ์ ์ํ: ๋ก ๋ฏผ์คํค๋ โ์ต์ ํ ๊ธฐ๋ฒ์ด ์ด๋ ต๊ณ ์ด์ํ ์๋ก ๊ฐ๋ฐ์๋ค์ ๊ทธ๊ฒ์ ์ ์ฌ์ฉํ์ง ์๊ฒ ๋๋คโ๊ณ ์ง์ ํฉ๋๋ค. ๊ฒฐ๊ตญ ์ธ์ด๊ฐ ์ ๊ณตํ๋ ์ธ์ฒด๊ณตํ์ ํธ๋ฆฌ์ฑ(Ergonomics)์ด ์ค์ง์ ์ธ ์ต์ข ์์คํ ์ ์ฑ๋ฅ์ผ๋ก ์ฐ๊ฒฐ๋ฉ๋๋ค. ์ต์ ํ ๊ณผ์ ์ ๋ง์ฐฐ์ ์ค์ด์ง ๋ชปํ๋ฉด, ์ ์ฒด ๊ฐ๋ฐ์๊ฐ ์ฑ๋ฅ ์ฝ๋๋ฅผ ๋ ์์ฑํ๊ฒ ๋์ด ์์คํ ์ ๋ฐ์ ์ฑ๋ฅ ์ ํ๋ผ๋ ์ค์ง์ ์ธ ๋๊ฐ๋ฅผ ์น๋ฅด๊ฒ ๋ฉ๋๋ค.
- ์ธ๋ ํจ์ ์ธํฐํ์ด์ค(FFI)์ ์ค๋ฒํค๋ ๊ตฌ์กฐ: Java JNI vs OCaml C Stub
- Java JNI์ ์์ฒญ๋ ๋ถํ (300~400ns): JVM ํ๊ฒฝ์์ ์ธ๋ถ C ์ฝ๋๋ฅผ ํธ์ถ(JNI)ํ๋ ๊ณผ์ ์ ๋งค์ฐ ๋น์๋๋ค. ๊ฐ๋น์ง ์ปฌ๋ ์ ์ ์ธ์ดํ ํฌ์ธํธ ๋๊ธฐํ, JVM๊ณผ OS ๊ฐ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ๋ณดํธ ๊ฐ๋, ๊ฐ์ฒด ๋ฐ์ดํฐ ๋ณต์ฌ(marshaling) ํ๋ก์ธ์ค๊ฐ ๋๋ฐ๋๊ธฐ ๋๋ฌธ์ ๋๋ค.
- OCaml FFI์ ๋ ๋ ตํจ (3~4ns): OCaml์ ๋ค์ดํฐ๋ธ ์ปดํ์ผ๋ ๋จ์ํ ์คํ (C stubs)์ ํตํด ๊ธฐ๊ณ์ด ํจ์ ํธ์ถ์ ์ง์ ์ํํฉ๋๋ค. GC ์์ ๊ฐ๋๋ฅผ ๋๋ฐํ ๋ณต์กํ ๋ฐํ์ ๋ณํ ์์ ์ด ์๋ต๋์ด ์ค๋ฒํค๋๊ฐ ๋จ 3~4 ๋๋ ธ์ด ์์ค์ผ๋ก ๋งค์ฐ ๊ฐ๋ณ์ต๋๋ค. ๋ฐ๋ผ์ ๊ทน๋๋ก ๊ธฐ๋ฏผํ๊ฒ ์ธ๋ถ C ์์คํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ ๊ธฐ์ ์ผ๋ก ์ฎ์ด ์ต์ ํํ ์ ์์ต๋๋ค.
- Jane Street์ ๊ทน๋ณต ์ ๋ต (Workarounds)
- DSL(Domain-Specific Languages)์ ํตํ ํํํ: ๋์ค๋ฅ์ด๋ ํด์ธ ๊ฑฐ๋์์์ ์ ์ ๋๋ ๊ธ์ต ๋ฐ์ดํฐ ํจํท(NASDAQ Feed ๋ฑ)์ ๊ณ ์ ํ์ฑ์ ์ํด, ๋ด๋ถ์ ์ผ๋ก๋ ์์ ๋ฉ๋ชจ๋ฆฌ ๋ฐ์ดํธ๋ฅผ ๋ณต์กํ๊ณ ๋ฉ์ํ๊ฒ ๋ค๋ฃจ๋ ์์ ๊ณ์ธต์๋ ํ์ ์ธ์ดํํ ์ธํฐํ์ด์ค๋ฅผ ์๋ ์์ฑํด ์ฃผ๋ DSL์ ๊ตฌ์ถํ์ฌ ์ฌ์ฉํฉ๋๋ค.
- Zero Alloc OCaml & Custom Dialect: ๊ฐ๋น์ง ์ปฌ๋ ํฐ๊ฐ ์คํ ๊ฒฝ๋ก์์ ์ ํ ์๋ํ์ง ์๋๋ก ํ ํ ๋น์ ๊ฐ์ ๋ก ์ฐจ๋จํ๋ โZero Alloc OCamlโ ์ปดํ์ผ๋ฌ Dialect๋ฅผ ์ง์ ์ปค์คํ ๊ตฌํํ์ฌ ์ฌ์ฉํฉ๋๋ค. ๊ผญ ํ์ํ ์์ ๋ฉ๋ชจ๋ฆฌ๋ malloc์ ์ด์ฉํด OCaml GC ๊ฐ์ ์์ญ ๋ฐ์ ๋ณ๋๋ก ๊ด๋ฆฌํฉ๋๋ค.
- ํฅํ ๊ฐ์ ๋ฐฉํฅ (OCaml Type Layout ์ ์ด): Jane Street๋ OCaml ์ปดํ์ผ๋ฌ ํต์ฌ ํ๊ณผ ํ๋ ฅํ์ฌ, OCaml ํ์ ์์คํ ์์์ Contiguous ๋ฉ๋ชจ๋ฆฌ ๋ฐฐ์น ์ ์ด๋ฅผ ๊ฐ๋ฅํ๊ฒ ํ๋ ์ปดํ์ผ๋ฌ ๋ ๋ฒจ์ ๋ ์ด์์ ํ์ฅ ์ฐ๊ตฌ(Flambda ๋ฐ layout ํ์ฅ ๋ฑ)์ ๊ฐ์ฅ ์ ๊ทน์ ์ผ๋ก ํฌ์ํ๊ณ ์์ต๋๋ค.
6. ์ฑ๋ฅ ์์ง๋์ด์๊ฒ ํ์ํ ์ ์ ์ ์ฐ์ ์์ (Discipline and Prioritization in Performance Engineering)
์ฑ๋ฅ ๊ฐ์ ์์ ์ ์ฝ๋์ ๋ฏธ์ ์์ฑ๋๋ฅผ ์ซ์ง ์๊ณ , ๋น์ฆ๋์ค ์ํฅ๋์ ์ฐ์ ์์์ ๊ธฐ๋ฐํด ๋์ ํ๊ฒ ํ๋จํ๋ ๊ท์จ์ ๋๋ค.
- ๋๋ฆฐ ์ฝ๋๋ฅผ ๋ณด๊ณ ๋ ์ฐธ์๋ผ ์ ์๋ ์ ์ (The Discipline of Not Fixing Everything)
- ๊ฐ์ธ์ ๋ถ์พํจ(Offensive on a Personal Level) ๊ทน๋ณต: ์ฑ๋ฅ ์์ง๋์ด๋ ์์คํ ๋ด์ ๋ถํ์ํ๊ฒ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํ๊ฑฐ๋ ๋นํจ์จ์ ์ผ๋ก ๋๋ ๋๋ฆฐ ์ฝ๋๋ฅผ ๋ฐ๊ฒฌํ๋ฉด ์ง๊ด์ ์ผ๋ก ๊ทน๋์ ๊ฐ๋ ค์๊ณผ ๋ถํธํจ์ ๋๋๋๋ค. ํ์ง๋ง ์ฑ๋ฅ ์์ง๋์ด๋ก์ ๊ฐ์ฅ ๋ฐฐ์ฐ๊ธฐ ์ด๋ ค์ด ๋๋ชฉ์ โ์๋์, ์ ๊ฒ์ ๊ณ ์น์ง ์๊ฒ ์ต๋๋คโ๋ผ๊ณ ๋งํ๋ ์ ์ ๋ ฅ(Discipline)์ ๋๋ค.
- ์ํฅ๋์ ๊ธฐ๋ฐํ ๋์ ํ ์ฐ์ ์์ ๋ฐฐ์
- ๋ฌด์๋ฏธํ ์ต์ ํ์ ์ ์ธ: ์ค๋ น ๊ธฐ์ ์ ์ผ๋ก ๋นํจ์จ์ ์ด๊ณ ์๋ชป ์์ฑ๋ ์ฑ๋ฅ ์ฝ๋์ผ์ง๋ผ๋, ๊ทธ๊ฒ์ด ์ค์ ๋ก ํธ๋ ์ด๋ฉ ๋ ์ดํด์๋ ๋น์ฆ๋์ค ์ฒ๋ฆฌ์จ(Throughput)์ ๋ฏธ์น๋ ์ค์ง์ ์ธ ์ํฅ์ด ์ ๋ก๋ผ๋ฉด ์ต์ ํ ์ฐ์ ์์์์ ๋จํธํ ์ ์ธํด์ผ ํฉ๋๋ค.
- ์ง์ง ์ค์ํ ๋ณ๋ชฉ์๋ง ๋ฆฌ์์ค ์ง์ค: ์๊ฐ์ ์ ํํ๊ณ ์์ง๋์ด ๋ฆฌ์์ค๋ ๋น์๋๋ค. ๋ฌด์๋ฏธํ ๋ถ๋ถ ์ต์ ํ(Micro-optimization)์ ์์ง๋์ด๋ง ๋ฆฌ์์ค๋ฅผ ๋ญ๋นํ์ง ์๊ณ , ๋น์ฆ๋์ค์ ์ค์ง์ ์ํฉํธ๊ฐ ์๋ 1~2๊ฐ์ ํต์ฌ ๋ณ๋ชฉ์ ์ ๋ฐ ํ๊ฒฉํ๋ ๋ฐ ๋ชจ๋ ๋ฆฌ์์น์ ์ญ๋์ ์ง์คํ๋ ๊ฒ์ด ์ฑ๋ฅ ์์ง๋์ด์ ํต์ฌ ๊ท์จ์ ๋๋ค.
7. ํ๋์จ์ด์ ์ํคํ ์ฒ, ๊ทธ๋ฆฌ๊ณ ๋ฐ๋ณต ์๋ (Hardware, Architecture, and Iteration Speed)
๊ทน๋จ์ ์ธ ์๋๋ฅผ ๋ด๊ธฐ ์ํ ํ๋์จ์ด ์ฅ์น(FPGA) ๋ฐฐ์น์ ์ํํธ์จ์ด ๊ตฌ์กฐ ์ต์ ํ์ ๊ท ํ, ๊ทธ๋ฆฌ๊ณ ๋น์ฆ๋์ค ์ ๋ฐ์ ๋ฐ๋ณต ์ฃผ๊ธฐ ๋จ์ถ์ด ๊ฐ์ง๋ ๊ฐ์น์ ๋๋ค.
- ํ๋์จ์ด ๊ฐ์(FPGA)๊ณผ CPU์ ๋ฌผ๋ฆฌ์ ํ๊ณ
- ์ง์ฐ์๊ฐ ๋ฌผ๋ฆฌ์ ์ฅ๋ฒฝ: ์๋ฌด๋ฆฌ C/C++ ์ฝ๋๋ฅผ ์ ํ๋ํด๋ PCIe ๋ฒ์ค๋ฅผ ๋ ๋ฒ ์ค๊ฐ๋ ๋น์ฉ(NIC -> ๋ฉ๋ชจ๋ฆฌ -> CPU -> NIC)๋ง์ผ๋ก๋ ๋ฌผ๋ฆฌ์ ์ผ๋ก ์๋ณต ์ฝ 800 ๋๋ ธ์ด์ ์ง์ฐ์ด ๊ธฐ๋ณธ ์๋ชจ๋ฉ๋๋ค. ๋ฐ๋ฉด FPGA๋ ๋คํธ์ํฌ ์ ์ถ๋ ฅ ํฌํธ์ ์ง๊ฒฐ๋์ด 100 ๋๋ ธ์ด ๋ฏธ๋ง์ผ๋ก ํจํท์ ๋ฆฌํดํ ์ ์์ต๋๋ค.
- ํ๋์จ์ด์ ๋ณต์ก์ฑ ๋ณ๋ชฉ: ํ๋์จ์ด ๊ธฐ์ (Verilog/VHDL)์ ๊ฐ๋ฐ ๋ฐ ๋ฒ๊ทธ ํฝ์ด ๊ทน๋๋ก ์ด๋ ต๊ณ ์นฉ ์ปดํ์ผ(Synthesis) ๊ณผ์ ์๋ง ์ต์ 24์๊ฐ ์ด์์ด ์์๋ฉ๋๋ค.
- ์ํคํ ์ฒ ํ์ด๋ธ๋ฆฌ๋ ๋ถ๋ฐฐ: ์ด๊ณ ์ ๋ฐ์์ด ํต์ฌ์ธ 100ns ์ดํ ์์ญ์ ๋จ์ํ ๊ตฌ์กฐ์ FPGA ํ๋์จ์ด๋ฅผ ๋ฐฐ์นํ๊ณ , ๋์ ์ผ๋ก ๋ณํํ๋ ๊ณ ๋ํ๋ ํธ๋ ์ด๋ฉ ๋น์ฆ๋์ค ๋ก์ง๊ณผ ๋ถ์ ์์ญ์ ๊ณ ์ ์ํํธ์จ์ด(OCaml/C++ ๋ฑ) ์์คํ ์ด ๋ด๋นํ๋๋ก ์ญํ ์ ์ ๋ฐํ ๋ถํ ํด์ผ ํฉ๋๋ค.
- ์ธ๊ฐ ์๋ตํ ์์คํ
(Human-Responsive Systems)์ ์ฑ๋ฅ๊ณผ ๊ฐ์น
- ๊ฐ๋ฐ์ ๋๊ตฌ์ ์ธ์ง์ ์ฅ๋ฒฝ: ์ฑ๋ฅ ์ต์ ํ๋ ๊ธฐ๊ณ๋ ์๊ณ ๋ฆฌ์ฆ๋ง์ ํ๊ฒ์ผ๋ก ํ์ง ์์ต๋๋ค. ์ฝ๋ ์์ฑ ๋์ค ํ ์คํธ ์๋ํฐ๊ฐ ๋จ 5์ด๋ผ๋ ๋ฉ์ถฐ๋ฒ๋ฆฌ๋ ํ์์ ๊ฐ๋ฐ์์๊ฒ ๊ทน๋์ ์ง์ฆ๊ณผ ์ง์ค๋ ฅ ์ ํ๋ฅผ ์ด๋ํฉ๋๋ค.
- ํผ๋๋ฐฑ ์ฌ์ดํด๊ณผ ์ฐฝ์๋ ฅ ํ๋ ฅ(Creative Juices) ๋ณด์กด: ๋ฆฌ์์ฒ๊ฐ ์๋ก์ด ์์ด๋์ด๋ฅผ ๊ฒ์ฆํ ๋ ๋ฐฑํ ์คํ ์๋ฎฌ๋ ์ด์ ๊ฒฐ๊ณผ๋ฅผ ํ๋ฃจ ๋ค์ ์ป๋ ๊ฒ๊ณผ 10๋ถ ๋ง์ ์ป๋ ๊ฒ์ ๊ฐ๋ฐ ๋ฐฉ์์ ์ง์ ์ฐจ์ด๋ฅผ ๋ง๋ญ๋๋ค. ํผ๋๋ฐฑ์ด ๋ช ๋ถ ๋ด๋ก ๋์์ค๋ ํ๊ฒฝ์ ์กฐ์ฑ(Human-scale latency optimization)ํด์ผ๋ง ๊ฐ๋ฐ์๊ฐ ๋ ์์ ์ฐฝ์์ ์๋์ง๋ฅผ ์์ง ์๊ณ ์๋ง์ ๊ฐ์ค์ ์ฐ์ด์ด ์คํํ๊ณ ๋์ฝ์ํฌ ์ ์์ต๋๋ค.
- ์กด ๋ณด์ด๋(John Boyd)์ OODA ๋ฃจํ์ ๋ฐ๋ณต ํ์ (Iteration Speed)
- OODA ๋ฃจํ (Observe, Orient, Decide, Act): โ๊ด์ฐฐ-๋ฐฉํฅ์ค์ -๊ฒฐ์ -ํ๋โ์ ์ฌ์ดํด ์๋๊ฐ ํ์ฌ๋ณด๋ค ๋น ๋ฅผ์๋ก ๋ณํํ๋ ํ๊ฒฝ์ ์๋ฒฝํ๊ฒ ์ฅ์ ํ ์ ์๋ค๋ ๊ตฐ์ฌ ์ ๋ต ๊ฐ๋ ์ผ๋ก, ์ํํธ์จ์ด ๊ฐ๋ฐ ํ๊ฒฝ์๋ ๊ทธ๋๋ก ํฌ์๋ฉ๋๋ค.
- ์์คํค ๊ณ ์ ์์ฑ ๋น์ (Bourbon Analogy): ์ ์ ์์คํค ์์ฑ์ 5~10๋ ์ด ๊ฑธ๋ ค ๊ฐ๋ฐ ์ฃผ๊ธฐ(Feedback iteration)๊ฐ ๊ทน๋๋ก ๊น๋๋ค. ๊ทธ๋ฌ๋ ์ผ๋ถ ํ์ ์ ์ธ ์ฆ๋ฅ์๋ค์ ๊ธฐ์ ์ ๋ฐฉ๋ฒ์ ๋์ํด 1๊ฐ์ ๋ง์ ๋ฒ๋ฒ์ ์์ฑ ์์ฑ์์ผ ๋ด ๋๋ค. ๋น๋ก ์์ญ ๋ ๊ฐ ์์ฑํ ์ ํต ๋ฐฉ์์ ์ ๊ตํ ๋ง์๋ ๋ชป ๋ฏธ์น๋๋ผ๋, ๋จ๋ค์ด 1๋ฒ ์คํํ ๋ 12๋ฒ์ ์ดํฐ๋ ์ด์ ์ ๋์ ํ๋ก์ธ์ค๋ฅผ ์ต์ ํํ๋ ์์ฒญ๋ ํ์ ๊ธฐํ๋ฅผ ๊ฐ์ง๋๋ค.
8. ์ฑ๋ฅ ์์ง๋์ด์ ์ฌ๊ณ ๋ฐฉ์ (The Performance Mindset)
๋๋ด์ ๋ง์ง๋ง ๋ถ๋ถ์์ ๋ ์ฌ๋์ ๊ณ ์ฑ๋ฅ ์์คํ ์ ๋ค๋ฃจ๋ ์์ง๋์ด์ ๊ณ ์ ํ ์ฌ๊ณ ๋ฐฉ์(Mindset)๊ณผ ์์ง์ ๋ํด ๋ ผ์ํฉ๋๋ค.
- ๋ถ์ผ๋ฅผ ์ด์ํ๋ ๊ณตํต๋ ์ง๊ด๊ณผ ์ต๊ด (Shared Intuition Across Fields)
- ๋ณธ์ง์ ์ธ ์ ์ฌ์ฑ: ์น ๋ธ๋ผ์ฐ์ /ํ๋ก ํธ์๋ ์ต์ ํ(๋งค์ฐ ๋ณต์กํ๊ณ ๊ธฐ๊ดดํ ๊ฐ์ ๋จธ์ ์์์ ๋์)๋ฅผ ์์ฃผ ์ํ๋ ์ฌ๋๊ณผ, ์ด์ ์ง์ฐ ํธ๋ ์ด๋ฉ ์์คํ ์ ๋ฐฑ์๋๋ฅผ ์ต์ ํํ๋ ์ฌ๋์ โ์ฌ๊ณ ๋ฐฉ์๊ณผ ์ง๊ด(habits of mind)โ์ ๋๋ผ์ธ ์ ๋๋ก ์ ์ฌํฉ๋๋ค.
- ํ๋ซํผ์ ๋ฌด๊ด์ฑ: ์ฌ์ฉํ๋ ๋ช ๋ น์ด ์ธํธ๋ ์คํ ์์ง์ด ์์ ํ ๋ค๋ฅผ์ง๋ผ๋, ์ฑ๋ฅ์ ํฅ์์ํค๊ธฐ ์ํด ๋ฌธ์ ๋ฅผ ๋ฐ๋ผ๋ณด๊ณ ํ๊ณ ๋๋ ์ธ์ง์ ์ ๊ทผ๋ฒ์ ๋ณธ์ง์ ์ผ๋ก ๋์ผํฉ๋๋ค.
- โ์ง๋ฃจํ ์ธ๋ถ ์ฌํญโ์ ๋ํ ์ ์ ๊ณผ ํฅ๋ฏธ (Interest in โBoringโ Details)
- ์ธ๋ถ ์ฌํญ์ ๋ํ ์ง์ฐฉ: ์ฐ์ํ ์ฑ๋ฅ ์์ง๋์ด๊ฐ ๋๊ธฐ ์ํด ๊ฐ์ฅ ์ค์ํ ์์ง์ โ๋จ๋ค์ด ๋ณด๊ธฐ์๋ ๊ทน๋๋ก ์ง๋ฃจํ๊ณ ์ฌ์ํด ๋ณด์ด๋ ์์คํ ๋ด๋ถ์ ๊ตฌ์ฒด์ ์ธ ์๋ ๋ฐฉ์(gory details of the guts)โ์ ๊น์ ํฅ๋ฏธ๋ฅผ ๋๋ผ๊ณ ์ง์ฐฉํ๋ ํ๋์ ๋๋ค.
- ์ง๋ฃจํจ์ ์ฌ์ ์: ์ธ๋ถ์ธ์ด๋ ์ผ๋ฐ ๊ฐ๋ฐ์์๊ฒ๋ ๋์ ํ ์ค๋ช ํ๊ธฐ ์ด๋ ต๊ณ ๋ฃ๋ ์๊ฐ ์กธ์์ด ์ฌ ๋งํ ํ๋์จ์ด ๋ฐ ๋ฐํ์์ ๋ฏธ์ธํ ๋์ ์๋ฆฌ๋ฅผ ํ๊ตฌํ๋ ๊ณผ์ ์ ์ง๋ฃจํ ์ผ์ด ์๋๋ผ ํฅ๋ฏธ์ง์งํ ๋์ ์ผ๋ก ์ธ์ํด์ผ ํฉ๋๋ค.
- ํ๋ จ๋ ์ ์๋ ํ๊ณ ๋ ์ฑํฅ (An Untrainable Mindset)
- ์ ์ฒ์ ์ธ ํธ๊ธฐ์ฌ: Andrew๋ ์ด๋ฌํ ์ฌ๊ณ ๋ฐฉ์์ด ๊ต์ก์ด๋ ํ๋ จ์ ํตํด ์ฃผ์ ๋ ์ ์๋ ์์ญ์ธ์ง์ ๋ํด ์๋ฌธ์ ์ ๊ธฐํฉ๋๋ค.
- ์๋ฐ์ ์ด์ : ์ ์์ค ์ฝ๋๋ฅผ ๋ฏ์ด๋ณด๊ณ ๋ถ์ํ ๋ โ๋์ ๋ฐ์ง ์๋๋ผ๋ ์ฌ๋ฏธ์์ด์ ์ค์ค๋ก ๊ธฐ๊บผ์ด ์ด์ด๋ณผ ๋งํโ ๊ฐ๋ฐ์ ์ด๊ณ ์์ํ ์ง์ ํธ๊ธฐ์ฌ์ ๋๋ผ๋ ์ฑํฅ ์์ฒด๊ฐ ์ฑ๋ฅ ์์ง๋์ด๊ฐ ๊ฐ์ง ๊ฐ์ฅ ํฐ ์์ฐ์ด์ ์ฐจ๋ณ์ ์ ๋๋ค.
Leave a comment