Churn Performance KO - k-p2p-lab/kpl-v3 GitHub Wiki

Controller ์„ฑ๋Šฅ ์กฐ์‚ฌ์™€ ๋ฒค์น˜๋งˆํฌ

Wiki home โ€บ ํ•œ๊ตญ์–ด ๋ฌธ์„œ ยท ์˜์–ด ์›๋ฌธ

๋ฌธ์„œ ์•ˆ๋‚ด ยท ์†Œ์Šค ์ €์žฅ์†Œ

๊ตฌํ˜„์— ๋Œ€ํ•œ ๊ทผ๊ฑฐ์ด๋ฉฐ ์šฉ๋Ÿ‰ ๋ณด์žฅ์€ ์•„๋‹™๋‹ˆ๋‹ค. ์šด์˜ ์ค‘์ธ ๋ฐฐํฌ๋Š” Agent ์šฉ๋Ÿ‰๊ณผ ๋ชจ๋‹ˆํ„ฐ๋ง๋ถ€ํ„ฐ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค. ์•„๋ž˜๋Š” ๊ณผ๊ฑฐ ์กฐ์‚ฌ ๊ธฐ๋ก์ด๋ฉฐ ์ด๋ฒˆ ๋ฌธ์„œ ์žฌ๊ตฌ์„ฑ์œผ๋กœ ์ธก์ •์„ ๋‹ค์‹œ ์ˆ˜ํ–‰ํ•œ ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.

2026-09-22 ์กฐ์‚ฌ์—์„œ ๋ˆ„์  Peer ๊ธฐ๋ก์€ 65,227๊ฐœ์˜€๊ณ , Prometheus์˜ ์ตœ๊ทผ 5๋ถ„ ํ‰๊ท ์—์„œ Controller๋Š” ์•ฝ 7.17๊ฐœ ์ฝ”์–ด์™€ ์ดˆ๋‹น ์•ฝ 526MB์˜ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น์„ ๊ธฐ๋กํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น๋ฅ ์€ ์‚ฌ์šฉ ์ค‘์ธ ๋ฉ”๋ชจ๋ฆฌ ํฌ๊ธฐ์™€ ๋ณ„๊ฐœ์ด๋ฉฐ, ์งง๊ฒŒ ์“ฐ๊ณ  ๋ฒ„๋ฆฌ๋Š” ๊ฐ์ฒด์˜ ์ƒ์„ฑยทํšŒ์ˆ˜ ๋น„์šฉ๋„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.

