Prysm Scoring Example KO - k-p2p-lab/kpl-v3 GitHub Wiki

์„ธ ์ง€์—ฐ ๊ทธ๋ฃน์˜ Churn๊ณผ Prysm beacon_block ์Šค์ฝ”์–ด๋ง

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

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

examples/swarm-churn-prysm-block.yaml์€ ์ œ์‹œํ•œ boot 10๊ฐœ, warm-up 5๋ถ„, 4KiB ์‹คํ—˜์„ ํ™•์žฅํ•˜์—ฌ ์„ธ ๊ทธ๋ฃน์—์„œ ๋™์‹œ์— churn์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  worker๊ฐ€ kpl/prysm/beacon_block ํ† ํ”ฝ์„ ๊ณต์œ ํ•˜๋ฉฐ ๋ฐœํ–‰ ๊ทธ๋ฃน์„ ๋Œ์•„๊ฐ€๋ฉด์„œ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ฃน๊ณผ ์‹คํ–‰ ์ˆœ์„œ

๊ทธ๋ฃน/profile ์†ก์‹  P2P ์ง€์—ฐ Jitter ํŒจํ‚ท ์†์‹ค ์ด join ์˜ˆ์‚ฐ ํ‰๊ท  join ๊ฐ„๊ฒฉ
delay-low 25ms 2ms 0.5% 3,334 0.3s
delay-medium 100ms 2ms 0.5% 3,333 0.3s
delay-high 250ms 2ms 0.5% 3,333 0.3s

Worker profile ์‚ฌ์ด์—์„œ๋Š” ์ง€์—ฐ๋งŒ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. Balanced ๋ฐฐ์น˜๋กœ ๊ฐ ๊ทธ๋ฃน์„ ๊ฐ€์šฉ Agent์— ๋ถ„์‚ฐํ•˜๋ฏ€๋กœ ๊ทธ๋ฃน์ด ํŠน์ • ๋ฌผ๋ฆฌ ์„œ๋ฒ„๋ฅผ ๋œปํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. scope: p2p๋Š” DHT๋ฅผ ํฌํ•จํ•œ ์†ก์‹  P2P TCP์— ์ ์šฉํ•˜๊ณ  Controller HTTPยทtelemetry๋Š” ์ œ์™ธํ•ฉ๋‹ˆ๋‹ค. ํ‘œ์˜ ์ง€์—ฐ์€ ์†ก์‹  ์ธก ์„ค์ •๊ฐ’์œผ๋กœ RTT๊ฐ€ ์•„๋‹ˆ๋ฉฐ, ํŒจํ‚ท ์†์‹ค๋ฅ ๋„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฏธ๋„๋‹ฌ๋ฅ ๊ณผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

๊ณตํ†ต ์ˆ˜๋ช…์€ Pareto xm: 120s, alpha: 2.5๋กœ ํ‰๊ท  200์ดˆ์ž…๋‹ˆ๋‹ค. ์ˆœ์ฐจ producer ์„ธ ๊ฐœ๊ฐ€ ํ‰๊ท  0.3s ์ง€์ˆ˜๋ถ„ํฌ ๊ฐ„๊ฒฉ์„ ๋ˆ„์ ํ•œ ์˜ˆ์•ฝ ์‹œ๊ฐ์— ๋”ฐ๋ผ ์‹คํ–‰๋˜์–ด ์ด๋ก ์ƒ ์ „์ฒด ์†๋„๋Š” ์ดˆ๋‹น ์•ฝ 10๊ฐœ์ž…๋‹ˆ๋‹ค. ์š”์ฒญ ์ฒ˜๋ฆฌ ์‹œ๊ฐ„์€ ๊ฐ„๊ฒฉ ์•ˆ์— ํฌํ•จ๋˜๋ฉฐ, ์šฉ๋Ÿ‰ ๋Œ€๊ธฐ๋กœ ๋Šฆ์–ด์ง„ ์ž‘์—…์€ ๋ˆ„๋ฝ ์—†์ด ์ˆœ์„œ๋Œ€๋กœ ๋”ฐ๋ผ์žก์Šต๋‹ˆ๋‹ค. ์ด๋ก ์  ์ •์ƒ ์ƒํƒœ๋Š” ๊ทธ๋ฃน๋‹น ์•ฝ 667๊ฐœ, ์ „์ฒด worker ์•ฝ 2,000๊ฐœ + boot 10๊ฐœ์ž…๋‹ˆ๋‹ค. ๋™์‹œ ์‹คํ–‰ ์ƒํ•œ์ด๋‚˜ ์‹ค์ธก ์šฉ๋Ÿ‰ ๋ณด์žฅ์ด ์•„๋‹™๋‹ˆ๋‹ค. ์ˆ˜๋ช…์€ ์ปจํ…Œ์ด๋„ˆ ์ƒ์„ฑ ์„ฑ๊ณต๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜์—ฌ startup ์‹œ๊ฐ„๋„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.

