Resident Resource Plan 56d KO - teamswyg/laya-tools GitHub Wiki

์ƒ์ฃผ ์ž์› ์‹คํ—˜56d ์‚ฌ์ „ ์„ค๊ณ„: ์บ์‹œ ์—†๋Š” JSONL ์™•๋ณต ๋น„์šฉ

English ยท ๊ธฐ์กด56a ์ž์› ๊ฒฐ๊ณผ ยท 56b ๊ฐ์‚ฌ ๊ฒฐ๊ณผ ยท ๋‹ค์Œ ์˜๋ฏธยทํšจ์šฉ ๊ฒฝ๋กœ56c

์ด ๋ฌธ์„œ๋Š” ์‹คํ–‰ ์ „ ์„ค๊ณ„์•ˆ์ด๋‹ค. ๊ธฐ๊ณ„ ์‹คํ–‰ ๊ณ„ํšยท์ž…๋ ฅยท๋ฐ”์ด๋„ˆ๋ฆฌ์˜ ์ตœ์ข… ๋ด‰์ธ, ๊ณต์‹ ์ž์› ์ธก์ •, CI ์™„๋ฃŒ ๊ธฐ๋ก์€ ์•„์ง ์—†๋‹ค. ์—ฌ๊ธฐ ์ ํžŒ ํšŸ์ˆ˜์™€ ์˜ˆ์‚ฐ์€ ์ œ์•ˆ๊ฐ’์ด๋ฉฐ ์ธก์ •๊ฐ’์ด ์•„๋‹ˆ๋‹ค. ํ˜„์žฌ56b์˜ ์ƒˆ ์„ฑ๋Šฅ ์‹คํ–‰ยท๋ชจ๋ธ ํ˜ธ์ถœยทfitยท์ƒˆ ๊ฐ€์ค‘์น˜๋Š” ๋ชจ๋‘0์ด๋‹ค.

์ž‘์€ Go ํžŒํŠธ ๋„๊ตฌ๋ฅผ ์—ฌ๋Ÿฌ ๋ฒˆ ์“ฐ๋Š” ์—์ด์ „ํŠธ๋ฅผ ๊ฐ€์ƒ ์‚ฌ์šฉ์ž๋กœ ๋‘”๋‹ค. ๋งค ์š”์ฒญ๋งˆ๋‹ค ํ”„๋กœ์„ธ์Šค๋ฅผ ์ƒˆ๋กœ ์‹œ์ž‘ํ•˜๋Š” ๋Œ€์‹  ํ•˜๋‚˜์˜ ํ”„๋กœ์„ธ์Šค์— JSON ํ•œ ์ค„์„ ๋ณด๋‚ด๊ณ  ์ถ”์ฒœ ๊ฒ€์‚ฌ ์ˆœ์„œ ํ•œ ์ค„์„ ๋ฐ›๋Š”๋‹ค. ์ด๋ฒˆ ์งˆ๋ฌธ์€ ์ด ์™•๋ณต์— ๋“œ๋Š” ์ „์ฒด CPUยท๋ฉ”๋ชจ๋ฆฌยท์‹œ๊ฐ„์ด๋‹ค. ์ˆœ์œ„์˜ ์˜๋ฏธ ์ •ํ™•๋„์™€ ์‹ค์ œ LLM ์‚ฌ์šฉ๋Ÿ‰ ๊ฐ์†Œ๋Š” ๋ณ„๋„ ํšจ์šฉ ๊ฒ€์ฆ ๋Œ€์ƒ์ด๋‹ค.

๊ธฐ์กด ๊ด€์ธก๊ณผ ์ด๋ฒˆ ๋ฒ”์œ„

56a๋Š” ๊ฐ™์€8ํ›„๋ณด ์˜ˆ์ œ๋ฅผ ๊ธฐ์ค€๋งˆ๋‹ค cold3ํšŒยทwarm1ํšŒ๋กœ ์‹คํ–‰ํ–ˆ๋‹ค. ์ฒซ cold๋Š” 370.932333ms, ๋‚˜๋จธ์ง€11ํšŒ๋Š”2.564958~5.232667ms์˜€์œผ๋ฉฐ ์ตœ์ดˆ ์‹คํ–‰ยทOS/ํŒŒ์ผ cache์˜ ์›์ธ์€ ๋ฏธํ™•์ธ์ด๋‹ค. ๋ณ„๋„ ํ”„๋กœํŒŒ์ผ์˜ runtime.kevent flat0.88์ดˆยท**83.02%**๋„ ๊ท€์† ๋ฏธํ•ด๊ฒฐ๋กœ ๋‚จ๋Š”๋‹ค. ์ด๋ฅผ application ๋ณ‘๋ชฉ์ด๋‚˜ ๊ณต์œ  lock ๊ฒฝํ•ฉ์œผ๋กœ ํ™•์ •ํ•˜์ง€ ์•Š๋Š”๋‹ค. ์ด ์›๋ฌธยท์ˆ˜์น˜ยท์ฒซ ๊ด€์ธก์€ ๋ณด์กดํ•œ๋‹ค.