์กฐ์‚ฌํ•œ ๊ฒฝ๋กœ์™€ ๊ตฌํ˜„ ๋ณ€๊ฒฝ

  • /api/v1/bootstrap์ด ์ฃผ์†Œ ๋ชฉ๋ก์„ ๊ตฌํ•˜๊ธฐ ์œ„ํ•ด ์ „์ฒด snapshot์„ ์ƒ์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ณผ์ •์—์„œ ๊ณผ๊ฑฐ Peer ์ „์ฒด ๋ณต์‚ฌยท์ •๋ ฌ, ์‹คํ—˜ ์ง€ํ‘œ ๋ฐ ํ† ํด๋กœ์ง€ ๊ณ„์‚ฐ์ด ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ ํ™œ์„ฑ ๋…ธ๋“œ ์ธ๋ฑ์Šค์—์„œ ํ•ด๋‹น ์‹คํ–‰์˜ ready boot ์ฃผ์†Œ๋งŒ ์ฝ์Šต๋‹ˆ๋‹ค.
  • Discovery์™€ ๋ถ€๋ถ„ heartbeat์˜ ์ ์œ ๋Ÿ‰ ํ™•์ธ๋„ ํ™œ์„ฑ ๋…ธ๋“œ ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋ถ€๋ถ„ heartbeat์—์„œ ์ƒ๋žต๋œ ๋…ธ๋“œ๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•œ ์ „์ฒด ์ด๋ ฅ ์ˆœํšŒ๋ฅผ ์ œ๊ฑฐํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ๋Œ€์‹œ๋ณด๋“œ SSE๋Š” ์ข…๋ฃŒ ๋…ธ๋“œ๋ฅผ ์ œ์™ธํ•œ ํ›„ snapshot์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ๊ณผ๊ฑฐ ๋…ธ๋“œ๋ฅผ ๋ณต์‚ฌยท์ •๋ ฌํ•œ ๋’ค ๋ฒ„๋ฆฌ๋Š” ๋น„์šฉ์„ ์ œ๊ฑฐํ–ˆ์Šต๋‹ˆ๋‹ค. ์ „์ฒด inventory์™€ ์ €์žฅ ๊ฒฐ๊ณผ์—๋Š” ์ด๋ ฅ์„ ๋ณด์กดํ•ฉ๋‹ˆ๋‹ค.
  • Agentยท์‹คํ—˜ยท์ตœ๊ทผ ์ด๋ฒคํŠธ ๋ชฉ๋ก REST API๋Š” ํ•„์š”ํ•œ ๋ชฉ๋ก๋งŒ ๋ณต์‚ฌํ•ฉ๋‹ˆ๋‹ค. Agent ๋“ฑ๋ก๋„ Agent ์ •๋ณด๋งŒ ๊ตฌ์„ฑํ•˜๊ณ  Peer ์ „์ฒด snapshot์„ ๋งŒ๋“ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์™„๋ฃŒ๋˜์–ด ๋ณ€ํ•˜์ง€ ์•Š๋Š” ์‹คํ—˜์˜ Prometheus ์ „ํŒŒ ์ง€์—ฐ ํžˆ์Šคํ† ๊ทธ๋žจ์„ ์žฌ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด ์ด๋ฒคํŠธ, ๋Šฆ๊ฒŒ ๋„์ฐฉํ•œ ์ฆ๊ฑฐ, ์ˆ˜์‹  ๊ธฐ๊ฐ„ ๋งŒ๋ฃŒ๋Š” ๊ธฐ์กด ๊ทœ์น™๋Œ€๋กœ ์š”์•ฝ๊ณผ ํžˆ์Šคํ† ๊ทธ๋žจ์„ ๊ฐฑ์‹ ํ•ฉ๋‹ˆ๋‹ค. ์ง€ํ‘œ ์ •์˜์™€ ์ €์žฅ ๊ฒฐ๊ณผ ๊ณ„์‚ฐ์€ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.
  • Agent์™€ Controller์˜ ์ด๋ฒคํŠธ ํฌ๊ธฐ ๊ฒ€์ฆ์€ ์ด๋ฒคํŠธ๋ณ„ ์ธ์ฝ”๋”ฉ ๊ฒฐ๊ณผ์˜ ๊ธธ์ด๋ฅผ ๊ฒ€์‚ฌํ•˜๊ณ  ๋ฒ„๋ฆฝ๋‹ˆ๋‹ค. ๊ฒ€์ฆ ๋ชฉ์ ์œผ๋กœ ์ „์ฒด ์ „์†ก ๋ฐฐ์น˜๋ฅผ ๋‹ค์‹œ ํ• ๋‹นํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. JSON escaping, ์ •ํ™•ํ•œ 10MiB ๊ฒฝ๊ณ„, ์ž˜๋ชป๋œ ํ›„์† ์ด๋ฒคํŠธ์˜ ์ผ๊ด„ ๊ฑฐ๋ถ€๋ฅผ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.

์žฌํ˜„ ๋ฒค์น˜๋งˆํฌ

Intel Xeon E5-2620 v3, GOMAXPROCS=2์—์„œ ๋™์ผํ•œ ์ž…๋ ฅ์œผ๋กœ ์ธก์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ์กฐํšŒ ํ…Œ์ŠคํŠธ๋Š” ์ข…๋ฃŒ Peer 65,000๊ฐœ์™€ ํ™œ์„ฑ Peer 100๊ฐœ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฒคํŠธ ๊ฒ€์ฆ ํ…Œ์ŠคํŠธ๋Š” 4KiB ๋ฌธ์ž์—ด์„ ๊ฐ€์ง„ ์ด๋ฒคํŠธ 250๊ฐœ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. MB์™€ KB๋Š” ๊ฐ๊ฐ 1,000,000๋ฐ”์ดํŠธ์™€ 1,000๋ฐ”์ดํŠธ์ž…๋‹ˆ๋‹ค.