์—ฌ์œ  ์Šฌ๋กฏ 40๊ฐœ๋กœ๋Š” ์ด ์†๋„๋ฅผ ์œ ์ง€ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ธฐ๋Œ€ ๋ชจ์ง‘๋‹จ๋ณด๋‹ค ์—ฌ์œ  ์žˆ๊ฒŒ ์šฉ๋Ÿ‰์„ ์ค€๋น„ํ•˜๊ณ  ํ˜ธ์ŠคํŠธ ๋ถ€ํ•˜๋ฅผ ํ™•์ธํ•˜๊ฑฐ๋‚˜, ๊ณตํ†ต &churn ๊ฐ„๊ฒฉ์„ ์กฐ์ •ํ•˜์‹ญ์‹œ์˜ค. ํ‰๊ท  10s์ด๋ฉด worker ๊ธฐ๋Œ€๊ฐ’ 60๊ฐœ + boot 10๊ฐœ, 30s์ด๋ฉด worker 20๊ฐœ + boot 10๊ฐœ์ž…๋‹ˆ๋‹ค. ๋‚˜๋จธ์ง€ job๋„ ์ด ๊ฐ’์„ ์ƒ์†ํ•ฉ๋‹ˆ๋‹ค. ์šฉ๋Ÿ‰ ๋Œ€๊ธฐ๋Š” ์‹ค์ œ ๋„์ฐฉ๋ฅ ๊ณผ ๊ทธ๋ฃน ๋น„์œจ์„ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 10,000ํšŒ๋Š” ์„ธ ๊ทธ๋ฃน์„ ํ•ฉํ•œ ์˜ˆ์‚ฐ์ž…๋‹ˆ๋‹ค.

  1. PubSub๋ฅผ ๋ˆ ์•ˆ์ •์ ์ธ boot 10๊ฐœ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  readiness๋ฅผ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค.
  2. churn-low, churn-medium, churn-high๋ฅผ await: false๋กœ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ job ๋‚ด๋ถ€๋Š” parallel: false๋กœ ๊ฐ„๊ฒฉ์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ์„ธ ์‹คํ–‰์€ ๊ฒน์น˜์ง€๋งŒ ์ฒซ join์„ ๊ฐ™์€ ์‹œ๊ฐ์— ๋งž์ถ”๋Š” barrier๋Š” ์•„๋‹™๋‹ˆ๋‹ค.
  3. ๊ณตํ†ต topic discovery์™€ GossipSub overlay์— ์ฐธ์—ฌํ•˜๋ฉฐ 5๋ถ„๊ฐ„ warm-upํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฏธ ์ข…๋ฃŒ๋œ ๋…ธ๋“œ๋„ ํฌํ•จํ•˜๋Š” ๋ˆ„์  churn ๊ทธ๋ฃน์—๋Š” readiness barrier๋ฅผ ์ ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  4. ์ €์ง€์—ฐ โ†’ ์ค‘์ง€์—ฐ โ†’ ๊ณ ์ง€์—ฐ์„ 10ํšŒ ์ˆœํ™˜ํ•˜์—ฌ ์ด 30 round๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋งค round๋Š” ํ•ด๋‹น ๊ทธ๋ฃน์˜ ์กฐ๊ฑด์— ๋งž๋Š” publisher๋ฅผ ์ค‘๋ณต ์—†์ด ์ตœ๋Œ€ 10๊ฐœ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฃน๋‹น ์ตœ๋Œ€ 100ํšŒ์ด๋ฉฐ ์‹ค์ œ ์„ฑ๊ณต์€ churn์œผ๋กœ ์ค„์–ด๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. group์€ ๋ฐœํ–‰์ž๋งŒ ์ œํ•œํ•˜๊ณ  ๋‹ค๋ฅธ ๊ทธ๋ฃน์˜ ๊ตฌ๋…์ž๋ฅผ ์ œ์™ธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  5. ์›๋ณธ์ฒ˜๋Ÿผ 4,096๋ฐ”์ดํŠธ envelope, ์ˆ˜์‹  ๊ธฐํ•œ 1s, round ๋‚ด๋ถ€ ํ‰๊ท  1s ์ง€์ˆ˜๋ถ„ํฌ ๊ฐ„๊ฒฉ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. Round ์‚ฌ์ด์—๋Š” ์ด 29๋ฒˆ์˜ ๋ช…์‹œ์  10s ๋Œ€๊ธฐ๋ฅผ ๋‘์–ด ํ›„๋ณด๊ฐ€ ์—†์–ด๋„ ์‹œ๊ฐ„์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค.
  6. ๋งˆ์ง€๋ง‰ 30์ดˆ ๋™์•ˆ ๋” ์ˆ˜์ง‘ํ•œ ๋’ค stop-all๋กœ ๋‚จ์€ job์„ ์ทจ์†Œํ•˜๊ณ  ์ด run์˜ Peer๋ฅผ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค. Churn์€ ์œ ํ•œํ•œ join ์˜ˆ์‚ฐ์ด ๋‚จ์•„ ์žˆ๋Š” ๋™์•ˆ ๊ณ„์†๋ฉ๋‹ˆ๋‹ค.