ํ˜„์žฌ stream์€ ๋งค ์ค„ JSON ์ค€๋น„ยท๊ฒ€์ฆยท์ˆœ์œ„ยท์ž…๋ ฅ digestยท์‹ค์ œ ์ถœ๋ ฅ ์ง๋ ฌํ™”๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ฉฐ ๊ฒฐ๊ณผ ์บ์‹œ๊ฐ€ ์—†๋‹ค. benchmark๋Š” io.Discard ์ถœ๋ ฅ๊ณผ ๋‹จ๊ณ„ ๋ฐ˜๋ณต์„ ์‚ฌ์šฉํ•˜๊ณ  --stream๊ณผ ํ•จ๊ป˜ ์‹คํ–‰ํ•  ์ˆ˜ ์—†๋‹ค. --cpuprofile๋„ benchmark ์ „์šฉ์ด๋‹ค. 56a์˜ warm p95๋ฅผ ์ƒ์ฃผ pipe ์™•๋ณต ์ง€์—ฐ์œผ๋กœ ๋ฐ”๊พธ์–ด ๋ถ€๋ฅด์ง€ ์•Š๋Š”๋‹ค. ์˜คํ”„๋ผ์ธ go/types ์›์ฒœ ๊ฐ์‚ฌ ๋น„์šฉ๋„ runtime ํžŒํŠธ ๋น„์šฉ์— ํฌํ•จํ•˜์ง€ ์•Š๋Š”๋‹ค.

์ธก์ • ์ „์— ์ค€๋น„ํ•˜๊ณ  ๋ด‰์ธํ•  ์ž…๋ ฅ

