Agent Capacity KO - k-p2p-lab/kpl-v3 GitHub Wiki

Agent ์šฉ๋Ÿ‰๊ณผ Peer ๋ฐฐ์น˜

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

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

Agent๋ฅผ ์‹คํ–‰ํ•  ํ˜ธ์ŠคํŠธ๋Š” Swarm ๋ฐฐํฌ์—์„œ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฌธ์„œ๋Š” Peer ์ƒ์„ฑ ํ—ˆ์šฉ๋Ÿ‰๊ณผ ๋ฐฐ์น˜๋ฅผ ์„ค๋ช…ํ•˜๋ฉฐ ์š”์ฒญยท์‘๋‹ตยท์ ์šฉ ํ™•์ธ ํ•„๋“œ๋Š” ์„ค์ • API๊ฐ€ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

๊ธฐ๋ณธ๊ฐ’๊ณผ Agent๋ณ„ ์˜ˆ์™ธ ์„ค์ •

capacity๋Š” Peer ๊ฐœ์ˆ˜์˜ admission ์ œํ•œ์ด๋ฉฐ CPUยท๋ฉ”๋ชจ๋ฆฌ ์˜ˆ์•ฝ์ด๋‚˜ cgroup ํ•œ๋„๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. Agent์˜ Swarm resource ์ œํ•œ์„ ๋ฐ”๊พธ์–ด๋„ ํ˜•์ œ ์ปจํ…Œ์ด๋„ˆ์ธ Peer์— ์ „ํŒŒ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ œ๊ณต๋œ stack์€ KPL_AGENT_CAPACITY๋ฅผ ๋ชจ๋“  Agent์˜ ์‹œ์ž‘ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. **Dashboard โ†’ Agent Status โ†’ Settings (โš™๏ธ)**์—์„œ Custom for this Agent๋ฅผ ์„ ํƒํ•˜๋ฉด ํ•ด๋‹น Agent ID์—๋งŒ ์˜ˆ์™ธ๊ฐ’์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. CLI default๋ฅผ ์„ ํƒํ•˜๋ฉด ์˜ˆ์™ธ๊ฐ’์„ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด KPL_AGENT_CAPACITY=200์„ ์œ ์ง€ํ•œ ์ฑ„ ํŠน์ • Agent๋งŒ 100์œผ๋กœ ์„ค์ •ํ•˜๋ฉด ๋‹ค๋ฅธ Agent๋Š” ๊ณ„์† 200์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. CPU/RAM/FD/conntrack ๋ฐ Docker daemon ๋ถ€ํ•˜๋ฅผ ์ธก์ •ํ•ด capacity๋ฅผ ์ •ํ•˜์‹ญ์‹œ์˜ค.

Agent๋ณ„ ์˜ˆ์™ธ๊ฐ’์€ <controller-data-dir>/agent-capacities.json์— ์ €์žฅํ•˜๋ฉฐ Controller ๋ณผ๋ฅจ๊ณผ Agent ID๊ฐ€ ๊ฐ™์œผ๋ฉด ControllerยทAgent ์žฌ์‹œ์ž‘ ๋’ค์—๋„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. Controller ๋ฐฑ์—…์— ์ด ํŒŒ์ผ์„ ํฌํ•จํ•˜์‹ญ์‹œ์˜ค. Agent ID๊ฐ€ ๋ฐ”๋€Œ๋ฉด ๋ณ„๋„ ์„ค์ • ๋Œ€์ƒ์ž…๋‹ˆ๋‹ค. ์˜คํ”„๋ผ์ธ Agent์˜ ์„ค์ •์€ ์žฌ์ ‘์†ํ•  ๋•Œ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค. Controller์™€ Agent ๋ชจ๋‘ ์ด ๊ธฐ๋Šฅ์„ ์ง€์›ํ•˜๋Š” ๋ฒ„์ „์ด์–ด์•ผ ํ•˜๋ฉฐ, ๊ตฌ๋ฒ„์ „ Agent๋Š” UI์˜ ์„ค์ •(โš™๏ธ) ๋ฒ„ํŠผ์„ ๋น„ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค.