๊ฒฝ๋กœ ๋ณ€๊ฒฝ ์ „ ์‹œ๊ฐ„/ํšŒ ๋ณ€๊ฒฝ ํ›„ ์‹œ๊ฐ„/ํšŒ ๋ณ€๊ฒฝ ์ „ ํ• ๋‹น/ํšŒ ๋ณ€๊ฒฝ ํ›„ ํ• ๋‹น/ํšŒ
Bootstrap ์ฃผ์†Œ ์กฐํšŒ 196.56ms 0.111ms 149.22MB 28.86KB
๋Œ€์‹œ๋ณด๋“œ frame ์ƒ์„ฑ 242.60ms 1.132ms 171.83MB 320.91KB
์ด๋ฒคํŠธ ํฌ๊ธฐ ๊ฒ€์ฆ 4.33ms 1.70ms 7.05MB 12.26KB

์ข…๋ฃŒ ์ด๋ ฅ์ด ์—†๋Š” ๊ฒฝ์šฐ์™€ 65,000๊ฐœ์ธ ๊ฒฝ์šฐ ๋ชจ๋‘ ๋ณ€๊ฒฝ ํ›„ ํ™œ์„ฑ ๋…ธ๋“œ ์กฐํšŒ์˜ ํ• ๋‹น๋Ÿ‰์€ ๋น„์Šทํ–ˆ์Šต๋‹ˆ๋‹ค. ์‹ค์ œ ์šด์˜ CPU๋Š” ํ™œ์„ฑ Peer ์ˆ˜, ํ† ํด๋กœ์ง€, ์ด๋ฒคํŠธ ๋ฐœ์ƒ๋ฅ , Docker ๋ถ€ํ•˜์—๋„ ์˜ํ–ฅ์„ ๋ฐ›์Šต๋‹ˆ๋‹ค. ์œ„ ์ˆ˜์น˜๋Š” ๋กœ์ปฌ ๊ฒฝ๋กœ๋ณ„ ๋ฒค์น˜๋งˆํฌ์ด๋ฉฐ ์šด์˜ ๋ฐฐํฌ ํ›„ ์ „์ฒด ์‹คํ—˜์˜ CPUยท์ง„์ž…๋ฅ ์„ ๋‹ค์‹œ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

GOMAXPROCS=2 go test ./internal/controller ./internal/model \
  -run '^$' \
  -bench 'Benchmark(BootstrapChurnHistory|DashboardChurnHistory|ValidateTelemetryBatch)$' \
  -benchtime=300ms -benchmem

์ˆ˜์ • ์ ์šฉ์—๋Š” Controller์™€ Agent ์ด๋ฏธ์ง€ ์žฌ๋นŒ๋“œยท์žฌ๋ฐฐํฌ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์‹คํ—˜ ์ด๋ ฅ ์‚ญ์ œ๋ฅผ ์ „์ œ๋กœ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฐฐํฌ ํ›„์—๋Š” ๊ฐ™์€ ์‹œ๋‚˜๋ฆฌ์˜คยท๋™์ผ ํ™œ์„ฑ Peer ๊ทœ๋ชจ์—์„œ ๋‹ค์Œ Prometheus ์ง€ํ‘œ์™€ Controller์˜ churn join schedule delayed ๋กœ๊ทธ๋ฅผ ํ•จ๊ป˜ ๋น„๊ตํ•˜์‹ญ์‹œ์˜ค.

rate(process_cpu_seconds_total{job="kpl-controller"}[5m])
rate(go_memstats_alloc_bytes_total{job="kpl-controller"}[5m])
sum by (state) (kpl_nodes)
kpl_local_telemetry_queue_events

SSE ์ „์†ก๋Ÿ‰ ๊ทผ๊ฑฐ