๋งค๋ฒˆ 10๊ฐœ๋ฅผ ์„ ํƒํ•  ๋•Œ ๊ธฐ๋ณธ ์‹œ๊ฐ„์€ 300 + 30ร—9 + 29ร—10 + 30 = 890์ดˆ, ์•ฝ 14๋ถ„ 50์ดˆ์ด๋ฉฐ bootstrapยท์š”์ฒญยท์ •๋ฆฌ ์‹œ๊ฐ„์ด ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค. ์š”์ฒญ์ด ๋А๋ฆฌ๋ฉด ์‹คํ–‰์ด ๊ธธ์–ด์ ธ join ์˜ˆ์‚ฐ์ด ๋จผ์ € ์†Œ์ง„๋  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์›๋ณธ์˜ ์ „์ฒด ๋ชจ์ง‘๋‹จ ๋ฌด์ž‘์œ„ ๋ฐœํ–‰์ž ์„ ํƒ์„ ๊ทธ๋ฃน๋ณ„ ๋™์ผ round ์˜ˆ์‚ฐ์œผ๋กœ ๋ฐ”๊ฟจ์Šต๋‹ˆ๋‹ค. ์Šค์ผ€์ค„๋งยท์ธก์ • ์ƒ์„ธ๋ฅผ ์ฐธ๊ณ ํ•˜์‹ญ์‹œ์˜ค.

Prysm ์Šค์ฝ”์–ด ๊ธฐ์ค€

๊ธฐ์ค€์€ Prysm v7.1.8, commit 51b5a75ebbadf05af22bd2601b5baf7a9e99b66d์˜ peerScoringParams, defaultBlockTopicParams, ์‹œ๊ฐ„ ๊ณ„์‚ฐ ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. Mainnet ์ƒ์ˆ˜์ธ slot 12์ดˆ, epoch 32 slot๋กœ ๊ฐ’์„ ๊ณ„์‚ฐํ–ˆ์Šต๋‹ˆ๋‹ค. YAML์— ์ˆ˜์น˜๋งŒ ๊ธฐ๋กํ•˜๋ฉฐ Prysm ์˜์กด์„ฑ์ด๋‚˜ ์„œ๋“œํŒŒํ‹ฐ ์†Œ์Šค ์ˆ˜์ •์€ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํ•ญ๋ชฉ ์„ค์ •
ํ† ํ”ฝ ๊ฐ€์ค‘์น˜ 0.8
P1 mesh ์ฒด๋ฅ˜ ์‹œ๊ฐ„ ๊ฐ€์ค‘์น˜ 10/300, quantum 12s, cap 300
P2 ์ตœ์ดˆ ์ „๋‹ฌ ๊ฐ€์ค‘์น˜ 1, cap 23, decay 0.9928302477768374
P3 / P3b mesh ๋ฒŒ์  ๊ฐ€์ค‘์น˜ ๋ชจ๋‘ 0. Prysm์˜ meshDeliveryIsScored = false ๋ฐ˜์˜
P4 ์ž˜๋ชป๋œ ๋ฉ”์‹œ์ง€ ์ „๋‹ฌ ๊ฐ€์ค‘์น˜ -140.4475, decay 0.9971259067705325
P5 ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ณ ์ • 0, ๊ฐ€์ค‘์น˜ 1
P6 IP ์ง‘์ค‘ ๊ฐ€์ค‘์น˜ -35.11, threshold 10, whitelist ์—†์Œ
P7 ํ–‰๋™ ๋ฒŒ์  ๊ฐ€์ค‘์น˜ -15.92, threshold 6, decay 0.9857119009006162
์ „์—ญ ํ† ํ”ฝ cap 32.72, decay ์ฃผ๊ธฐ 12s, floor 0.01, retain 10h40m
Threshold Gossip -4000, publish -8000, graylist -16000, accept PX 100, opportunistic graft 5