์„œ๋น„์Šค ์žฌ์‹œ์ž‘ ์—†์ด ๋“ฑ๋กยทheartbeat ์‘๋‹ต์œผ๋กœ ์„ค์ •์„ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ํ‘œ์—๋Š” CLI ๊ธฐ๋ณธ๊ฐ’ ๋˜๋Š” ์˜ˆ์™ธ๊ฐ’๊ณผ ์ ์šฉ ํ™•์ธ ์ „ **Applyingโ€ฆ**์„ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์šฉ๋Ÿ‰์„ ๋‚ฎ์ถ”๋ฉด ์ƒˆ ๋ฐฐ์น˜ ์ œํ•œ์„ ์ฆ‰์‹œ ์ ์šฉํ•˜๊ณ  ๊ธฐ์กด Peer๋Š” ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ ์ ์œ ๋Ÿ‰์ด ํ•œ๋„๋ณด๋‹ค ํฌ๋ฉด ์—ฌ์œ ๊ฐ€ ์ƒ๊ธธ ๋•Œ๊นŒ์ง€ ์ƒˆ join์ด ๋Œ€๊ธฐํ•ฉ๋‹ˆ๋‹ค. ์ฆ๊ฐ€๋Š” Agent๊ฐ€ ํ˜„์žฌ ์„ค์ •์„ ์ ์šฉํ–ˆ๋‹ค๊ณ  ํ™•์ธํ•œ ๋’ค ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Agent ์ž์ฒด ์ƒ์„ฑ ์ œํ•œ๊ณผ capacity ๋ฉ”ํŠธ๋ฆญ์—๋„ ๋ณ€๊ฒฝ๊ฐ’์„ ๋ฐ˜์˜ํ•ฉ๋‹ˆ๋‹ค.

๋ฐฐ์น˜ ์ •์ฑ…

์„ค์ • ๋ฐฐ์น˜ ๋™์ž‘
placement: balanced (๊ธฐ๋ณธ) Peer ํ•˜๋‚˜๋ฅผ ์ถ”๊ฐ€ํ•œ ์˜ˆ์ƒ ์ ์œ ๋Ÿ‰/์œ ํšจ capacity๊ฐ€ ๊ฐ€์žฅ ๋‚ฎ์€ online Agent๋ถ€ํ„ฐ ๋ฐฐ์น˜. ๋™๋ฅ ์€ ํ˜„์žฌ ์ ์œ ์œจ, Agent ID ์ˆœ์„œ
placement: random ์—ฌ์œ ๊ฐ€ ์žˆ๋Š” online Agent ์ค‘ ์‹œ๋“œ ๊ธฐ๋ฐ˜ ์„ ํƒ
placement: single-agent ํ•œ join ์‹คํ–‰์„ ์„ ํƒํ•œ Agent ํ•˜๋‚˜์— ๊ณ ์ •. repeat๋Š” ํšŒ์ฐจ๋งˆ๋‹ค ์žฌ์„ ํƒ. ๊ฐ€๋“ ์ฐจ๋ฉด ๋‹ค๋ฅธ ์„œ๋ฒ„๋กœ ๋„˜๊ธฐ์ง€ ์•Š๊ณ  ๋Œ€๊ธฐ
agentId ์ง€์ •ํ•œ Agent๋กœ ๊ณ ์ •. ๋ฌผ๋ฆฌ ์„œ๋ฒ„ ๊ณ ์ • ์‹คํ—˜์€ /api/v1/agents์˜ ID ์‚ฌ์šฉ
parallelism parallel: true์ธ join์—์„œ ๋™์‹œ์— ์‹คํ–‰ํ•  ์ž‘์—… ์ˆ˜. ์„œ๋ฒ„ ์ˆ˜๋‚˜ Swarm replica ์ˆ˜์™€ ๋‹ค๋ฆ„

Balanced ๋ฐฐ์น˜๋Š” ์›น ์˜ˆ์™ธ๊ฐ’์„ ํฌํ•จํ•œ ๊ฐ Agent์˜ ์œ ํšจ capacity์— ๋น„๋ก€ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋ถ€ํ•˜๊ฐ€ ์—†๋Š” capacity 100๊ณผ 50์˜ Agent์— Peer 75๊ฐœ๋ฅผ ์˜ˆ์•ฝํ•˜๋ฉด 50๊ฐœ์™€ 25๊ฐœ๋กœ ๋ฐฐ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ์ ์œ ๋Ÿ‰์—๋Š” ๋ชจ๋“  ์‹คํ—˜์˜ Peer, ์ƒ์„ฑ ์˜ˆ์•ฝ, ์ œ๊ฑฐ ์ค‘์ธ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ์กด Peer๋Š” ์ด๋™ํ•˜์ง€ ์•Š๊ณ  ์ƒˆ join๊ณผ churn์œผ๋กœ ๋น„์›Œ์ง€๋Š” ์Šฌ๋กฏ์„ ํ†ตํ•ด ์ ์œ  ๋น„์œจ์„ ๋งž์ถฅ๋‹ˆ๋‹ค. ๋ช…์‹œ์  agentId, random, single-agent๋Š” ์ง€์ •ํ•œ ๋ฐฐ์น˜ ์ •์ฑ…์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.