๊ธฐ์กด 48์š”์ฒญ๊ณผ 24์š”์ฒญ, ํ•ฉ๊ณ„72๊ฐœ ๊ณต๊ฐœ ์ž์ฒด ์ž‘์„ฑ ์ž๋ฃŒ๋ฅผ ์ค€๋น„ ์›์ฒœ์œผ๋กœ ์‚ผ๋Š”๋‹ค. ๊ฐ๊ฐ์˜ FeatureInputs ํˆฌ์˜์œผ๋กœ ์š”์ฒญ๊ณผ ์ˆœ์„œ ์žˆ๋Š” ํ›„๋ณด ์„ค๋ช…๋งŒ ์ถ”์ถœํ•œ๋‹ค. prototypeยทsourceยท๊ณ„์•ฝยท์ •๋‹ตยท์—ญํ• ์€ ์ˆœ์œ„ ์ž…๋ ฅ์—์„œ ์ œ์™ธํ•œ๋‹ค. typed ์ž๋ฃŒ์˜ ์›์ฒœยท์–ธ์–ด ๊ฒ€์‚ฌ๋Š” ์ค€๋น„ ๋‹จ๊ณ„์—์„œ ์ˆ˜ํ–‰ํ•˜๊ณ , ์ž์› ์ธก์ • driver๋Š” ์ค€๋น„๋œ runtime JSONL๋งŒ ์ฝ๋Š”๋‹ค.

  1. ํ›„๋ณด๊ฐ€ ์›๋ž˜3๊ฐœ์ธ ํˆฌ์˜๋งŒ ์‚ฌ์šฉํ•œ๋‹ค. ํ›„๋ณด๋ฅผ ์‚ญ์ œยท์ถ”๊ฐ€ยท๋ณต์ œํ•˜๊ฑฐ๋‚˜ ์„ค๋ช…์„ ์ž˜๋ผ3๊ฐœ๋กœ ๋งž์ถ”์ง€ ์•Š๋Š”๋‹ค. ์š”์ฒญ๊ณผ ํ›„๋ณด ๊ฐ๊ฐ ์›๋ฌธยท์ •๊ทœํ™”512๋ฐ”์ดํŠธ ์ดํ•˜, ์ •๊ทœํ™”32๋‹จ์–ด ์ดํ•˜, JSON ํ•œ ์ค„12KiB ์ดํ•˜๋ฅผ ๊ฒ€์ฆํ•œ๋‹ค.
  2. ์ •๊ทœํ™”๋œ ์š”์ฒญ, ํ›„๋ณด ์ˆ˜3, ์ •๊ทœํ™”๋œ ํ›„๋ณด ์„ค๋ช…3๊ฐœ๋ฅผ ์ˆœ์„œ๋Œ€๋กœ ๊ธธ์ด๋ฅผ ๋ถ™์—ฌ ์ธ์ฝ”๋”ฉํ•œ SHA-256์„ feature_sha256์œผ๋กœ ์ œ์•ˆํ•œ๋‹ค. ์ธ์ฝ”๋”ฉ ๊ทœ์น™๊ณผ ๊ตฌํ˜„ ํ•ด์‹œ๋Š” ์‹คํ–‰ ์ „์— ๊ณ ์ •ํ•œ๋‹ค. IDยทprovenance๋Š” ์ด ํ•ด์‹œ์—์„œ ์ œ์™ธํ•œ๋‹ค. ๊ฐ™์€ ์„ค๋ช…์˜ ID๋งŒ ๋ฐ”๊พธ๊ฑฐ๋‚˜ whitespace๋งŒ ๋ฐ”๊พผ ๊ฒƒ์€ ์ƒˆ๋กœ์šด feature payload๊ฐ€ ์•„๋‹ˆ๋‹ค. ์ด ํ•ด์‹œ๋Š” ๋ณด์ˆ˜์ ์ธ ์ค‘๋ณต ์„ ํƒ ๊ธฐ์ค€์ด๋ฉฐ, ๋ชจ๋“  ๊ธฐ์ค€์„ ์˜ ์ถœ๋ ฅ ๋™๋“ฑ์„ฑ์ด๋‚˜ ๋ฏธ๋ž˜ cache key์˜ ์•ˆ์ „์„ฑ์„ ์ฆ๋ช…ํ•˜์ง€ ์•Š๋Š”๋‹ค.
  3. ์•ˆ์ •์ ์ธ ์›๋ณธ ์ˆœ์„œ์—์„œ feature SHA๋ฅผ ์ค‘๋ณต ์ œ๊ฑฐํ•œ๋‹ค. ์„ ํƒยท์ œ์™ธ ๋ชฉ๋ก, ์›๋ž˜ ๋ถ€๋ชจ์™€์˜ ์—ฐ๊ฒฐ, ์š”์ฒญ/ํ›„๋ณด์˜ ๋ฐ”์ดํŠธยท๋‹จ์–ด ์ˆ˜, ์„œ๋กœ ๋‹ค๋ฅธ payload ์ˆ˜๋ฅผ ๊ณต๊ฐœ ์ค€๋น„ manifest์— ๋‚จ๊ธด๋‹ค. ์ ์–ด๋„2๊ฐœ์˜ ์„œ๋กœ ๋‹ค๋ฅธ feature payload๋ฅผ ํ™•์ธํ•˜๊ธฐ ์ „์—๋Š” ๊ณต์‹ ๊ธฐ๊ณ„ ์‹คํ–‰ ๊ณ„ํš์„ ๋ด‰์ธํ•˜๊ฑฐ๋‚˜ ์‹คํ–‰ํ•˜์ง€ ์•Š๋Š”๋‹ค. ๋” ๋งŽ์€ payload๊ฐ€ ๋…๋ฆฝ ์ •๋‹ตยทํ•™์Šต ๊ทธ๋ฃนยท์ตœ์ข… ์š”์ฒญ ์ˆ˜๋ฅผ ๋Š˜๋ฆฌ๋Š” ๊ฒƒ๋„ ์•„๋‹ˆ๋‹ค.
  4. same์€ ๊ณ ์ •ํ•œ ์ฒซ payload๋ฅผ ๋ฐ˜๋ณตํ•œ๋‹ค. distinct๋Š” ์ค‘๋ณต ์ œ๊ฑฐํ•œ ์ „์ฒด ๋ชฉ๋ก์„ ์•ˆ์ •์ ์ธ ์ˆœ์„œ๋กœ ์ˆœํ™˜ํ•œ๋‹ค. ์ธก์ • ๋‹จ๊ณ„์˜ ์ฒซ ๋ชฉ๋ก ์œ„์น˜๋„ ๊ณ ์ •ํ•œ๋‹ค. ๊ฐ workload๋Š” ๋ชจ๋“  ๊ธฐ์ค€์„ ์—์„œ ๋™์ผํ•œ byte sequence๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ๋‘ workload์˜ ํฌ๊ธฐยท๋‹จ์–ด ๋ถ„ํฌ ์ฐจ์ด๋ฅผ ๊ณต๊ฐœํ•˜๊ณ , ์ฐจ์ด๋ฅผ ์ž…๋ ฅ ์žฌ์‚ฌ์šฉ๋งŒ์˜ ์ธ๊ณผ ํšจ๊ณผ๋กœ ํ•ด์„ํ•˜์ง€ ์•Š๋Š”๋‹ค.
  5. runtime envelope์˜ schemaยทIDยทprovenance๋Š” ๊ณต๊ฐœ ์ƒ์ˆ˜ยทํ‰๋ฉด ์‹๋ณ„์ž๋กœ ์ค€๋น„ํ•ด ๊ฐ JSON ์ค„์˜ raw SHA์™€ ๊ธฐ์กด ์ž…๋ ฅ digest๋ฅผ ๊ณ ์ •ํ•œ๋‹ค. ID๋Š” ์ถœ๋ ฅ ๋Œ€์‘ ํ™•์ธ์šฉ metadata๋‹ค. feature_sha256, JSON raw SHA, metadata๋„ ํฌํ•จํ•˜๋Š” ์ž…๋ ฅ digest๋Š” ๊ฐ๊ฐ ๋‹ค๋ฅธ ๊ฐ’์œผ๋กœ ๊ธฐ๋กํ•œ๋‹ค.