E epoch์— ๋Œ€ํ•œ slot๋‹น decay๋Š” 0.01^(1/(32ร—E))์ž…๋‹ˆ๋‹ค. P2๋Š” 20 epoch, P4๋Š” 50, P7์€ 10์ž…๋‹ˆ๋‹ค. ๋น„ํ™œ์„ฑ mesh ํ•ญ๋ชฉ๋„ 5 epoch decay, threshold 16, cap 160, activation 25m36s, window 2s๋กœ ๊ธฐ๋กํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ธฐ์ค€ ์‹คํ—˜์—์„œ๋Š” ๋‘ mesh ๊ฐ€์ค‘์น˜๋ฅผ ๋ชจ๋‘ 0์œผ๋กœ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ์ ์ˆ˜ inspection์€ 1s์ด๋ฉฐ decay์˜ 12s์™€ ๋ณ„๊ฐœ์ž…๋‹ˆ๋‹ค.

์ด ์‹คํ—˜์€ Prysm ์Šค์ฝ”์–ด ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ ์šฉํ•œ KPL ํ•ฉ์„ฑ ํŠธ๋ž˜ํ”ฝ์ž…๋‹ˆ๋‹ค. DiscoveryยทKademliaยทenvelope๋Š” KPL ๊ตฌํ˜„์ด๋ฉฐ mesh degree๋„ ์š”์ฒญํ•œ 6/5/12, dScore: 3์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. Ethereum SSZ/snappy ๋ธ”๋ก, fork digest, ํ•ฉ์˜ ๊ฒ€์ฆ์ด๋‚˜ mainnet ๋ธ”๋ก ๋ฐœํ–‰ ์ผ์ •์„ ์žฌํ˜„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜ ํŠธ๋žœ์žญ์…˜ gossip์€ ์‹คํ–‰ ๊ณ„์ธต ๋„คํŠธ์›Œํฌ์˜ ์—ญํ• ์ด๋ฉฐ ์„ ํƒํ•œ ๊ธฐ์ค€์€ ํ•ฉ์˜ ๊ณ„์ธต์˜ beacon_block์ž…๋‹ˆ๋‹ค.

์ง€์—ฐ์ด ๋‚ฎ์œผ๋ฉด P2 ์ตœ์ดˆ ์ „๋‹ฌ ๋ณด์ƒ์„ ๋” ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฐ€์„ค์„ ๊ด€์ธกํ•ฉ๋‹ˆ๋‹ค. P1์€ mesh ์ฒด๋ฅ˜ ์‹œ๊ฐ„์—๋„ ์˜ํ–ฅ์„ ๋ฐ›์œผ๋ฏ€๋กœ ์ง€์—ฐ์ˆœ ์ ์ˆ˜ ์ˆœ์œ„๋ฅผ ๋ณด์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. P3/P3b๊ฐ€ ๊บผ์ ธ ์žˆ์–ด ๋А๋ฆฐ ์ „๋‹ฌ๋งŒ์œผ๋กœ ์ „๋‹ฌ ๋ถ€์กฑ ๋ฒŒ์ ์ด ์ƒ๊ธฐ์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. ์ •์ƒ ํ•ฉ์„ฑ ๋ฉ”์‹œ์ง€๋Š” Ethereum ๊ณ ์œ ์˜ P4 ๊ฒ€์ฆ ์‹คํŒจ๋„ ๋งŒ๋“ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋™์ผํ•œ ์™ธ๋ถ€ IP๋กœ ๋ณด์ด๋Š” Peer๋‚˜ ํ”„๋กœํ† ์ฝœ ํ–‰๋™ ๋ฒŒ์ ์€ ์ง€์—ฐ๊ณผ ๋ณ„๊ฐœ๋กœ ์ ์ˆ˜๋ฅผ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์งง์€ churn ์ˆ˜๋ช…์—์„œ๋Š” ํ•œ ์‹œ๊ฐ„์งœ๋ฆฌ P1 cap๊นŒ์ง€ ๋„๋‹ฌํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋“œ๋ญ…๋‹ˆ๋‹ค. retainScore๋Š” ์—ฐ๊ฒฐ ํ•ด์ œ Peer์— ๋Œ€ํ•œ router ์ •์ฑ…์ด๋ฉฐ ์ ์ˆ˜ ์ด๋ ฅ ์ €์žฅ์ด๋‚˜ ์ƒˆ๋กœ์šด Peer ID๋กœ์˜ ์Šน๊ณ„๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