๊ธฐ์กด ๋Œ€์šฉ๋Ÿ‰ trace ํ•ฉ์„ฑ ํšŒ๊ท€ ํ…Œ์ŠคํŠธ๋Š” 20์ดˆ๊ฐ„ 21ํšŒ ๊ฐฑ์‹ ์—์„œ ๊ฒฝ๋Ÿ‰ Dashboard ์ŠคํŠธ๋ฆผ์˜ JSON ์ „์†ก๋Ÿ‰์„ 85,767,024๋ฐ”์ดํŠธ์—์„œ 170,144๋ฐ”์ดํŠธ๋กœ ์ค„์˜€์Šต๋‹ˆ๋‹ค. ์ด๋Š” ํšŒ๊ท€ ํ…Œ์ŠคํŠธ ์ž…๋ ฅ์˜ ์ธก์ •๊ฐ’์ด๋ฉฐ ๋ชจ๋ฐ”์ผ ๋„คํŠธ์›Œํฌ ์‹ค์ธก์ด๋‚˜ ์ž„์˜ ๊ทœ๋ชจ์˜ ์ „์†ก๋Ÿ‰ ๋ณด์žฅ์€ ์•„๋‹™๋‹ˆ๋‹ค. ํ˜„์žฌ ํ˜•์‹์€ Dashboard SSE, ์šด์˜ ํ™•์ธ์€ ์—ฐ๊ฒฐ ์ง„๋‹จ์„ ์ฐธ๊ณ ํ•˜์‹ญ์‹œ์˜ค.

Agent ๋ฉ”๋ชจ๋ฆฌ ๋ณด๊ด€ ํšŒ๊ท€ ๊ฒ€์ฆ

2026-09-28 ์ฝ”๋“œ ๊ฒ€ํ† ์—์„œ Agent ํ”„๋กœ์„ธ์Šค ๊ธฐ๋ก๊ณผ run ์ฐจ๋‹จ ๋งต์ด Controller ํ™•์ธ ์ดํ›„์—๋„ ๊ณผ๊ฑฐ churn ํšŸ์ˆ˜์— ๋น„๋ก€ํ•ด ์ฆ๊ฐ€ํ•˜๋Š” ๊ฒฝ๋กœ๋ฅผ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค. ์ œ๊ฑฐ๊ฐ€ ๋๋‚œ ์‹คํŒจ ํ”„๋กœ์„ธ์Šค๋„ ๋งˆ์ง€๋ง‰ ํ† ํด๋กœ์ง€ยท์ ์ˆ˜ ์ปฌ๋ ‰์…˜์„ ๋ณด๊ด€ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ ์˜ค๋ž˜๋œ ํ™•์ธ ์™„๋ฃŒ ๊ธฐ๋ก๊ณผ ์บ์‹œ ๋ฐ– ์ฐจ๋‹จ ์ •๋ณด๋Š” ๋กœ์ปฌ ๋””์Šคํฌ๋กœ ์ด๋™ํ•˜๊ณ , ์ œ๊ฑฐ๋œ ์ปจํ…Œ์ด๋„ˆ์˜ ํ† ํด๋กœ์ง€๋ฅผ ํ•ด์ œํ•˜๋ฉฐ, ๋ฐ€๋ฆฐ ์ž‘์—…์ด ์ค„๋ฉด ์ปค์ง„ map๋„ ๋‹ค์‹œ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค. ํ™•์ธ ์™„๋ฃŒ๋œ ์Šคํ’€ ์ฐธ์กฐ๋„ ๋น„์›๋‹ˆ๋‹ค. ํ™œ์„ฑ heartbeat๋Š” ์ด๋ ฅ ์ €์žฅ๊ณผ ๋…๋ฆฝ์ ์œผ๋กœ ์œ ์ง€ํ•˜๊ณ  Controller ์žฌ์‹œ์ž‘ ์‹œ ์ œํ•œ๋œ ํŽ˜์ด์ง€๋กœ ์ด๋ ฅ์„ ์žฌ์ „์†กํ•ฉ๋‹ˆ๋‹ค.