์‹คํ–‰ ์ „ ๋ณ„๋„ ์ค€๋น„ ๊ฒ€์‚ฌ์—์„œ ๊ธฐ๋Œ€ protocol ์‘๋‹ต์„ ๋งŒ๋“  ๋’ค ํ”Œ๋žซํผ๋ณ„ ์‘๋‹ต bytes SHA๋ฅผ ๋ด‰์ธํ•œ๋‹ค. ์ด๋Š” ์ž…๋ ฅ ๋Œ€์‘ยท๊ฒฐ์ •์  ์ถœ๋ ฅ ๊ฒ€์‚ฌ์šฉ์ด๋ฉฐ ์‹ค์ œ ์ƒ์ฃผ ์ฒ˜๋ฆฌ๊ธฐ๋Š” ๋ชจ๋“  ์š”์ฒญ์„ ๋‹ค์‹œ ๊ณ„์‚ฐํ•œ๋‹ค. ์‹ค์ œ ์‘๋‹ต SHA๋„ ๊ฒฐ๊ณผ์— ๊ธฐ๋กํ•œ๋‹ค. ์„œ๋กœ ๋‹ค๋ฅธ ํ”Œ๋žซํผ์˜ ๋ถ€๋™์†Œ์ˆ˜์  ์ถœ๋ ฅ bytes๊ฐ€ ๊ฐ™๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์ง€ ์•Š๋Š”๋‹ค. ์ด ๋‹จ๊ณ„์˜ protocol ์ค€๋น„๋Š” ์ •๋‹ต ๋ผ๋ฒจยทoracle ํšจ์šฉ์„ ๊ด€์ธกํ•˜๋Š” ์‹คํ—˜์ด ์•„๋‹ˆ๋‹ค.

์ž‘์€ ์‹คํ–‰ ํ–‰๋ ฌ๊ณผ ์˜ˆ์‚ฐ

์‚ฌ์ „ ์ œ์•ˆ ๊ฐ’๊ณผ ์˜๋ฏธ
๊ธฐ์ค€์„  fixed_order, bm25, lexical_ordered, narrow_rule
workload์™€ ๋ฐ˜๋ณต same/distinct ๊ฐ๊ฐ ์ƒˆ ์ƒ์ฃผ ํ”„๋กœ์„ธ์Šค3ํšŒ: 4 ร— 2 ร— 3 = 24 children
ํ•œ child์˜ ์š”์ฒญ ์ฒซ ์‘๋‹ต1 + warmup20 + timed1024 = 1045์š”์ฒญ
์ „์ฒด ์˜ˆ์ • ์š”์ฒญ 25,080์š”์ฒญ; timed24,576๊ฐœ. ๋ฐ˜๋ณต์ด๋ฉฐ ์ƒˆ๋กœ์šด ๊ฐœ๋ฐœยท์ตœ์ข… ์ž๋ฃŒ๊ฐ€ ์•„๋‹˜
์ฒ˜๋ฆฌ ๋ฐฉ์‹ child1๊ฐœยทinflight1๊ฐœ. ์ด์ „ ์‘๋‹ต์˜ ๋Œ€์‘ ๊ฒ€์‚ฌ๋ฅผ ๋งˆ์นœ ๋’ค ๋‹ค์Œ ์š”์ฒญ ์ „์†ก
CPUยทGo heap child์™€ controller์˜ GOMAXPROCS=1, Go heap256MiB soft limit
์‹œ๊ฐ„ ์ œํ•œ child15์ดˆ, ์ „์ฒด ๊ณต์‹ replay60์ดˆ; ์ž๋™ ์žฌ์‹œ๋„0
๊ณต๊ฐœ ๊ฒฐ๊ณผ ์ €์žฅ ์‹ ๊ทœ ๊ฒฐ๊ณผ ํ•ฉ๊ณ„8MiB ์ด๋‚ด; ๋งค ์‘๋‹ต์„ ๋ฌด์ œํ•œ์œผ๋กœ ๋ˆ„์ ํ•˜์ง€ ์•Š์Œ