์‹คํ–‰๊ณผ ์ˆ˜์ง‘

Swarm ๋ฐฐํฌ๋ฅผ ๋งˆ์นœ ๋’ค ์•„๋ž˜ ๋ช…๋ น์œผ๋กœ ๊ฒ€์ฆํ•˜๊ณ , ์ถœ๋ ฅํ•œ YAML์„ Dashboard์— ๋ถ™์—ฌ ๋„ฃ์–ด ์„ค์ •๋œ ๋Œ€์‹œ๋ณด๋“œ ๊ณ„์ •์œผ๋กœ ๋กœ๊ทธ์ธํ•œ ๋’ค ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

go run ./cmd/kpl validate --scenario examples/swarm-churn-prysm-block.yaml
sh scripts/swarm.sh scenario examples/swarm-churn-prysm-block.yaml

ํ† ํด๋กœ์ง€์—์„œ ๋…ธ๋“œ๋ฅผ ์„ ํƒํ•˜๋ฉด ๊ด€์ธกํ•œ ์ ์ˆ˜ ๊ฐœ์ˆ˜์™€ ํ‰๊ท ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. peerScores[remotePeerId]๋Š” ๊ด€์ธก ๋…ธ๋“œ๊ฐ€ ์ƒ๋Œ€ Peer์— ๋ถ€์—ฌํ•œ ์ ์ˆ˜์ด๋ฉฐ ๊ด€์ธก ๋…ธ๋“œ ์ž์‹ ์˜ ํ‰ํŒ์ด ์•„๋‹™๋‹ˆ๋‹ค. ํ‰๊ฐ€์ž ๊ทธ๋ฃน ร— ํ‰๊ฐ€ ๋Œ€์ƒ ๊ทธ๋ฃน์˜ ์ ์ˆ˜์™€ mesh ํฌํ•จ ์—ฌ๋ถ€, ๋…ธ๋“œ ๋‚˜์ด, ready ๋ชจ์ง‘๋‹จ์„ ํ•จ๊ป˜ ๋น„๊ตํ•ฉ๋‹ˆ๋‹ค.

Controller๋Š” ๊ทธ๋ฃน๋ณ„ ์ ์ˆ˜ยทํ† ํด๋กœ์ง€ ์š”์•ฝ์„ ์•ฝ 5์ดˆ๋งˆ๋‹ค observations.jsonl์— ์ž๋™ ์ €์žฅํ•˜๋ฉฐ ๊ฒฐ๊ณผ ZIP๊ณผ Saved results โ†’ Images์—์„œ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ํ‰๊ฐ€์ž ๊ทธ๋ฃน๋ณ„ ์š”์•ฝ์ด๋ฏ€๋กœ ๊ฐœ๋ณ„ ์ ์ˆ˜ ์Œ, ํ‰๊ฐ€ ๋Œ€์ƒ ๊ทธ๋ฃน๋ณ„ ๋‚ด์—ญ, ์ „์ฒด mesh ์ด๋ ฅ์€ ๋‚จ๊ธฐ์ง€ ์•Š์œผ๋ฉฐ Prometheus์—๋„ ์ ์ˆ˜ ์‹œ๊ณ„์—ด์€ ์—†์Šต๋‹ˆ๋‹ค. ํ‰๊ฐ€์ž ๊ทธ๋ฃน ร— ํ‰๊ฐ€ ๋Œ€์ƒ ๊ทธ๋ฃน ๋ถ„์„์—๋Š” ์ €์žฅ์†Œ์—์„œ ๋‹ค์Œ Bash ์ˆ˜์ง‘๊ธฐ๋ฅผ warm-up ์ค‘ ์‹œ์ž‘ํ•˜๊ณ  ๋งˆ์ง€๋ง‰ ์ˆ˜์ง‘ ๊ตฌ๊ฐ„ ๋’ค Ctrl-C๋กœ ์ข…๋ฃŒํ•˜์‹ญ์‹œ์˜ค. Controller URL๊ณผ ์‹ค์ œ run ID๋ฅผ ๊ต์ฒดํ•ฉ๋‹ˆ๋‹ค. curl, jq๊ฐ€ ํ•„์š”ํ•˜๋ฉฐ ๊ณต๊ฐœ ์ฝ๊ธฐ ์ „์šฉ snapshot API๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์š”์ฒญยท์ฒ˜๋ฆฌ ์‹œ๊ฐ„์— ๋”ํ•ด 5์ดˆ๋งˆ๋‹ค ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค.