ํ•ฉ์„ฑ ํšŒ๊ท€ ํ…Œ์ŠคํŠธ๋Š” ํšŒ์ฐจ๋งˆ๋‹ค ์ข…๋ฃŒ Peer 256๊ฐœ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  Controller ํ™•์ธ ๋ฐ ์ด๋ ฅ ์ •๋ฆฌ๋ฅผ 12ํšŒ ๋ฐ˜๋ณตํ•ฉ๋‹ˆ๋‹ค(์ด 3,072๊ฐœ). ๋งค ํšŒ์ฐจ ์ดํ›„ ๋ฉ”๋ชจ๋ฆฌ ์ข…๋ฃŒ ์ด๋ ฅ์€ 64๊ฐœ๋กœ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค. ๋‹จ์ผ ํŒŒ์ผ ์ด๋ ฅ ์ €์žฅ์†Œ๋ฅผ ๋„์ž…ํ•˜๊ธฐ ์ „ ์ˆ˜ํ–‰ํ•œ ์ด ํ…Œ์ŠคํŠธ์—์„œ ํ…Œ์ŠคํŠธ์šฉ GC ํ›„ ๋กœ์ปฌ Go heap์€ ์ฒซ ํšŒ์ฐจ ์•ฝ 1.23MiB, ๋งˆ์ง€๋ง‰ ํšŒ์ฐจ ์•ฝ 1.06MiB์˜€์Šต๋‹ˆ๋‹ค. ํ…Œ์ŠคํŠธ ํ”„๋กœ์„ธ์Šค๋ฅผ ํฌํ•จํ•œ ๊ณผ๊ฑฐ ์ธก์ •๊ฐ’์ด๋ฉฐ ํ˜„์žฌ ์ €์žฅ์†Œ ๊ตฌํ˜„์˜ ์ธก์ •๊ฐ’์ด๋‚˜ ์šด์˜ ๋ฉ”๋ชจ๋ฆฌ ์ƒํ•œ์ด ์•„๋‹™๋‹ˆ๋‹ค. ์ „๋‹ฌ ์‹คํŒจ, ์ปจํ…Œ์ด๋„ˆ ์ œ๊ฑฐ ์‹คํŒจ, ๋กœ์ปฌ ์ €์žฅ ์‹คํŒจ/๋ณต๊ตฌ, ์ •๋ฆฌยท์žฌ์‹œ์ž‘ ๋’ค ์ค‘๋ณต ID ์ฐจ๋‹จ, ์ €์žฅ๋œ ์„ธ๋Œ€ ์ฐจ๋‹จ, ์ƒ์„ฑ/์ •๋ฆฌ ๊ต์ฐจ, Controller ์žฌ์‹œ์ž‘ ์‹œ ์ œํ•œ๋œ ์ด๋ ฅ ์žฌ์ „์†ก๋„ ๊ฒ€์ฆํ•ฉ๋‹ˆ๋‹ค. ์‹ค์ œ Docker ๋ฐฐํฌ์—์„œ ์žฅ์‹œ๊ฐ„ ๋ฉ”๋ชจ๋ฆฌ ์ถ”์„ธ๋Š” ์—…๋ฐ์ดํŠธ ํ›„ ๊ด€์ฐฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

go test ./internal/agent -run '^TestChurnHistoryMemoryIsBoundedAndRetiredIDsRemainFenced$' -count=1 -v
go test -race ./internal/agent ./internal/controller -run 'History|Retire|RunFenceCache|Heartbeat' -count=1

๋””์Šคํฌ ์ ์ฒด ํšŒ๊ท€๋Š” ์„œ๋กœ ๋‹ค๋ฅธ 32 KiB ๋ณธ๋ฌธ 1,024๊ฐœ(์ด 32 MiB)๋ฅผ ์ˆ˜๋ฝํ•œ ๋’ค spool์„ ๋‹ค์‹œ ์—ด์–ด ์ œํ•œ๋œ ์ „์†ก ๊ตฌ๊ฐ„๊ณผ ์ „์ฒด ์ด๋ฒคํŠธ ์ˆœ์„œยท์ „๋‹ฌ์„ ๊ฒ€์ฆํ•ฉ๋‹ˆ๋‹ค. ๋กœ์ปฌ Go 1.27.1์˜ ํ…Œ์ŠคํŠธ ์ „์šฉ GC ํ›„ heap์€ ์‹œ์ž‘ 1.21 MiB, ์ „์ฒด ๋””์Šคํฌ ์ ์ฒด ์ƒํƒœ 1.25 MiB, 31๊ฐœ ์ด๋ฒคํŠธ๋ฅผ ์ ์žฌํ•œ ์žฌ์‹œ์ž‘ ๋ณต๊ตฌ ์ƒํƒœ 2.52 MiB์˜€์Šต๋‹ˆ๋‹ค. ํ•ฉ์„ฑ ํ…Œ์ŠคํŠธ ํ”„๋กœ์„ธ์Šค ์ˆ˜์น˜์ด๋ฉฐ ์šด์˜ ์ปจํ…Œ์ด๋„ˆ RSS๋‚˜ ๋ณด์žฅ๋œ ๋ฉ”๋ชจ๋ฆฌ ์ƒํ•œ์€ ์•„๋‹™๋‹ˆ๋‹ค. ๊ธฐ์กด spool ํ˜•์‹ยท๋ถ€๋ถ„ ์ˆ˜์‹  ํ™•์ธ ๊ธฐ๋ก ์‹คํŒจยท๋ฐ”์ดํŠธ ํ•œ๋„ยท๋””์ฝ”๋” ํฌํ™” ๋ฐ ์ž์‹ ํ”„๋กœ์„ธ์Šค ์—†์ด ๋™์ž‘ํ•˜๋Š” Engine ๋Œ€๊ธฐ 64๊ฐœ ๋™์‹œ ์ทจ์†Œ๋„ ๊ฒ€์ฆํ•ฉ๋‹ˆ๋‹ค.