GOMAXPROCS๋Š” Go์˜ ๋™์‹œ ์‹คํ–‰ P ์ˆ˜์ด๋ฉฐ OS ์Šค๋ ˆ๋“œ ์ˆ˜ยทCPU affinity ๋ณด์žฅ์ด ์•„๋‹ˆ๋‹ค. Go heap soft limit์€ ์ „์ฒด RSSยทnativeยทGPU ๋ฉ”๋ชจ๋ฆฌ์˜ hard cap์ด ์•„๋‹ˆ๋‹ค. CPU-only์ด๊ณ  ์ธ์ฝ”๋”ยทGPUยท๋ชจ๋ธยท๊ฒฐ๊ณผ ์บ์‹œ๋Š” ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒฝ๋กœ๋ฅผ ๊ณ ์ •ํ•œ๋‹ค. ํ”„๋กœ์„ธ์Šค ์ข…๋ฃŒ์™€ pipe ์ •๋ฆฌ ํ™•์ธ์„ ํฌํ•จํ•œ ์ œํ•œ ์ •์ฑ…์€ driver ๊ตฌํ˜„ยท๊ฒ€์‚ฌ ํ›„ ๋ด‰์ธํ•œ๋‹ค.

distinct๋„ ์„œ๋กœ ๋‹ค๋ฅธ feature pool์„ ์ˆœํ™˜ํ•˜๋Š” ๋ฐ˜๋ณต์ด๋‹ค. Child์˜ timed1024ํšŒ๊ฐ€ ์„œ๋กœ ๋‹ค๋ฅธ1024์š”์ฒญ์ด๋ผ๋Š” ๋œป์ด ์•„๋‹ˆ๋ฉฐ, timed24,576๊ฐœ๋Š” ํƒ€์ด๋ฐ ๊ด€์ธก์˜ ์˜ˆ์ • ๊ฐœ์ˆ˜๋‹ค. ๋…๋ฆฝ ํ•™์Šตยท์ตœ์ข… ํ‘œ๋ณธ ์ˆ˜์— ๋”ํ•˜์ง€ ์•Š๋Š”๋‹ค.

์‹คํ–‰ ์ˆœ์„œ24ํ–‰์„ ์‚ฌ์ „์— ๊ณ ์ •ํ•œ๋‹ค. ๊ธฐ์กด ๊ธฐ์ค€์„  ์ˆœ์„œ์™€ same/distinct ์ˆœ์„œ๋ฅผ ๊ต๋Œ€๋กœ ๋ฐฐ์น˜ํ•˜๋Š” ๊ฒฐ์ •์„ ์ธก์ • ์ „์— ๋‚จ๊ธด๋‹ค. ์ฒซ child์™€ ๊ฐ child์˜ ์ฒซ ์‘๋‹ต์„ ๋ณ„๋„ ๊ธฐ๋กํ•˜๋ฉฐ ์ œ์™ธํ•˜๊ฑฐ๋‚˜ ๋‹ค๋ฅธ ๊ธฐ์ค€์„ ์˜ ์˜ˆ์—ด๋กœ ๋Œ€์ฒดํ•˜์ง€ ์•Š๋Š”๋‹ค. ์ƒˆ ํ”„๋กœ์„ธ์Šค๋ฅผ OS cache๊นŒ์ง€ ๋น„์šด cold๋ผ๊ณ  ๋ถ€๋ฅด์ง€ ์•Š์œผ๋ฉฐ cache flush๋ฅผ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š๋Š”๋‹ค. ๋นŒ๋“œยท๋ฐ”์ด๋„ˆ๋ฆฌ ๊ฒ€์ฆ/๋ณต์‚ฌยทcorpus ์ค€๋น„๋Š” ๋ณ„๋„ ์ค€๋น„ ๋‹จ๊ณ„๋‹ค.

๊ด€์ธก ๊ฐ€๋Šฅํ•œ ์‹œ๊ฐ„๊ณผ ๊ด€์ธก ๋ฐ–์˜ ๋น„์šฉ