KPL_CONTROLLER_URL=http://control-node:8080
KPL_RUN_ID=REPLACE_WITH_RUN_ID
set -o pipefail
while curl --fail --silent --show-error --max-time 30 \
    "$KPL_CONTROLLER_URL/api/v1/snapshot" |
  jq -ce --arg run "$KPL_RUN_ID" -f scripts/score-cohorts.jq \
    >> "$KPL_RUN_ID-score-groups.jsonl"
do
  sleep 5
done

score-cohorts.jq๋Š” ๊ฐ™์€ run์—์„œ online Agent์˜ ready Peer์™€ ํ˜„์žฌ transport ์—ฐ๊ฒฐ์ด ์žˆ๋Š” ์ ์ˆ˜ ์Œ๋งŒ ์„ ํƒํ•˜์—ฌ ์—ฐ๊ฒฐ ํ•ด์ œ ํ›„ ๋ณด์กด๋œ ์ ์ˆ˜๋ฅผ ์ œ์™ธํ•ฉ๋‹ˆ๋‹ค. ํ‰๊ฐ€ ๋ฐฉํ–ฅ๋ณ„ ๊ทธ๋ฃน ํ‰๊ท ยท์ตœ์†Œยท์ตœ๋Œ€, ์Œ์ˆ˜ ํ‰๊ฐ€ ์Œ ์ˆ˜, mesh ์Œ ์ˆ˜, starting/ready ๋ชจ์ง‘๋‹จ์„ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค. ์ž๋™ ์š”์•ฝ์€ ์‹ ์„ ํ•˜๊ฒŒ ๋ณด๊ณ ํ•œ ํ‰๊ฐ€์ž์˜ ์ ์ˆ˜ ์ „์ฒด๋ฅผ ์‚ฌ์šฉํ•˜์ง€๋งŒ ์ด ์ˆ˜์ง‘๊ธฐ๋Š” ํ˜„์žฌ transport ์—ฐ๊ฒฐ์ด ์žˆ๋Š” ์Œ๋งŒ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ํ‰๊ท ์ด ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. pairs๋Š” ํ‰๊ฐ€ ์Œ ์ˆ˜์ด๋ฉฐ ๊ณ ์œ  ํ‰๊ฐ€ ๋Œ€์ƒ ๋…ธ๋“œ ์ˆ˜๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ํ–‰์ด ์—†์œผ๋ฉด ํ•ด๋‹น ๊ด€์ธก์ด ์—†๋Š” ๊ฒƒ์ด๋ฉฐ ์ ์ˆ˜ 0์„ ๋œปํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ‰๊ท ์—์„œ๋Š” ํ‰๊ฐ€ ์Œ๋งˆ๋‹ค ๊ฐ™์€ ๊ฐ€์ค‘์น˜๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ƒํƒœ ๋ณด๊ณ ๊ฐ€ ์˜ค๋ž˜๋๊ฑฐ๋‚˜ ๋ฐ˜๋ณต๋  ์ˆ˜ ์žˆ๊ณ , generatedAt์€ API ์ƒ์„ฑ ์‹œ๊ฐ์ด๋ฉฐ ์ •ํ™•ํ•œ score inspection ์‹œ๊ฐ์€ ์•„๋‹™๋‹ˆ๋‹ค. ์ด์ƒ์ด ์žˆ์œผ๋ฉด ๋…ธ๋“œ์˜ lastSeen๊ณผ Agent ์ƒํƒœ๋„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ๊ฐœ๋ณ„ Peer์˜ ์›๋ณธ ๋ฐ์ดํ„ฐ๊ฐ€ ํ•„์š”ํ•˜๋ฉด snapshot๋„ ์ €์žฅํ•˜์‹ญ์‹œ์˜ค.