go test ./internal/agent -run 'TestTelemetryDisk|TestTelemetryRecovery|TestTelemetryPartial|TestTelemetryDecoder|TestTelemetryByte|TestDockerEngine' -count=1 -v

Telemetry ์ฒ˜๋ฆฌ๋Ÿ‰๊ณผ ํŒŒ์ผ ์ƒ์„ฑ ๋ถ€๋‹ด

์ถ”๊ฐ€ ํšŒ๊ท€๋Š” ์ž‘์€ ์ €์žฅ/ํ™•์ธ 256ํšŒ๋ฅผ ๋ฐ˜๋ณตํ•˜๋ฉด์„œ payload์™€ ACK inode๊ฐ€ ๊ต์ฒด๋˜์ง€ ์•Š๊ณ  ์žฌ์‚ฌ์šฉ๋˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. payload/ACK ๋ถ€๋ถ„ ์“ฐ๊ธฐยท๊ธฐ์กด ํ˜•์‹ ๋ณต๊ตฌยท์›๋ณธ JSON ID์™€ ์ˆœ์„œยท๋นˆ ํ™œ์„ฑ ํŒŒ์ผ ์žฌ์‚ฌ์šฉยท๊ตฌ๋ฒ„์ „ ํ˜•์‹ ๋ณดํ˜ธ๋„ ๊ฒ€์ฆํ•ฉ๋‹ˆ๋‹ค. GC ํ›„ Go heap ๊ฒ€์‚ฌ์— ๋‚˜ํƒ€๋‚˜์ง€ ์•Š๋Š” ํŒŒ์ผ์‹œ์Šคํ…œ ์ƒ์„ฑ ๋ถ€๋‹ด์„ ์ค„์ด๊ธฐ ์œ„ํ•œ ๊ฒ€์ฆ์ž…๋‹ˆ๋‹ค.

๋กœ์ปฌ Intel Xeon E5-2620 v3์—์„œ ๊ฐ™์€ 2,000๊ฐœ ์ด๋ฒคํŠธ์™€ ๋ฐ”์ดํŠธ ํ•œ๋„๋ฅผ ๋น„๊ตํ•˜๋ฉด ๋””์ฝ”๋”ฉยท์žฌ์ธ์ฝ”๋”ฉ์€ ์•ฝ 63.3 ms / ํ• ๋‹น 10.24 MB, ์ €์žฅ๋œ JSON ์ง์ ‘ ๋ณต์‚ฌ๋Š” ์•ฝ 7.33 ms / ํ• ๋‹น 0.61 MB์˜€์Šต๋‹ˆ๋‹ค. ์ž‘์—…๋‹น ๋ฒค์น˜๋งˆํฌ ํ• ๋‹น๋Ÿ‰ยท์‹œ๊ฐ„์ด๋ฉฐ ์ž”๋ฅ˜ heap์ด๋‚˜ ์šด์˜ ์ปจํ…Œ์ด๋„ˆ ๋ฉ”๋ชจ๋ฆฌ๋Š” ์•„๋‹™๋‹ˆ๋‹ค. ๋ฐฐํฌ ํ›„ ์žฅ์‹œ๊ฐ„์˜ cgroup slab_reclaimable, anonymous, ํ”„๋กœ์„ธ์Šค RSS, Go live heap์„ ๋‹ค์‹œ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ˜ธ์ŠคํŠธ ์ „์ฒด ์บ์‹œ ์‚ญ์ œ๋‚˜ ์ฃผ๊ธฐ์  ๊ฐ•์ œ GC๋Š” ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