ํ•ญ๋ชฉ ๊ณ ์ •ํ•  ๊ด€์ธก ๊ฒฝ๊ณ„
spawn-call wall controller์˜ ์‹œ์ž‘ ํ˜ธ์ถœ ์ง์ „๋ถ€ํ„ฐ ๊ทธ ํ˜ธ์ถœ ๋ฐ˜ํ™˜๊นŒ์ง€. child๊ฐ€ ์ค€๋น„๋๋‹ค๋Š” ์‹ ํ˜ธ๋Š” ์•„๋‹˜
์ฒซ ์‘๋‹ต๊นŒ์ง€ ์‹œ์ž‘ ํ˜ธ์ถœ ์ง์ „๋ถ€ํ„ฐ ์ฒซ ์™„์ „ํ•œ ์‘๋‹ต ์ค„ ์ˆ˜์‹ ๊นŒ์ง€: startupยท์ฒซ ์ฒ˜๋ฆฌยทpipeยทcontroller๊ฐ€ ํ•ฉ์ณ์ง
wire RTT ๊ฐ ์š”์ฒญ ์“ฐ๊ธฐ ์‹œ์ž‘๋ถ€ํ„ฐ ์™„์ „ํ•œ ์‘๋‹ต ์ค„ ์ˆ˜์‹ ๊นŒ์ง€. ์“ฐ๊ธฐ ๋Œ€๊ธฐยทchild ์ฒ˜๋ฆฌยทpipeยท์ˆ˜์‹  framing ํฌํ•จ
write blocking ์š”์ฒญ ์ค„ ์“ฐ๊ธฐ ์‹œ์ž‘๋ถ€ํ„ฐ ๋ชจ๋“  byte์˜ ์“ฐ๊ธฐ๊ฐ€ ๋ฐ˜ํ™˜๋  ๋•Œ๊นŒ์ง€
controller ๊ฒ€์ฆ ์™„์ „ํ•œ ์‘๋‹ต ์ค„ ์ˆ˜์‹  ํ›„ JSONยทdigestยทํ›„๋ณด ๋ณด์กด ๊ฒ€์‚ฌ๊ฐ€ ๋๋‚  ๋•Œ๊นŒ์ง€
warm ๋ถ„ํฌ warmup ๋’ค1024๊ฐœ์˜ wire RTT p50/p95/max์™€ ์™„๋ฃŒ ์ˆ˜

์ฝ๊ธฐ๋Š” bounded framing์œผ๋กœ ์‘๋‹ต ์ค„์„ ๊ณ„์† drainํ•˜๊ณ , ์ˆ˜์‹  ํƒ€์ž„์Šคํƒฌํ”„๋ฅผ ์žก์€ ๋’ค ๋Œ€์‘ ๊ฒ€์‚ฌ๋ฅผ ํ•œ๋‹ค. ํ˜„์žฌ stream์—๋Š” ready ์‹ ํ˜ธ๋‚˜ child ๋‚ด๋ถ€ ํƒ€์ž„์Šคํƒฌํ”„๊ฐ€ ์—†๋‹ค. ๋”ฐ๋ผ์„œ ์ˆœ์ˆ˜ startup, child ๋‚ด๋ถ€ ์ฒ˜๋ฆฌ๋งŒ์˜ ์ง€์—ฐ, ์ˆœ์ˆ˜ pipe ๋น„์šฉ์€ unobserved๋กœ ๋‘”๋‹ค. ์‹œ๊ฐ„ ํ•ญ๋ชฉ๋“ค์€ ์„œ๋กœ ๊ฒน์น  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋”ํ•˜๊ฑฐ๋‚˜ ์ฐจ๊ฐํ•ด application ์‹œ๊ฐ„์„ ๋งŒ๋“ค์ง€ ์•Š๋Š”๋‹ค. ๊ธฐ์กด io.Discard benchmark๋„ pipe ์‹œ๊ฐ„์„ ๋‹จ์ˆœ ์ฐจ๊ฐํ•˜๋Š” ๊ทผ๊ฑฐ๋กœ ์“ฐ์ง€ ์•Š๋Š”๋‹ค.

CPUยท๋ฉ”๋ชจ๋ฆฌ์™€ protocol ํ™•์ธ

Child ์ข…๋ฃŒ ์‹œ user/system CPU์™€ ๊ทธ child ์ „์ฒด lifetime peak RSS๋ฅผ ๊ธฐ๋กํ•œ๋‹ค. Controller๋Š” RUSAGE_SELF์˜ user/system CPU ์ฆ๊ฐ€์™€ ๋ณ„๋„์˜ lifetime peak RSS๋ฅผ ๊ธฐ๋กํ•œ๋‹ค. Controller RSS๋ฅผ ํ–‰๋ณ„๋กœ ๋น„๊ตํ•˜๋ ค๋ฉด ํšŒ๋ณ„ ์ƒˆ controller์—์„œ ์ธก์ •ํ•˜๊ณ  orchestration ๋น„์šฉ์„ ๋”ฐ๋กœ ๋‘”๋‹ค. ๊ด€์ธก๊ธฐ๊ฐ€ child CPU๋ฅผ controller CPU์— ๋‹ค์‹œ ๋”ํ•˜์ง€ ์•Š๋„๋ก ๊ฒ€์‚ฌํ•œ๋‹ค. Peak RSS๋Š” ์ „ํ›„ ์ฐจ์ดยท์ˆœ๊ฐ„ warm RAMยทGo heap์ด ์•„๋‹ˆ๋ฉฐ ๋‘ ํ”„๋กœ์„ธ์Šค peak๋ฅผ ํ•ฉ์ณ ๋™์‹œ ์ด peak๋กœ ์ฃผ์žฅํ•˜์ง€ ์•Š๋Š”๋‹ค. Darwin RSS bytes์™€ Linux KiB์˜ ๋‹จ์œ„๋ฅผ ๊ตฌ๋ถ„ํ•ด bytes๋กœ ๋ณ€ํ™˜ํ•˜๊ณ  ์›๋ž˜ ๋‹จ์œ„๋„ ๊ธฐ๋กํ•œ๋‹ค.