Agent ์œ ํšจ ์šฉ๋Ÿ‰ 75๊ฐœ ์˜ˆ์•ฝ ํ›„ Peer ์ˆ˜ ์ ์œ ์œจ
A 100 50 50%
B 50 25 50%

๋‹ค๋ฅธ ์ ์œ ๊ฐ€ ์—†๋Š” Agent์—์„œ ์‹œ์ž‘ํ•œ ์˜ˆ์ œ์ž…๋‹ˆ๋‹ค. Peer ์ ์œ ์œจ์ด ๊ฐ™์•„๋„ CPUยท๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋ฅ ๊นŒ์ง€ ๊ฐ™๋‹ค๋Š” ๋œป์€ ์•„๋‹™๋‹ˆ๋‹ค.

์ƒ์„ฑ ํ—ˆ์šฉยท์ •๋ฆฌยท๋ถ€ํ•˜

๋™์‹œ ์‹คํ—˜์˜ ์˜ˆ์•ฝ์€ Controller์—์„œ ์ง๋ ฌํ™”ํ•ฉ๋‹ˆ๋‹ค. Agent๋Š” ์ƒ์„ฑ ์š”์ฒญ ์ˆ˜๋ฝ๋ถ€ํ„ฐ ์‚ญ์ œ ์™„๋ฃŒ ํ™•์ธ๊นŒ์ง€ ์Šฌ๋กฏ์„ ์œ ์ง€ํ•˜๋ฏ€๋กœ Docker ์ƒ์„ฑยท์‹œ์ž‘ ๋Œ€๊ธฐ ์‹œ๊ฐ„๋„ ํฌํ•จํ•˜๋ฉฐ, ์‚ญ์ œ ์‹คํŒจ๋„ ์ ์œ ๋Ÿ‰์— ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ๊ฐœ๋ณ„ Peer DELETE์˜ ์ ‘์ˆ˜ ์‘๋‹ต๋งŒ์œผ๋กœ ์Šฌ๋กฏ์„ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋„คํŠธ์›Œํฌ ๋‹จ์ ˆ๋กœ ๋ณด๊ณ ๊ฐ€ 10์ดˆ ๋„˜๊ฒŒ ์—†์œผ๋ฉด ์‹ ๊ทœ ๋ฐฐ์น˜์—์„œ ์ œ์™ธํ•˜๋ฉฐ, ์ด์ „ Agent ํ”„๋กœ์„ธ์Šค๋‚˜ ์ˆœ์„œ๊ฐ€ ๋’ค์ง‘ํžŒ ๋ณด๊ณ ๊ฐ€ ํ˜„์žฌ ๋…ธ๋“œยท์šฉ๋Ÿ‰์„ ๋ฎ์–ด์“ฐ์ง€ ์•Š๋„๋ก ๊ฒ€์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๊ฐ™์€ ID์˜ ์ƒˆ Agent๋Š” ์ด์ „ ํ”„๋กœ์„ธ์Šค์˜ online ์œ ํšจ ์‹œ๊ฐ„์ด ๋๋‚œ ๋’ค ๋“ฑ๋ก๋ฉ๋‹ˆ๋‹ค.