curl --fail --output "$KPL_RUN_ID-snapshot.json" \
  "$KPL_CONTROLLER_URL/api/v1/snapshot"
jq --arg run "$KPL_RUN_ID" -f scripts/score-cohorts.jq \
  "$KPL_RUN_ID-snapshot.json"

Grafana์˜ KP2PLab Experiment Analysis์—์„œ run ๋‹จ์œ„ ๋„๋‹ฌ๋ฅ ยทcoverageยท์ง€์—ฐยทgraft/prune ํŠธ๋ž˜ํ”ฝ์„ ํ•จ๊ป˜ ๋ด…๋‹ˆ๋‹ค. kpl_nodes, kpl_network_configured_*์—๋Š” ๊ทธ๋ฃน label์ด ์žˆ์ง€๋งŒ ๊ธฐ์กด ๋„๋‹ฌ๋ฅ ยท์ง€์—ฐ ์ง€ํ‘œ์—๋Š” ์—†์Šต๋‹ˆ๋‹ค. Balanced ๋ฐฐ์น˜์ด๋ฏ€๋กœ Agent ํ•„ํ„ฐ๋กœ ๊ทธ๋ฃน์„ ๋Œ€์‹ ํ•  ์ˆ˜๋„ ์—†์Šต๋‹ˆ๋‹ค. 1s ์ˆ˜์‹  ๊ธฐํ•œ์—๋Š” ๋‹ค์ค‘ hopยทTCP ์žฌ์ „์†ก์œผ๋กœ ๋Šฆ๊ฒŒ ๋„์ฐฉํ•œ ๋ฉ”์‹œ์ง€๊ฐ€ ๋น ์งˆ ์ˆ˜ ์žˆ๊ณ  ์ด๊ฒƒ์ด invalid-message ๋ฒŒ์ ์„ ๋œปํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. Unknown, pending, telemetry drop๋„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์ „์ฒด ์ˆ˜์ง‘ ์ด๋ฒคํŠธ์™€ ์„ธ์…˜ ๊ธฐ๊ฐ„ ์ง€ํ‘œ๋ฅผ ์œ„ํ•ด ๊ฒฐ๊ณผ ZIP๋„ ๋ณ„๋„๋กœ ๋‚ด๋ ค๋ฐ›์Šต๋‹ˆ๋‹ค. ์ ์ˆ˜ JSONL์€ ๋ณ„๋„ ์ˆ˜์ง‘ ํŒŒ์ผ์ž…๋‹ˆ๋‹ค.

์Šค์ฝ”์–ด๋ง์„ ๋ˆ ๋Œ€์กฐ ์‹คํ—˜์€ YAML์„ ๋ณต์‚ฌํ•˜์—ฌ name๊ณผ ๊ณตํ†ต score.enabled: false๋งŒ ๋ฐ”๊พธ๋ฉด ์„ธ profile ๋ชจ๋‘์— ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ง€์—ฐยทchurnยทmeshยท๋ฐœํ–‰ยทseed๋ฅผ ์œ ์ง€ํ•˜๊ณ  ๋ณ„๋„ run์œผ๋กœ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋ณต ์‹คํ–‰๊ณผ ์‹ค์ œ ๋ชจ์ง‘๋‹จยท๋ฐœํ–‰ ์ˆ˜๋ฅผ ํ•จ๊ป˜ ๋น„๊ตํ•˜์‹ญ์‹œ์˜ค. ๊ฐ™์€ seed๊ฐ€ ์ปจํ…Œ์ด๋„ˆ ํƒ€์ด๋ฐ๊ณผ ํ”„๋กœํ† ์ฝœ ๊ฒฐ๊ณผ๊นŒ์ง€ ๊ฐ™๊ฒŒ ๋งŒ๋“ค์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. ์ง€ํ‘œ ์ •์˜์™€ ํ”„๋กœํ† ์ฝœ ์„ค์ •์„ ์ฐธ๊ณ ํ•˜์‹ญ์‹œ์˜ค.