์™„๋ฃŒ๋œ ํ•œ child์˜ CPU/request ๋ถ„๋ชจ๋Š” 1045๋กœ ์ฒซ ์š”์ฒญยทwarmup์„ ํฌํ•จํ•œ๋‹ค. Warm latency์˜ ์˜ˆ์ • ๋ถ„๋ชจ๋Š” 1024๋‹ค. Whole-process CPU๋ฅผ warm phase๋งŒ์˜ CPU๋ผ๊ณ  ๋ถ€๋ฅด์ง€ ์•Š๋Š”๋‹ค. ๊ฐ ํ–‰์— ์˜ˆ์ •ยท์‹œ๋„ยท์™„๋ฃŒยท์‹คํŒจยท๋ฏธ์™„๋ฃŒ ์ˆ˜์™€ ์ž…์ถœ๋ ฅ byte ์ˆ˜๋ฅผ ํ•จ๊ป˜ ๋‚จ๊ธด๋‹ค. ์‹คํŒจยทtimeoutยทprotocol ๋ถˆ์ผ์น˜๋ฅผ ๋ถ„๋ชจ์—์„œ ์ˆจ๊ธฐ๊ฑฐ๋‚˜ ์„ฑ๊ณต์œผ๋กœ ์ฑ„์šฐ์ง€ ์•Š์œผ๋ฉฐ, ๋ถˆ์™„๋ฃŒ ํ–‰์„ ์ •์ƒ์ ์ธ1024ํ‘œ๋ณธ ๊ฒฐ๊ณผ๋กœ ๊ฒŒ์‹œํ•˜์ง€ ์•Š๋Š”๋‹ค. ๋ถˆ์™„๋ฃŒ ํ–‰์€ raw CPU์™€ ์‹ค์ œ ๋‹จ๊ณ„๋ณ„ ์ˆ˜๋ฅผ ๋ณด์กดํ•˜๋ฉฐ, ์™„๋ฃŒ๋œ1045์š”์ฒญ์˜ CPU/request ๊ฐ’์œผ๋กœ ์ฑ„์šฐ์ง€ ์•Š๋Š”๋‹ค.

๊ฐ ์‘๋‹ต์€ ํ•˜๋‚˜์˜ bounded JSON ์ค„์ด์–ด์•ผ ํ•œ๋‹ค. schema์™€ unverified_heuristic ์ƒํƒœ, ๊ธฐ์ค€์„ , ๊ณ ์ •ํ•œ ์ž…๋ ฅ digest, ์‘๋‹ต raw SHA, ์œ ํ•œ ์ ์ˆ˜, ํ›„๋ณด3๊ฐœ์˜ ID๊ฐ€ ์ž…๋ ฅ์˜ ์ •ํ™•ํ•œ permutation์ธ์ง€ ํ™•์ธํ•œ๋‹ค. narrow_rule์˜ ๋ฒ”์œ„ ๋ฐ– ์ž…๋ ฅ์€ ๊ณ ์ •ํ•œ BM25 fallback๊ณผ unsupported_rule_request/unsupported_rule_candidate ์ด์œ ๋ฅผ ํ™•์ธํ•œ๋‹ค. Malformed ์ž…๋ ฅ์€ ์ •์ƒ fallback์œผ๋กœ ๋ฐ”๊พธ์ง€ ์•Š๋Š”๋‹ค. Stderrยทreader ์˜ค๋ฅ˜ยทํ˜ธ์ถœ ์ธ์ž๋Š” ๊ณต๊ฐœํ•˜์ง€ ์•Š๊ณ  ๊ณ ์ • enum๊ณผ ์ข…๋ฃŒ/์ •๋ฆฌ ์ƒํƒœ๋งŒ ๋‚จ๊ธด๋‹ค. Protocol ๊ฒ€์‚ฌ๋Š” ํ›„๋ณด ํ•จ์ˆ˜์˜ ์˜๋ฏธ ์ •๋‹ต์„ ์ธ์ฆํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋‹ค.

์‹คํ–‰ gate์™€ ์ดํ›„ ๊ฒฝ๋กœ