go test ./internal/agent -run 'TestTelemetryLog|TestTelemetryRaw|TestTelemetryFormat' -count=1
go test ./internal/agent -run '^$' -bench '^BenchmarkTelemetryForwardingWindow$' -benchmem
go test ./internal/controller -run 'TestDeferredAgent|TestAmbiguousAgent|TestAdmissionRetry' -count=1

์ข…๋ฃŒ Peer ์ด๋ ฅ๊ณผ ์ปค๋„ ์บ์‹œ

2026-09-29 Prometheus๋ฅผ ์ฝ๊ธฐ ์ „์šฉ์œผ๋กœ ์กฐํšŒํ–ˆ์„ ๋•Œ telemetry ๊ฐœ์„  ์ดํ›„์—๋„ ์ปจํ…Œ์ด๋„ˆ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์ฆ๊ฐ€ํ•˜๋Š” ์ถ”์„ธ๊ฐ€ ๋‚จ์•„ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ํ•œ Agent์—์„œ ๋ˆ„์  ์ข…๋ฃŒ Peer๊ฐ€ 401๊ฐœ์—์„œ 3,133๊ฐœ๋กœ ๋Š˜์–ด๋‚  ๋•Œ cgroup slab_reclaimable์€ ์•ฝ 1.1MiB์—์„œ 7.5MiB๋กœ ๋Š˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ตฌ๊ฐ„ OS ์Šค๋ ˆ๋“œ๋Š” 111๊ฐœ๋กœ ์ผ์ •ํ–ˆ๊ณ  Go live heap์€ ์•ฝ 3.2โ€“7.8MiB ์‚ฌ์ด์—์„œ ์˜ค๋ฅด๋‚ด๋ ธ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ณด๋‹ค ์•ž์„  ์ตœ์ดˆ ๋ถ€ํ•˜ ๊ตฌ๊ฐ„์—๋Š” ๋Ÿฐํƒ€์ž„ ์Šค๋ ˆ๋“œยท์Šคํƒ ์ฆ๊ฐ€๋„ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ํŒŒ์ผ์‹œ์Šคํ…œ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์ฆ๊ฐ€ ๊ฒฝ๋กœ๋ฅผ ํ™•์ธํ•œ ๊ฒƒ์ด๋ฉฐ ์ปจํ…Œ์ด๋„ˆ ๋ฉ”๋ชจ๋ฆฌ ์ฆ๊ฐ€ ์ „์ฒด์˜ ์›์ธ์ด ํ•˜๋‚˜๋ผ๊ณ  ์ฆ๋ช…ํ•œ ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.

์ด์ „ ์ด๋ ฅ ํ˜•์‹์€ ์ข…๋ฃŒ Peer๋งˆ๋‹ค JSON ํŒŒ์ผ ํ•˜๋‚˜๋ฅผ ์˜๊ตฌ ๋ณด๊ด€ํ•˜์—ฌ inode/dentry๊ฐ€ ์Œ“์˜€๊ณ  ์ƒˆ ID ์กฐํšŒ์—๋„ ๊ฒฝ๋กœ ํƒ์ƒ‰์ด ํ•„์š”ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ ์ข…๋ฃŒ ๊ธฐ๋ก์„ ์ธ๋ฑ์Šค๊ฐ€ ์žˆ๋Š” bbolt ํŒŒ์ผ ํ•˜๋‚˜์— ๋ณด๊ด€ํ•ฉ๋‹ˆ๋‹ค. ์ตœ๊ทผ ๋ฉ”๋ชจ๋ฆฌ ์ด๋ ฅ, ์‹คํ–‰๋ณ„ ์ธ๋ฑ์Šค, ์„ธ๋Œ€ ์ฐจ๋‹จ, ์ „๋‹ฌ ํ™•์ธ๊ณผ ์ค‘๋ณต ID ๋ฐฉ์ง€๋Š” ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ์กด JSON ์ด๋ ฅ์€ ์‹œ์ž‘ ์‹œ ์ปจํ…Œ์ด๋„ˆ ์ •๋ฆฌ ์ „์— ์ด์ „ํ•˜๋ฉฐ ์„ค์น˜๋œ ๋‚ด์šฉ๊ณผ ๋Œ€์กฐํ•œ ๋’ค ์›๋ณธ ํŒŒ์ผ์„ ์ œํ•œ๋œ ์–‘์”ฉ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์ด์ „ ๋ฐ ํ˜•์‹ ํ˜ธํ™˜์„ฑ์„ ์ฐธ๊ณ ํ•˜์‹ญ์‹œ์˜ค.