์ƒ์„ฑ ์‘๋‹ต์ด ๋Š๊ธฐ๋ฉด ์ž…์žฅ ์—ฌ๋ถ€๊ฐ€ ๋ถˆํ™•์‹คํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Controller๋Š” ๋ณต๊ตฌ ์ค‘ ์˜ˆ์•ฝ์„ ์œ ์ง€ํ•˜๋ฉฐ, Peer ์ƒํƒœ ๋ณด๊ณ ๋กœ ์ ์œ ๋ฅผ ํ™•์ธํ•˜๊ฑฐ๋‚˜ ํ•ด๋‹น Run ์ •๋ฆฌ์—์„œ ์‹คํ–‰ ์„ธ๋Œ€ ์ฐจ๋‹จ๊ณผ ์ปจํ…Œ์ด๋„ˆ ์ œ๊ฑฐ๊ฐ€ ํ™•์ธ๋œ ๋’ค ํ•ด์ œํ•ฉ๋‹ˆ๋‹ค. ์žฌ์‹œ๋„ ํ•œ๋„์™€ ๋ฒ„์ „ ํ˜ธํ™˜์„ฑ์€ ์ƒ์„ฑ ์š”์ฒญ ๋ณต๊ตฌ ๊ณ„์•ฝ์„ ์ฐธ๊ณ ํ•˜์‹ญ์‹œ์˜ค.

Peer๊ฐ€ ๋ณด๊ณ ํ•œ stopping, stopped, failed ์ƒํƒœ๋งŒ์œผ๋กœ ์ปจํ…Œ์ด๋„ˆ ์ œ๊ฑฐ๋ฅผ ํ™•์ธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ•ด๋‹น ์ƒํƒœ์—ฌ๋„ ์‹ค์ œ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์‚ด์•„ ์žˆ์œผ๋ฉด ์ •์ง€ ์š”์ฒญ์œผ๋กœ ์ทจ์†Œํ•ฉ๋‹ˆ๋‹ค. Run ์ •๋ฆฌ๋Š” ๋™์‹œ์— ์‹œ์ž‘๋œ ์žฌ์‹œ๋„๋ฅผ ํฌํ•จํ•˜์—ฌ ํ˜„์žฌ ์ œ๊ฑฐ ์‹œ๋„๊ฐ€ ๋๋‚  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค. Agent๋Š” ์ข…๋ฃŒ ์ฆ๊ฑฐ๊ฐ€ ๋กœ์ปฌ telemetry ํ์— ๋“ค์–ด๊ฐ€๊ณ  ์ •๋ฆฌ ์™„๋ฃŒ๊ฐ€ ๊ธฐ๋ก๋  ๋•Œ๊นŒ์ง€ ์Šฌ๋กฏ์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.

Docker ์ƒ์„ฑ admission์—๋Š” 45์ดˆ์˜ ์˜ˆ์‚ฐ์„ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ดํ›„ ์„ค์ • ๋ณต์‚ฌยท์‹œ์ž‘ยท์ฃผ์†Œ ํ™•์ธ์€ ์ƒˆ๋กœ ์‹œ์ž‘ํ•˜๋Š” 45์ดˆ ์˜ˆ์‚ฐ์„ ๊ณต์œ ํ•ฉ๋‹ˆ๋‹ค. ์›๋ž˜ ์š”์ฒญ์˜ deadline์ด ๋” ์งง์œผ๋ฉด ๋‘ ๋‹จ๊ณ„ ๋ชจ๋‘ ์ด๋ฅผ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค. admission ๋„์ค‘ ์ทจ์†Œ๋Š” ๋Šฆ๊ฒŒ ์ƒ์„ฑ๋œ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ •๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ์ œํ•œ ์‹œ๊ฐ„ ์•ˆ์—์„œ ์ƒ์„ฑ ๊ฒฐ๊ณผ๋ฅผ ํ™•๋ณดํ•  ๋•Œ๊นŒ์ง€ ๋ณด๋ฅ˜ํ•˜๋ฉฐ, ์‹œ์ž‘ ๋‹จ๊ณ„๋Š” ์ฆ‰์‹œ ์ทจ์†Œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. internal/agent/docker.go๋ฅผ ์ฐธ๊ณ ํ•˜์‹ญ์‹œ์˜ค. ํ˜ผ์žกํ•œ ์„œ๋ฒ„์—์„œ ์ด ์ œํ•œ์„ ๋ฐ˜๋ณตํ•ด์„œ ์ดˆ๊ณผํ•˜๋ฉด join parallelism๊ณผ capacity๋ฅผ ๋‚ฎ์ถ”๊ณ  ๋””์Šคํฌยท๋ฐ๋ชฌ ๋ถ€ํ•˜๋ฅผ ์ ๊ฒ€ํ•˜์‹ญ์‹œ์˜ค.

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