Performance Engineering on Hard Mode with Andrew Hunter: Summary

12 minute read

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)์„ ์ˆœ์ฐจ์ ์œผ๋กœ ์ œ๊ฑฐํ•ด ๋‚˜๊ฐ€๋Š” ์ง๊ด€์ ์ธ ์ž‘์—…์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์ด๋กœ ์ธํ•ด ์ตœ์ ํ™” ์ž์ฒด์˜ ๋‚œ์ด๋„์™€๋Š” ๋ณ„๊ฐœ๋กœ โ€˜๋ฌด์—‡์„ ๊ฐœ์„ ํ•ด์•ผ ํ•˜๋Š”๊ฐ€โ€™์— ๋Œ€ํ•œ ํŒ๋‹จ์ด ๋ช…ํ™•ํ•˜๋ฏ€๋กœ โ€œ์ด์ง€ ๋ชจ๋“œโ€๋ผ๊ณ  ์ง€์นญํ•ฉ๋‹ˆ๋‹ค.
  • ๋ ˆ์ดํ„ด์‹œ ๋ฏผ๊ฐํ˜• ํŠธ๋ ˆ์ด๋”ฉ ์ตœ์ ํ™”: โ€œํ•˜๋“œ ๋ชจ๋“œ(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) ์•„ํ‚คํ…์ฒ˜๋ฅผ ๋„์ž…ํ•˜๋Š” ๊ฒƒ์ด ๊ทผ๋ณธ์ ์ธ ํ…Œ์ผ ์ตœ์ ํ™” ํŒ์ž…๋‹ˆ๋‹ค.
  • ์ˆ˜๋ช… ์ฃผ๊ธฐ ๋ฉ”๋ชจ๋ฆฌ ํŠธ๋ ˆ์ด์‹ฑ - 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