ํšŒ๊ท€ ํ…Œ์ŠคํŠธ๋Š” ์‹คํ–‰๋งˆ๋‹ค ์ข…๋ฃŒ Peer 512๊ฐœ์”ฉ 12ํšŒ, ์ด 6,144๊ฐœ๋ฅผ ์ €์žฅํ•ด๋„ Peer ์ด๋ ฅ ํŒŒ์ผ์ด ํ•˜๋‚˜์ด๋ฉฐ ์‹คํ–‰๋ณ„ ์ธ๋ฑ์Šค๋งŒ ๋ณ„๋„๋กœ ์ƒ๊ธฐ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์ด์ „ยท์žฌ์‹œ์ž‘ ํ…Œ์ŠคํŠธ๋Š” ๊ธฐ์กด ๊ธฐ๋ก 300๊ฐœ๋ฅผ ์„ธ ํŽ˜์ด์ง€๋กœ ๋ชจ๋‘ ๋ณต๊ตฌํ•˜๊ณ  ์†์ƒ๋˜๊ฑฐ๋‚˜ ๋Œ€์กฐ๊ฐ€ ๋ถˆ์ผ์น˜ํ•˜๋Š” ์›๋ณธ์„ ๋ณด์กดํ•˜๋Š”์ง€ ๊ฒ€์‚ฌํ•ฉ๋‹ˆ๋‹ค. batch ์ „์ฒด ๋กค๋ฐฑ, ๋ณต์‚ฌํ•œ ์žฌ์ „์†ก ํ‚ค, ๋ฐ”์ดํŠธ ์ œํ•œ, ์ทจ์†Œ๋„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์ €์žฅ ๋™์ž‘ ๊ฒ€์ฆ์ด๋ฉฐ ๋ฐฐํฌ๋œ ๋ฉ”๋ชจ๋ฆฌ ๊ฐ์†Œ๋Ÿ‰์„ ์ธก์ •ํ•œ ๊ฒฐ๊ณผ๋Š” ์•„๋‹™๋‹ˆ๋‹ค. Agent ์ด๋ฏธ์ง€๋ฅผ ๋‹ค์‹œ ๋นŒ๋“œยท๋ฐฐํฌํ•œ ๋’ค ๊ฐ™์€ ๋ถ€ํ•˜์˜ ํœด์ง€ ๊ตฌ๊ฐ„์—์„œ slab_reclaimable, live heap, ์Šค๋ ˆ๋“œ ์ˆ˜์™€ Agent-only working set์„ ๋น„๊ตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ดˆ๊ธฐ 20MiB๋กœ ๋ณต๊ท€ํ•œ๋‹ค๊ณ  ๋ณด์žฅํ•˜์ง€ ์•Š์œผ๋ฉฐ DB ํŽ˜์ด์ง€์™€ ์žฌ์‚ฌ์šฉ ๋Ÿฐํƒ€์ž„ ์ž์›์€ OSยท๋Ÿฐํƒ€์ž„ ์ •์ฑ…์— ๋”ฐ๋ผ ํšŒ์ˆ˜ ๋˜๋Š” ์žฌ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

go test ./internal/agent -run '^TestHistoryStore' -count=1 -v
GORACE=atexit_sleep_ms=0 go test -race ./internal/agent -run 'Test(History|RunFence|Retir|Registration|Heartbeat|AgentHistory|BlockedConfig|ConfigWrite)' -count=1