์ƒˆ driver์˜ ์›์ฒœยท๊ฒ€์‚ฌยทmanifest, ์ž…๋ ฅ ํˆฌ์˜/feature ํ•ด์‹œ ๊ทœ์น™, ํ”Œ๋žซํผ๋ณ„ protocol ๊ธฐ๋Œ€๊ฐ’, 24ํ–‰ ์ˆœ์„œ์™€ ์ข…๋ฃŒ ์ •์ฑ…์„ ๊ฒ€ํ† ยท๊ฒ€์‚ฌํ•œ๋‹ค. Go1.27.1ยทCGO0ยทtrimpath binary์˜ buildinfo, ๋ฐ”์ด๋„ˆ๋ฆฌ bytes SHA, source/input/output pins, ์‹ ๊ทœ driver SHA์™€ ๊ธฐ๊ณ„ ์‹คํ–‰ ๊ณ„ํš์„ ๊ณต์‹ ์ˆ˜์ง‘ ์ „์— ๋ด‰์ธํ•œ๋‹ค. ์ •ํ™•ํžˆ ํ™•์ธํ•œ bytes๋กœ ์‹คํ–‰ํ•ด ์žฌ์ฝ๊ธฐ ์‚ฌ์ด ๋ณ€๊ฒฝ์„ ๋ง‰๊ณ  ์ƒˆ ์ถœ๋ ฅ๋งŒ ํ—ˆ์šฉํ•œ๋‹ค. CI๋Š” ์‹ค์ œ ์‹คํ–‰๋œ ๋’ค ํ•ด๋‹น ์ƒํƒœยท๋งํฌ๋ฅผ ๊ธฐ๋กํ•œ๋‹ค. ์ด ๋ฌธ์„œ์—๋Š” ์‹คํ–‰ํ•  ์ค€๋น„๊ฐ€ ๋๋‚ฌ๋‹ค๋Š” ๋ฑƒ์ง€๋‚˜ ์„ฑ๊ณต ๋งํฌ๋ฅผ ๋ถ™์ด์ง€ ์•Š๋Š”๋‹ค.

Matched-byte echo/framing 6๋Œ€์กฐ๋Š” ๊ท€์† ๊ฒ€ํ† ์šฉ ํ›„์† ๋ณ„๋„ ๊ณ„ํš์ด๋‹ค. ์ด๋ฒˆ24ํ–‰์— ๋ชฐ๋ž˜ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ๊ทธ ์ง€์—ฐ์„ ์‹ค์ œ ์™•๋ณต์—์„œ ์ฐจ๊ฐํ•˜์ง€ ์•Š๋Š”๋‹ค. ์ •ํ™•ํ•œ startup ๋ถ„๋ฆฌ๊ฐ€ ํ•„์š”ํ•˜๋ฉด ๋ฒ„์ „์ด ์žˆ๋Š” ready ์‹ ํ˜ธ๋ฅผ ๋ณ„๋„ ์„ค๊ณ„ํ•œ๋‹ค. Bounded queue์˜ open-loop ๋„์ฐฉ๋ฅ ยท๋™์‹œ์„ฑ, ์บ์‹œ์™€ ๋ฌดํšจํ™”, lockยทSIMDยทSoA ๋ณ€๊ฒฝ์€ ์ดํ›„ ๋…๋ฆฝ ๊ณ„ํš ๋Œ€์ƒ์ด๋‹ค. ๊ธฐ์กด kevent ๊ท€์† ๋ฏธํ•ด๊ฒฐ๊ณผ ์ฒซ cold ๊ด€์ธก์„ ๋ณด์กดํ•˜๋ฉฐ ํ˜„์žฌ cacheยทSIMDยท์†๋„ ๊ฐœ์„ ์„ ์ฃผ์žฅํ•˜์ง€ ์•Š๋Š”๋‹ค.

๊ณต๊ฐœ ์‚ฐ์ถœ๋ฌผ์€ ์›๋ณธ ๊ณต๊ฐœ fixture, ๊ณ„ํšยท์ˆ˜์น˜ยทํ•ด์‹œยท๋ฒ”์œ„ ์„ค๋ช…์ด๋‹ค. ์‹ค์ œ ์—…๋ฌด ์ž…๋ ฅยท๊ฐœ์ธ ์ ˆ๋Œ€ ๊ฒฝ๋กœยท์ธ์ฆยท๋ฐ”์ด๋„ˆ๋ฆฌยท์›์‹œ pprof/trace๋Š” ๊ฒŒ์‹œํ•˜์ง€ ์•Š๋Š”๋‹ค. ์ด๋ฒˆ ์„ค๊ณ„์˜ ํ•™์Šตยท๋ชจ๋ธ ํ˜ธ์ถœยท๊ฐ€์ค‘์น˜ยท์šด์˜ ํ™œ์„ฑํ™”ยทprotected final/CoSQA ์ ‘๊ทผ์€0์ด๋ฉฐ, ๋„๋ฉ”์ธ๋ณ„ ์„œ๋กœ ๋‹ค๋ฅธ ๋ณดํ˜ธ๋œ ์ตœ์ข… ํ‰๊ฐ€ ์ตœ์†Œ2400์š”์ฒญ ๋ชฉํ‘œ๋Š” ๋ณ„๋„๋‹ค.