์ค์๋ฒ์์ ๋ฐ์ํ๋ 3๋ ์ฅ์ (OOM / CPU Spike / Deadlock)๋ฅผ ๊ด์ ๋ก๊ทธยท์คํ ๋ก๊ทธยท์์คํ ๋๊ตฌ์ ๊ฐ๊ด์ ์ฆ๊ฑฐ๋ฅผ ๊ทผ๊ฑฐ๋ก ์ถ๋ก ํ๊ณ , GitHub Issue ํํ์ ๊ธฐ์ ๋ฆฌํฌํธ๋ก ์ ๋ฆฌํ๋ค.
์คํ ํ๊ฒฝ: macOS + OrbStack Ubuntu 24.04 ๋จธ์ (B1-1๊ณผ ๋์ผ ์ธํ๋ผ ์ฌ์ฌ์ฉ)
๋ณธ ์ ์ฅ์๋ B1-1 ์์ ๊ตฌ์ถํ SSH/๋ฐฉํ๋ฒฝ/๊ณ์ /๋๋ ํ ๋ฆฌ/cron ์ธํ๋ผ ์์ B1-2 ์ ์ฉ์ผ๋ก
agent-leak-app์ ์น์ด ์ฅ์ ๋ฅผ ์ฌํํ๋ ๊ตฌ์กฐ๋ค.
์ถ์ฒ:
codyssey_assignments/B1-2.pdfโ ์๋ฌธ ์๊ตฌ์ฌํญ์ ๊ทธ๋๋ก ์ฎ๊ธฐ๊ณ , ํด์ค์ ๐ก ๋ก ๊ตฌ๋ถํ๋ค.
| ํญ๋ชฉ | ๋ด์ฉ |
|---|---|
| ๋ถ์ผ | AI/SW ๊ธฐ์ด |
| ๊ตฌ๋ถ | Linux์ OS |
| ํ์ต์๊ฐ | 40์๊ฐ |
| ๋ฏธ์ ์ ๋ชฉ | ์ปดํจํฐ๊ฐ ๊ฐ์๊ธฐ ๋๋ ค์ง๊ฑฐ๋ ๋ฉ์ท์ ๋ ์์ธ ์ฐพ์ ๊ณ ์น๊ธฐ |
| ๋ฌธ์ ์ ํ | ๋ฌธ์ ๊ธฐ์ / ๊ธฐ์ ์ ์ค๋ช |
| ์ ๊ณต ๋ฐ์ดํฐํ์ผ | agent-app-leak.zip, ๋จ์๋ฌธ์ PDF ํ์ผ |
| ๋ฐ์ดํฐํ์ผ ์ค๋ช | agent-app-leak-x86 (Intel chip) / agent-app-leak-arm64 (Apple chip) |
Memory Leak, CPU Spike, Deadlock. ์ด ์ธ ๊ฐ์ง ์ค ํ๋๊ฐ ์ค์๋ฒ์์ ํฐ์ง๋ฉด ์ด๋ป๊ฒ ํด์ผ ํ ๊น์? ๋ก๊ทธ ์์ด ์ฌ๋ถํ ๋ถํฐ ํ๋ฉด ์์ธ์ด ๋ฌปํ๊ณ , ๊ฐ์ ์ฅ์ ๊ฐ ๋ ๋ฒ, ์ธ ๋ฒ ๋ฐ๋ณต๋ฉ๋๋ค. ๊ด์ ๋ฐ์ดํฐ๋ฅผ ๊ทผ๊ฑฐ๋ก ์์ธ์ ์ถ๋ก ํ๊ณ , GitHub Issue ํํ์ ๊ธฐ์ ๋ฆฌํฌํธ๋ก ๋จ๊ธฐ๋ ๊ฒ๊น์ง ์ง์ ํด๋ด ๋๋ค.
๊ฐ๋ฐ์๊ฐ ์์ฑํ ์ฝ๋๋ ์ด์์ฒด์ ์์์ ํ๋ก์ธ์ค ํํ๋ก ์คํ๋ฉ๋๋ค. ์ด ๋ฏธ์ ์์๋ ๋น๋๋ ํ๋ก๊ทธ๋จ์ ์ด์ ํ๊ฒฝ์์ ์คํํ๋ฉฐ ๋ฐ์ํ๋ ์์คํ ์ฅ์ (Memory Leak/OOM, CPU Spike, Deadlock) ๋ถ์์ ๋ค๋ฃน๋๋ค.
๋จ์ํ "ํ๋ก๊ทธ๋จ์ด ๊บผ์ก๋ค!"๋ ๊ฒฐ๊ณผ๋ง ๋ณด๋ ๊ฒ์ด ์๋๋ผ, ๊ด์ ๋ฐ์ดํฐ์ ๋ก๊ทธ๋ฅผ ํตํด ์ฅ์ ์ ์์ธ์ ์ถ๋ก ํด์ผ ํฉ๋๋ค. ์ด๋ฅผ ๋ฐํ์ผ๋ก ํ์ ๊ฐ๋ฐ์์ฒ๋ผ GitHub Issue ํํ์ ๊ธฐ์ ๋ฆฌํฌํธ๋ฅผ ์์ฑํ๋ฉฐ ์ค์ ์ ์ธ ํธ๋ฌ๋ธ์ํ ๋ฐ ํ์ ์ปค๋ฎค๋์ผ์ด์ ์ญ๋์ ๊ธฐ๋ฅด๋ ๊ฒ์ด ์ต์ข ๋ชฉํ์ ๋๋ค.
๐ก
- ์ด ๊ณผ์ ์ ์ฐ์ถ๋ฌผ์ "์ฝ๋"๊ฐ ์๋๋ผ "๋ฆฌํฌํธ 3๊ฑด"์ด๋ค. ํ๋ก๊ทธ๋จ์ ์ด๋ฏธ ๋น๋๋ ๋ฐ์ด๋๋ฆฌ๋ก ์ฃผ์ด์ง๊ณ , ํ์ต์๊ฐ ๋ง๋๋ ๊ฒ์
monitor.sh๊ด์ ์คํฌ๋ฆฝํธ(B1-1 ๊ณผ์ ์ ์ฐ์ฅ)์ ์ฆ๊ฑฐ๋ก ๋ฌด์ฅํ ์ฅ์ ๋ถ์ ๋ฌธ์๋ค.- "์ฅ์ ๋ฅผ ๊ณ ์น๋ ๊ฒ"์ด ์๋๋ผ "์ฅ์ ๋ฅผ ์ฆ๋ช ํ๋ ๊ฒ"์ด ํ๊ฐ ๋์์ด๋ค. ํ๊ฒฝ๋ณ์ ์กฐ์ ์ ์ด๋๊น์ง๋ ์์ ์กฐ์น(Workaround)์ด๋ฉฐ, ์ฑ์ ์๋ ์ ๊ทธ๋ ๊ฒ ํ๋จํ๋๊ฐ์ ์ฆ๊ฑฐ ์ฌ์ฌ(๊ด์ ์์น โ ๋ก๊ทธ ๋ฌธ์์ด โ OS ๋์ ์๋ฆฌ)์ ๋ณธ๋ค.
- ์ธ ์ฅ์ ๋ ๊ฐ๊ฐ ๋ค๋ฅธ ์ง๋จ ๋๊ตฌ๋ฅผ ๊ฐ์ํ๋ค. OOM์ ์๊ณ์ด ๋ฉ๋ชจ๋ฆฌ ์ฆ๊ฐ(
ps/monitor.sh), CPU Spike๋ ํ๋ก์ธ์ค ๋จ์ ์ ์ ์จ(top/ps), Deadlock์ ์ค๋ ๋ ๋จ์ ๊ด์ฐฐ(top -H,ps -L)์ด๋ค. ๊ฐ์ ๋๊ตฌ๋ก ์ธ ๊ฐ๋ฅผ ๋ค ์ค๋ช ํ๋ฉด ๊ฐ์ ํฌ์ธํธ๊ฐ ๋๋ค.- Deadlock์ "์ฃฝ์ง ์๋ ์ฅ์ "๋ค. ํ๋ก์ธ์ค๊ฐ ์ข ๋ฃ๋์ง ์์ผ๋ฏ๋ก ์ข ๋ฃ ๋ก๊ทธ๊ฐ ์๋ค. "์๋ฌด ์ผ๋ ์ผ์ด๋์ง ์๋๋ค"๋ ๊ฒ ์์ฒด๋ฅผ ์ฆ๊ฑฐ๋ก ์ ์ํ๋ ํ๋ จ์ด๋ค.
- ์กํ์์น ์ปค๋ฎค๋์ผ์ด์ ์ด ๋ช ์์ ๋ชฉํ๋ค. GitHub Issue ํ ํ๋ฆฟ์ ์งํค๋ ๊ฒ์ ํ์์ด ์๋๋ผ "๋๋ฃ๊ฐ ๋ด ๋ก๊ทธ ์์ด๋ ์ฌํํ ์ ์๋๊ฐ"๋ฅผ ๋ฌป๋ ์ญ๋ ํ๊ฐ๋ค.
(์๋ฌธ) ๋ค์ ๊ณผ์ ์ ์ฐ์ถ๋ฌผ์ PDF ๋๋ GitHub Repository ๋งํฌ ํํ๋ก ์ ์ถํด์ผ ํ๋ค.
- D1 3๊ฐ์ง ์ฅ์ ์ ํ(OOM Crash, CPU Latency, Deadlock) ๊ฐ๊ฐ์ ๋ํด ์์ฑ๋ GitHub Issue ํํ์ ๊ธฐ์ ๋ณด๊ณ ์
- ๊ฐ ๋ฆฌํฌํธ๋ ์๋์ ํ์ ํฌํจ ํญ๋ชฉ์ ๋ชจ๋ ๊ฐ์ถ์ด์ผ ํ๋ค.
- D1-1 ๋ฐ์ ํ์: ์ฅ์ ๊ฐ ์ด๋ป๊ฒ ๊ด์ธก๋์๋์ง ์์
- D1-2 ์ฌํ ๊ฒฝ๋ก ๋ฐ ์ฆ๊ฑฐ: ๋ก๊ทธ/๋ช ๋ น์ด ์ถ๋ ฅ/์คํฌ๋ฆฐ์ท ๋ฑ ๊ฐ๊ด์ ์ฆ๊ฑฐ ์ฒจ๋ถ
- D1-3 ๊ทผ๋ณธ ์์ธ: ์ฅ์ ์ ๊ธฐ์ ์ ์์ธ ๋ถ์
- D1-4 ์กฐ์น ๋ด์ฉ: ํ๊ฒฝ๋ณ์ ์กฐ์ ๋ฑ ์์ ์กฐ์น์ ๊ทธ ๊ฒฐ๊ณผ
- D1-5 ๊ฒฐ๊ณผ ํ์ธ: ์กฐ์น ํ Before & After ๋น๊ต ๊ฒฐ๊ณผ
(์๋ฌธ) ๊ฐ ๋ฆฌํฌํธ๋ ์๋ ๊ตฌ์กฐ๋ฅผ ๋ฐ๋ฅด๋, ์ธ๋ถ ๋ด์ฉ์ ์์ ๋กญ๊ฒ ์์ฑํ ์ ์๋ค.
[Bug] {์ฅ์ ์ ํ} - {ํ ์ค ์์ฝ}
## 1. Description (ํ์ ์ค๋ช
)
- ์ด๋ค ํ์์ด ๋ฐ์ํ๋๊ฐ?
- ์ธ์ , ์ด๋ค ์กฐ๊ฑด์์ ๋ฐ์ํ๋๊ฐ?
## 2. Evidence & Logs (์ฆ๊ฑฐ ์๋ฃ)
- monitor.sh ๊ด์ ๋ก๊ทธ ๋ฐ์ดํฐ (์์น/๊ทธ๋ํ/์คํฌ๋ฆฐ์ท)
- ํ๋ก๊ทธ๋จ ์คํ ๋ก๊ทธ ์ค ํต์ฌ ๊ตฌ๊ฐ ๋ฐ์ท
- ์์คํ
๋๊ตฌ(ps, top ๋ฑ) ์ถ๋ ฅ ๊ฒฐ๊ณผ
## 3. Root Cause Analysis (์์ธ ๋ถ์)
- ์์ง๋ ์ฆ๊ฑฐ๋ฅผ ๋ฐํ์ผ๋ก ํ ๊ธฐ์ ์ ์์ธ ๋ถ์
- ๊ด๋ จ OS ๋์ ์๋ฆฌ ์ค๋ช
## 4. Workaround & Verification (์กฐ์น ๋ฐ ๊ฒ์ฆ)
- ์ด๋ค ํ๊ฒฝ๋ณ์๋ฅผ ์ด๋ป๊ฒ ์กฐ์ ํ๋๊ฐ?
- Before & After ๋น๊ต ๊ฒฐ๊ณผ (์์น ๋๋ ์คํฌ๋ฆฐ์ท)
- ๊ทผ๋ณธ์ ํด๊ฒฐ์ ์ํ ์ถ๊ฐ ์ ์ (์ ํ)E1. OOM
- E1-1
monitor.sh๊ฒฐ๊ณผ(๋ฉ๋ชจ๋ฆฌ ์์น ์์น) - E1-2 ์ข
๋ฃ ์ง์ /์งํ ์คํ ๋ก๊ทธ(
"Memory limit exceededโฆ","SELF-TERMINATEDโฆ"๋ฑ) - E1-3
MEMORY_LIMIT๋ณ๊ฒฝ ์ ํ ๋น๊ต(์ต์ 2ํ ์คํ)
E2. CPU
- E2-1 CPU ์ฌ์ฉ๋ฅ ๊ธ์์น ๊ตฌ๊ฐ(
top/ps/ ๊ด์ ) ์บก์ฒ - E2-2 ์ข
๋ฃ ๋ก๊ทธ(
"WATCHDOGโฆ SIGTERM"๋ฑ) - E2-3
CPU_MAX_OCCUPY๋ณ๊ฒฝ ์ ํ ๋น๊ต
E3. Deadlock
- E3-1 PID ์กด์ฌ ์ฆ๊ฑฐ(
ps -ef | grep โฆ) - E3-2 CPU/MEM ๋ณํ ์ ์ฒด ์ฆ๊ฑฐ(
top -H๋๋ps -L) - E3-3 ๋ง์ง๋ง ๋ก๊ทธ ์ง์ (
"WAITINGโฆ BLOCKED") - E3-4 ์ค๋ ๋/๋ฝ ๋๊ธฐ ์ถ๋ก ๊ทผ๊ฑฐ
๐ก (ํด์ค)
E1-3์ "์ต์ 2ํ ์คํ"์ ์ด ๋ช ์ธ์์ ์ ์ผํ๊ฒ ์คํ ํ์๋ฅผ ์ซ์๋ก ๋ชป ๋ฐ์ ์กฐ๊ฑด์ด๋ค. Before 1ํ + After 1ํ๋ฅผ ๊ฐ๊ฐ ๋ณ๋์ ๋ก๊ทธ ํ์ผ/ํ์์คํฌํ๋ก ๋จ๊ฒจ์ผ ์๊ฑด์ ๋ง์กฑํ๋ค.
(์๋ฌธ) ํด๋น ๋ฏธ์ ์ ์๋ฃํ ๋ค, ํ์ต์๋ ์๋๋ฅผ ์ค์ค๋ก ์ค๋ช ํ ์ ์์ด์ผ ํ๋ค.
- G1 ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ์ดํดํ๊ณ , ๋ฉ๋ชจ๋ฆฌ ๋์๊ฐ ์์คํ ์ ์ฒด์ ๋ฏธ์น๋ ์ํฅ์ ์ค๋ช ํ ์ ์๋ค.
- G2 ํน์ ํ๋ก์ธ์ค์ CPU ๊ณผ์ ์ ๊ฐ ์์คํ ์ง์ฐ์ ์ ๋ฐํ๋ ์๋ฆฌ๋ฅผ ์ค๋ช ํ ์ ์๋ค.
- G3 ์์ ๊ฒฝ์์ผ๋ก ์ธํด ๋ฐ์ํ๋ ๊ต์ฐฉ์ํ(Deadlock)์ ๊ฐ๋ ์ ์ดํดํ๊ณ , ํ๋ก์ธ์ค๊ฐ ๋ฉ์ถ ์ํ๋ฅผ ์์คํ ๋๊ตฌ๋ก ์๋ณํ์ฌ ์ง๋จํ ์ ์๋ค.
- G4 ๋ก๊ทธ์ ๊ด์ ๋ฐ์ดํฐ๋ฅผ ์ฆ๊ฑฐ๋ก ์ ์ํ์ฌ ์กํ์์น์ ๋ง๊ฒ ์ฅ์ ์ํฉ์ ๊ธฐ์ ํ๊ณ , GitHub Issue๋ฅผ ํตํด ๋๋ฃ ๊ฐ๋ฐ์์ ๋ช ํํ๊ฒ ์ํตํ ์ ์๋ค.
(์๋ฌธ) ๋ค์ ์๊ตฌ์ฌํญ์ ๋ชจ๋ ๋ง์กฑํด์ผ ํ๋ค.
(์๋ฌธ)
agent-leak-app์ ์คํํ๊ธฐ ์ํด์๋ ์๋ ์กฐ๊ฑด์ด ๋ชจ๋ ์ถฉ์กฑ๋์ด์ผ ํ๋ค. ์กฐ๊ฑด์ด ์ถฉ์กฑ๋์ง ์์ผ๋ฉด ๋ถํธ ์ํ์ค์์ ์๋์ผ๋ก ์คํจ ์ฒ๋ฆฌ๋๋ค.
| ํญ๋ชฉ | ์กฐ๊ฑด |
|---|---|
| ์คํ ๊ณ์ | root๊ฐ ์๋ ์ผ๋ฐ ์ฌ์ฉ์ |
AGENT_HOME |
ํ์ ํ๊ฒฝ๋ณ์ ์ค์ |
AGENT_PORT |
15034 (๊ณ ์ ) |
AGENT_UPLOAD_DIR |
$AGENT_HOME/upload_files (๋๋ ํฐ๋ฆฌ ์กด์ฌ ํ์) |
AGENT_KEY_PATH |
$AGENT_HOME/api_keys (๊ฒฝ๋ก ์กด์ฌ ํ์) |
AGENT_LOG_DIR |
๋ก๊ทธ ๋๋ ํฐ๋ฆฌ (์กด์ฌ + ์ฐ๊ธฐ ๊ถํ) |
MEMORY_LIMIT |
์ ์, 50~512 ๋ฒ์ (๋จ์: MB) |
CPU_MAX_OCCUPY |
์ ์, 10~100 ๋ฒ์ (๋จ์: %) |
MULTI_THREAD_ENABLE |
true / false (1 / 0, yes / no ํ์ฉ) |
secret.key ํ์ผ |
$AGENT_HOME/api_keys/secret.key ์กด์ฌ, ๋ด์ฉ: agent_api_key_test |
| ๋คํธ์ํฌ | 0.0.0.0:15034 ๋ฐ์ธ๋ฉ ๊ฐ๋ฅ |
์ฒดํฌ๋ฆฌ์คํธ ํํ๋ก ๋ค์ ์ ๋ฆฌํ๋ฉด:
- R1-1 root๊ฐ ์๋ ์ผ๋ฐ ์ฌ์ฉ์ ๊ณ์ ์ผ๋ก ์คํํ๋ค.
- R1-2
AGENT_HOMEํ๊ฒฝ๋ณ์๋ฅผ ์ค์ ํ๋ค. (ํ์) - R1-3
AGENT_PORT๋ฅผ15034๋ก ๊ณ ์ ์ค์ ํ๋ค. - R1-4
AGENT_UPLOAD_DIR๋ฅผ$AGENT_HOME/upload_files๋ก ์ค์ ํ๊ณ ๋๋ ํฐ๋ฆฌ๋ฅผ ์ค์ ๋ก ์์ฑํ๋ค. - R1-5
AGENT_KEY_PATH๋ฅผ$AGENT_HOME/api_keys๋ก ์ค์ ํ๊ณ ๊ฒฝ๋ก๊ฐ ์กด์ฌํ๊ฒ ํ๋ค. - R1-6
AGENT_LOG_DIR(๋ก๊ทธ ๋๋ ํฐ๋ฆฌ)๊ฐ ์กด์ฌํ๊ณ ์ฐ๊ธฐ ๊ถํ์ ๊ฐ๊ฒ ํ๋ค. - R1-7
MEMORY_LIMIT๋ฅผ ์ ์ 50~512(MB) ๋ฒ์๋ก ์ค์ ํ๋ค. - R1-8
CPU_MAX_OCCUPY๋ฅผ ์ ์ 10~100(%) ๋ฒ์๋ก ์ค์ ํ๋ค. - R1-9
MULTI_THREAD_ENABLE๋ฅผtrue/false(1/0,yes/noํ์ฉ)๋ก ์ค์ ํ๋ค. - R1-10
$AGENT_HOME/api_keys/secret.keyํ์ผ์ ๋ง๋ค๊ณ ๋ด์ฉ์ ์ ํํagent_api_key_test๋ก ์ฑ์ด๋ค. - R1-11
0.0.0.0:15034๋ฐ์ธ๋ฉ์ด ๊ฐ๋ฅํ ๋คํธ์ํฌ ์ํ๋ฅผ ํ๋ณดํ๋ค.
๐ก (ํด์ค) ์ด ํ๋ "ํ๊ฒฝ ๊ตฌ์ฑ ์์ "๊ฐ ์๋๋ผ ๋ถํธ ์ํ์ค ์คํจ๋ฅผ ํตํ ๋๋ฒ๊น ํ๋ จ์ด๋ค. 11๊ฐ ์กฐ๊ฑด ์ค ํ๋๋ผ๋ ๋น ์ง๋ฉด ํ๋ก๊ทธ๋จ์ด ์์์กฐ์ฐจ ํ์ง ์์ผ๋ฏ๋ก, ์คํจ ๋ฉ์์ง๋ฅผ ์ฝ๊ณ ์ด๋ค ์กฐ๊ฑด์ด ์ด๊ธ๋ฌ๋์ง ์ญ์ถ์ ํ๋ ๊ณผ์ ์์ฒด๊ฐ ํ์ต ๋ด์ฉ์ด๋ค. ์ด ์กฐ๊ฑด๋ค์
.bash_profile๋ฑ์ ์๊ตฌ ๋ฑ๋กํด๋๋ ํธ์ด ์ฌํ์ ์ ๋ฆฌํ๋ค(์๋ฌธ ์์ ๋ฆฌํฌํธ์์.bash_profile๋ด ํ๊ฒฝ๋ณ์๋ฅผ ์กฐ์ ํ๋ค๊ณ ์์ ํ๋ค).
- R2-1
monitor.sh๋ฅผ ํ์ฉํ์ฌ, ๋์ ํ๋ก์ธ์ค(agent-leak-app)์ ๋ฌผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ด ์๊ฐ ๊ฒฝ๊ณผ์ ๋ฐ๋ผ ์ฆ๊ฐํ๋ ํจํด์ ๊ด์ธกํ๋ค. - R2-2 ํ๋ก์ธ์ค๊ฐ ์๊ณ ์์ด ์ค๋จ๋์์ ๋ ํ๋ก๊ทธ๋จ ์คํ ๋ก๊ทธ๋ฅผ ๋ถ์ํ์ฌ, ๋ฉ๋ชจ๋ฆฌ ์๊ณ์น ์ด๊ณผ๋ก ์ธํด ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฉ๋ชจ๋ฆฌ ๋ณดํธ ์ ์ฑ (MemoryGuard) ์ ๋ฐ๋ผ ๊ฐ์ ์ข ๋ฃ๋์์์ ๋ํ๋ด๋ ํต์ฌ ๋ก๊ทธ๋ฅผ ์๋ณํ๋ค.
- R2-3 ํ๊ฒฝ๋ณ์(
MEMORY_LIMIT)๋ฅผ ์กฐ์ ํ์ฌ ํ๋ก๊ทธ๋จ์ด ๋ ์ค๋ ์์กดํ๋ ๊ฒ์ ํ์ธํ๊ณ , ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋ฆฌํฌํธ์ Before & After๋ก ๊ธฐ๋กํ๋ค.
- R3-1 ๊ด์ ํด๊ณผ ๋ก๊ทธ๋ฅผ ํตํด ์์คํ
์ ์ฒด ๋ถํ๊ฐ ์๋ ํน์ ํ๋ก์ธ์ค(
agent-leak-app)์ CPU ์ฌ์ฉ๋ฅ ์ด ๊ธ๊ฒฉํ ์์นํ๋ ๊ตฌ๊ฐ์ ์๋ณํ๋ค. - R3-2 ํ๋ก๊ทธ๋จ ์คํ ๋ก๊ทธ ๋ถ์์ ํตํด, ํด๋น ์ข ๋ฃ๊ฐ ์ค๋ฅ๊ฐ ์๋ ๊ณผ์ ์ ๋ฐฉ์ง ์ ์ฑ (Watchdog)์ ๋ฐ๋ฅธ ์์คํ ๋ณดํธ ์กฐ์น์์์ ์ ์ฆํ๋ค.
- R3-3 ํ๊ฒฝ๋ณ์(
CPU_MAX_OCCUPY)๋ฅผ ์กฐ์ ํ์ฌ ํ๋ก์ธ์ค ์ข ๋ฃ ์ฌ๋ถ ๋๋ ์์กด ์๊ฐ ๋ณํ๋ฅผ ํ์ธํ๊ณ , ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋ฆฌํฌํธ์ Before & After๋ก ๊ธฐ๋กํ๋ค.
- R4-1 ํ๋ก์ธ์ค๊ฐ ์ข ๋ฃ๋์ง ์๊ณ ์ด์์์ผ๋(PID ์กด์ฌ), CPU/๋ฉ๋ชจ๋ฆฌ ๋ณํ๊ฐ ์๊ณ ๋ก๊ทธ ๊ธฐ๋ก๋ ๋ฉ์ถ ๋ฌด์๋ต ์ํ์์ ์๋ณํ๋ค.
- R4-2 ํ๋ก๊ทธ๋จ ๋ก๊ทธ์ ๋ง์ง๋ง ๊ธฐ๋ก์ ๋ถ์ํ์ฌ, ์๋ก ๋ค๋ฅธ ์ค๋ ๋๊ฐ ์๋๋ฐฉ์ ์์์ ๋ฌดํํ ๊ธฐ๋ค๋ฆฌ๋ ์ํ์์ ๋ ผ๋ฆฌ์ ์ผ๋ก ์ฆ๋ช ํ๋ค.
- R4-3 ํ๊ฒฝ๋ณ์(
MULTI_THREAD_ENABLE)๋ฅผ ์กฐ์ ํ์ฌ ๋ฐ๋๋ฝ ์ฌํ/ํํผ ๋น๊ต ๊ฒฐ๊ณผ๋ฅผ ๋ฆฌํฌํธ์ ๊ธฐ๋กํ๋ค. - R4-4 (๊ถ์ฅ) Deadlock(๊ต์ฐฉ์ํ)์ ๊ฐ๋
์ด ์์ํ ํ์ต์๋ ์๋ ํค์๋๋ฅผ ์ฐธ๊ณ ํ์ฌ ๊ธฐ๋ณธ ๊ฐ๋
์ ํ์ตํ ํ ๋ฏธ์
์ ์ํ๋ ๊ฒ์ ๊ถ์ฅํ๋ค.
- ์์ฌํ๋ ์ฒ ํ์๋ค ๋ฌธ์ (Dining Philosophers Problem): ๊ต์ฐฉ์ํ์ ๋ํ์ ์ธ ๋น์ ๋ชจ๋ธ
- ๊ต์ฐฉ์ํ 4๋ ์กฐ๊ฑด: ์ํธ ๋ฐฐ์ (Mutual Exclusion), ์ ์ ๋๊ธฐ(Hold and Wait), ๋น์ ์ (No Preemption), ์ํ ๋๊ธฐ(Circular Wait)
๐ก (ํด์ค) R4-4๋ ์๋ฌธ์์ "๊ถ์ฅ"์ด๋ผ๊ณ ๋ช ์๋์ด ์์ผ๋ฏ๋ก ํ์ ์ ์ถ๋ฌผ์ ์๋๋ค. ๋ค๋ง 0.3์ ๋ชฉํ G3๊ณผ ํ๊ฐ ์ฒดํฌ๋ฆฌ์คํธ์ "ํต์ฌ ๊ฐ๋ ์ดํด" ํญ๋ชฉ์ด ์ ํํ ์ด ๋ ํค์๋๋ฅผ ๊ฒจ๋ฅํ๋ฏ๋ก, ๋ฆฌํฌํธ 3์ (Root Cause Analysis)์ 4๋ ์กฐ๊ฑด ์ค ์ด๋ค ์กฐ๊ฑด์ด ์ด๋ป๊ฒ ์ฑ๋ฆฝํ๋์ง๋ฅผ ์ ์ด๋๋ฉด ๊ทธ๋๋ก ํ๊ฐ ๋ต๋ณ์ด ๋๋ค.
(์๋ฌธ) 5. ๋ณด๋์ค ๊ณผ์ (์ ํ) โ ์ค์ผ์ค๋ง ์๊ณ ๋ฆฌ์ฆ ์ถ๋ก
- B1 ์ค์ผ์ค๋ง ์๊ณ ๋ฆฌ์ฆ ์ถ๋ก
- B1-1 ํ๋ก๊ทธ๋จ ๋ก๊ทธ ๋ฐ์ดํฐ ๋ถ์: ๋ก๊ทธ์ ํ์์คํฌํ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๋ก์ธ์ค ๊ฐ ์คํ ์์์ ๊ต์ฒด ์ฃผ๊ธฐ๋ฅผ ํจํดํํ๋ค.
- B1-2 ์๊ณ ๋ฆฌ์ฆ ์ญ์ถ๋ก : ๋์ถ๋ ํจํด์ ๊ทผ๊ฑฐ๋ก, ํ์ฌ ํ๋ก๊ทธ๋จ์ ์ ์ฉ๋ ์ค์ผ์ค๋ง ๊ธฐ๋ฒ์ด Round-Robin, FCFS, Priority ์ค ๋ฌด์์ธ์ง ๋ ผ๋ฆฌ์ ์ผ๋ก ์ถ๋ก ํ๋ค.
- B1-3 ์ฅ๋จ์ ๋ฐ ์ ํฉํ ์ํคํ ์ฒ ๋ถ์: ์ถ๋ก ํ ์ค์ผ์ค๋ง ์๊ณ ๋ฆฌ์ฆ์ ๊ธฐ์ ์ ์ฅ๋จ์ ์ ์์ ํ๊ณ ์ด๋ค ์ฑ๊ฒฉ์ ์๋น์ค(์: ์ค์๊ฐ ์๋ต์ด ์ค์ํ ์น ์๋ฒ vs ์ฒ๋ฆฌ๋์ด ์ค์ํ ๋ฐฐ์น ์๋ฒ ๋ฑ)์ ์ ํฉํ์ง ๋ถ์ํ์ฌ ์ ๋ฆฌํ๋ค.
- ์ ๊ณต๋ ๋ฐ์ด๋๋ฆฌ(Python ๊ธฐ๋ฐ)๋ฅผ ์คํํ ์ ์๋ ๋ฆฌ๋ ์ค ํ๊ฒฝ
- ๋ก์ปฌ ๋๋ ๊ฒฉ๋ฆฌ๋ ํ๊ฒฝ(Docker ์ปจํ ์ด๋ ๋ฑ)์์ ์คํ์ ๊ถ์ฅ
- ๊ณต์ ๋คํธ์ํฌ ํ๊ฒฝ์์๋ ๋ฐฉํ๋ฒฝ ์ค์ ์ ์ ์
- ๐ซ ๋ฐ์ด๋๋ฆฌ ๋์ปดํ์ผ ๋ฐ ๋ฆฌ๋ฒ์ค ์์ง๋์ด๋ง ์๋ ๊ธ์ง
monitor.sh,ps,top,htop,pstree,kill๋ฑ ๋ฆฌ๋ ์ค ํ์ค ๋ช ๋ น์ด ๋ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉ
๐ก (ํด์ค) ์ ์ฝ ์ฌํญ์ ํต์ฌ์ ๋ ๊ฐ์ง๋ค.
- ๐ซ ๊ธ์ง: ๋ฐ์ด๋๋ฆฌ๋ฅผ ๋ฏ์ด๋ณด๊ณ ๋ต์ ์์๋ด๋ ํ์(๋์ปดํ์ผยท๋ฆฌ๋ฒ์ค ์์ง๋์ด๋ง). ์ฆ ์์ค๊ฐ ์๋๋ผ "๋ฐ๊นฅ์์ ๊ด์ฐฐํ ์ฆ๊ฑฐ"๋ง์ผ๋ก ์์ธ์ ์ถ๋ก ํด์ผ ํ๋ค. ์ด ๊ณผ์ ์ ๋์ด๋์ ํ์ต ๊ฐ์น๊ฐ ์ ๋ถ ์ฌ๊ธฐ์ ๋์จ๋ค.
- โ ํ์ฉ/๊ถ์ฅ ๋๊ตฌ: ๋ฆฌ๋ ์ค ํ์ค ๋ช ๋ น์ด. ๋ณ๋์ APMยทํ๋กํ์ผ๋ฌ๋ฅผ ์ค์นํด ์ฐํํ์ง ๋ง๊ณ ,
ps/top/htop/pstree/kill๊ณผ ์ง์ ๋ง๋monitor.sh๋ก ํด๊ฒฐํ๋ผ๋ ์๋ฏธ๋ค.- ํฌํธ 15034 ๊ณ ์ ์ ๋ฐฉํ๋ฒฝ/ํฌํธ ์ถฉ๋ ์ "ํฌํธ๋ฅผ ๋ฐ๊พธ๋" ํํผ๊ฐ ๋ถ๊ฐ๋ฅํ๋ค๋ ๋ป์ด๋ค. ๊ฒฉ๋ฆฌ ํ๊ฒฝ ๊ถ์ฅ์ ์ค์ง์ ์ด์ ์ด๊ธฐ๋ ํ๋ค.
(์๋ฌธ) ์๋๋ ์ ๋ต์ด ์๋๋ผ ์ฐธ๊ณ ์์๋ค. ์ค์ ๋ฌธ๊ตฌ์ ๋์์ธ์ ๋ฌ๋ผ๋ ๋๋ค.
[Bug] ํ๋ก์ธ์ค ์คํ 10๋ถ ํ ๋ฉ๋ชจ๋ฆฌ ๋ณดํธ ์ ์ฑ
์ ์ํ ๋น์ ์ ๊ฐ์ ์ข
๋ฃ
## 1. Description (ํ์ ์ค๋ช
)
`agent-leak-app` ์ดํ๋ฆฌ์ผ์ด์
์ ์คํํ๊ณ ์ฝ 10๋ถ์ด ๊ฒฝ๊ณผํ๋ฉด, ํฐ๋ฏธ๋์
`SELF-TERMINATED` ๋ฉ์์ง๊ฐ ์ถ๋ ฅ๋๋ฉฐ ํ๋ก์ธ์ค๊ฐ ์๊ณ ์์ด ์ข
๋ฃ๋ฉ๋๋ค. ์ ํ๋ฆฌ์ผ์ด์
๋ด๋ถ์ ๋ฉ๋ชจ๋ฆฌ ๋ณดํธ ์ ์ฑ
(MemoryGuard)์ ์ํด ํ๋ก์ธ์ค๊ฐ ๊ฐ์ ์ข
๋ฃ๋๋ ํ์์ด ๋ฐ๋ณต๋ฉ๋๋ค.
## 2. Evidence & Logs (์ฆ๊ฑฐ ์๋ฃ)
`monitor.sh`๋ฅผ ํตํด ์์ง๋ ๊ด์ ๋ก๊ทธ๋ฅผ ๋ถ์ํ ๊ฒฐ๊ณผ, **๋ฉ๋ชจ๋ฆฌ ์ ์ ์จ(MEM)**์ด
์ด๊ธฐ 5%๋์์ ์์ํ์ฌ ์ข
๋ฃ ์ง์ 96%๊น์ง **์ ํ์ ์ผ๋ก ๊ธ๊ฒฉํ ์์น**ํ๋ ํจํด์ด
ํ์ธ๋์์ต๋๋ค. ๋ฐ๋ฉด CPU ์ฌ์ฉ๋ฅ ์ ์์ ์ ์ด์์ต๋๋ค.[ monitor.log ๋ฐ์ดํฐ ๋ฐ์ท ]
[2025-12-30 14:00:00] PROCESS:agent-leak-app CPU:1.2% MEM:5.1% DISK:954G FIREWALL:active
[2025-12-30 14:03:00] PROCESS:agent-leak-app CPU:1.5% MEM:35.4% DISK:954G FIREWALL:active
[2025-12-30 14:06:00] PROCESS:agent-leak-app CPU:1.4% MEM:68.2% DISK:954G FIREWALL:active
[2025-12-30 14:09:00] PROCESS:agent-leak-app CPU:1.3% MEM:89.5% DISK:954G FIREWALL:active
[2025-12-30 14:10:00] PROCESS:agent-leak-app CPU:1.5% MEM:96.8% DISK:954G FIREWALL:active
[ ํ๋ก๊ทธ๋จ ์คํ ๋ก๊ทธ ๋ฐ์ท ]
[CRITICAL] [MemoryGuard] Memory limit exceeded (256MB >= 256MB) / (Recommend Over 256MB)
[CRITICAL] [MemoryGuard] Self-terminating process 12345 to prevent system instability.
>>> [SYSTEM] SELF-TERMINATED (Memory Limit Exceeded) <<<
## 3. Root Cause Analysis (์์ธ ๋ถ์)
ํ์ ๋ถ์: ์ดํ๋ฆฌ์ผ์ด์
๋ก์ง ๋ด๋ถ์์ ์์ฑํ ๋ฐ์ดํฐ๋ฅผ ํ(Heap) ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ํ์ง ์๊ณ
์ง์์ ์ผ๋ก ์๋ ๋ฉ๋ชจ๋ฆฌ ๋์(Memory Leak) ๊ฒฐํจ์ด ์๋ ๊ฒ์ผ๋ก ํ๋จ๋ฉ๋๋ค.
์์คํ
๋์: ๋ฌผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ด MEMORY_LIMIT์ ๋๋ฌํ์, ์ ํ๋ฆฌ์ผ์ด์
๋ด๋ถ์
**MemoryGuard ์ ์ฑ
**์ด ์์คํ
์ ์ฒด ๋ถ์์ ์ ๋ฐฉ์งํ๊ธฐ ์ํด ํด๋น ํ๋ก์ธ์ค๋ฅผ SIGKILL๋ก
๊ฐ์ ์ข
๋ฃ์์ผฐ์ต๋๋ค.
## 4. Workaround & Verification (์กฐ์น ๋ฐ ๊ฒ์ฆ)
์กฐ์น ๋ด์ฉ: .bash_profile ๋ด์ ํ๊ฒฝ๋ณ์ MEMORY_LIMIT ๊ฐ์ ๊ธฐ์กด 256MB์์ 512MB๋ก
์ํฅ ์กฐ์ ํ์ฌ ์์์ ์ผ๋ก ๊ฐ์ฉ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ๋ณดํ์ต๋๋ค.
๊ฒ์ฆ ๊ฒฐ๊ณผ: ์ค์ ๋ณ๊ฒฝ ํ ์ฌ์คํ ๊ฒฐ๊ณผ, ๊ธฐ์กด ์ข
๋ฃ ์์ ์ธ 10๋ถ์ ๋๊ฒจ 30๋ถ ์ด์ ํ๋ก์ธ์ค๊ฐ
์์กดํจ์ ํ์ธํ์ต๋๋ค. ๋ค๋ง, ๊ทผ๋ณธ์ ์ธ ํด๊ฒฐ์ ์ํด์๋ ์์ค ์ฝ๋ ๋ด ๋ถํ์ํ ๋ฐ์ดํฐ๋ฅผ
์ฃผ๊ธฐ์ ์ผ๋ก ์ญ์ (del or pop)ํ๋ ๋ฆฌํฉํ ๋ง์ด ํ์ํฉ๋๋ค.[Bug] CPU ๊ณผ์ ์ ์ ์ํ Watchdog ๋ณดํธ ์กฐ์น ํ๋ก์ธ์ค ์ข
๋ฃ
## 1. Description (ํ์ ์ค๋ช
)
`agent-leak-app` ์คํ ํ ์ผ์ ์๊ฐ์ด ๊ฒฝ๊ณผํ๋ฉด, CPU ์ฌ์ฉ๋ฅ ์ด ๊ธ๊ฒฉํ ์์นํ๊ณ
"[SYSTEM] WATCHDOG: INITIATING EMERGENCY ABORT (SIGTERM)" ๋ฉ์์ง์ ํจ๊ป
ํ๋ก์ธ์ค๊ฐ ์ข
๋ฃ๋ฉ๋๋ค.
## 2. Evidence & Logs (์ฆ๊ฑฐ ์๋ฃ)
- monitor.sh ๊ด์ ๋ก๊ทธ์์ CPU ์ฌ์ฉ๋ฅ ๋ณํ ์ถ์ด (์บก์ฒ/์์น ์ฒจ๋ถ)
- ํ๋ก๊ทธ๋จ ์คํ ๋ก๊ทธ์์ Watchdog ๊ด๋ จ ๋ก๊ทธ ๋ฐ์ท
- top ๋๋ ps ๋ช
๋ น์ด๋ฅผ ํตํ ํ๋ก์ธ์ค๋ณ CPU ์ ์ ์จ ํ์ธ ๊ฒฐ๊ณผ
## 3. Root Cause Analysis (์์ธ ๋ถ์)
- CPU ๋ถํ๊ฐ ๋ด๋ถ Watchdog ์๊ณ์น๋ฅผ ์ด๊ณผํ ์์ธ ๋ถ์
- ๊ณผ์ ์ ๋ฐฉ์ง ์ ์ฑ
์ ๋์ ์๋ฆฌ ์์
## 4. Workaround & Verification (์กฐ์น ๋ฐ ๊ฒ์ฆ)
- CPU_MAX_OCCUPY ํ๊ฒฝ๋ณ์ ์กฐ์ ์ ํ ๋น๊ต (Before & After)
- ์กฐ์ ํ ํ๋ก์ธ์ค ์์กด ์๊ฐ ๋๋ ์ข
๋ฃ ์ฌ๋ถ ๋ณํ ๊ธฐ๋ก[Bug] ๋ฉํฐ์ค๋ ๋ ํ๊ฒฝ์์ ๊ต์ฐฉ์ํ(Deadlock) ๋ฐ์์ผ๋ก ํ๋ก์ธ์ค ๋ฌด์๋ต
## 1. Description (ํ์ ์ค๋ช
)
`agent-leak-app` ์คํ ํ ํ๋ก์ธ์ค๊ฐ ์ข
๋ฃ๋์ง ์๊ณ PID๊ฐ ์ ์ง๋๋,
CPU/๋ฉ๋ชจ๋ฆฌ ๋ณํ๊ฐ ์๊ณ ๋ก๊ทธ ์ถ๋ ฅ๋ ์์ ํ ๋ฉ์ถ ๋ฌด์๋ต ์ํ๊ฐ ์ง์๋ฉ๋๋ค.
## 2. Evidence & Logs (์ฆ๊ฑฐ ์๋ฃ)
- ps -ef | grep agent ๊ฒฐ๊ณผ (PID ์กด์ฌ ํ์ธ)
- top -H ๋๋ ps -L ๊ฒฐ๊ณผ (์ค๋ ๋๋ณ CPU/MEM ๋ณํ ์์ ํ์ธ)
- ํ๋ก๊ทธ๋จ ์คํ ๋ก๊ทธ์ ๋ง์ง๋ง ๊ธฐ๋ก ๋ฐ์ท (WAITING/BLOCKED ๋ก๊ทธ)
## 3. Root Cause Analysis (์์ธ ๋ถ์)
- ๋ง์ง๋ง ๋ก๊ทธ๋ฅผ ๊ทผ๊ฑฐ๋ก ์ค๋ ๋ ๊ฐ ์ํ ์์ ๋๊ธฐ ์ํ ์ถ๋ก
- ์ํธ ๋ฐฐ์ ์ ์ํ ๋๊ธฐ ์๋ฆฌ ์์
## 4. Workaround & Verification (์กฐ์น ๋ฐ ๊ฒ์ฆ)
- MULTI_THREAD_ENABLE ํ๊ฒฝ๋ณ์๋ฅผ false๋ก ๋ณ๊ฒฝํ์ฌ ์ฌ์คํ
- ๋ฐ๋๋ฝ ๋ฐ์ ์ฌ๋ถ ๋น๊ต (Before: true โ Deadlock / After: false โ ์ ์ ๋์)# [Analysis] ๋ก๊ทธ ํจํด ๋ถ์์ ํตํ ์ค์ผ์ค๋ง ์๊ณ ๋ฆฌ์ฆ ์ถ๋ก
## 1. ๋ก๊ทธ ๊ด์ฐฐ ๊ฐ์
`agent-leak-app`์ ์ ์ ์คํ ์ํ์์ ๋ฐ์ํ๋ ์์ปค(Worker) ์ค๋ ๋๋ค์
์์
๋ก๊ทธ๋ฅผ ์์งํ์ฌ, OS ๋๋ ๋ฐํ์์ด ์์
์ ์ฒ๋ฆฌํ๋ ์ค์ผ์ค๋ง ๊ธฐ๋ฒ์
์ญ์ถ์ ํ์ต๋๋ค.
## 2. ์ฆ๊ฑฐ ์๋ฃ
๋ก๊ทธ์ ํ์์คํฌํ์ ์์
์งํ๋ฅ (Progress)์ ๋ถ์ํ ๊ฒฐ๊ณผ, ํ๋์ ์์
์ด
์๋ฃ๋๊ธฐ ์ ์ ๋ค๋ฅธ ์์
์ด ๋ผ์ด๋๋ ํ์์ด ๊ด์ธก๋์์ต๋๋ค.[ Application Log Snapshot ]
[2025-12-30 14:00:00.100] [Thread-A] Task Started. Calculating... (10%)
[2025-12-30 14:00:00.150] [Thread-A] Calculating... (20%)
[2025-12-30 14:00:00.200] [Thread-B] Task Started. Calculating... (10%) <-- A ์ค๋จ, B ์์
[2025-12-30 14:00:00.250] [Thread-B] Calculating... (20%)
[2025-12-30 14:00:00.300] [Thread-C] Task Started. Calculating... (10%) <-- B ์ค๋จ, C ์์
[2025-12-30 14:00:00.350] [Thread-A] Resumed. Calculating... (30%) <-- C ์ค๋จ, A ์ฌ๊ฐ
## 3. ํจํด ๋ถ์ ๋ฐ ๊ฒฐ๋ก
* ์์ฐจ ์ฒ๋ฆฌ ์๋: Thread-A๊ฐ 100% ์๋ฃ๋๊ธฐ ์ ์ Thread-B๊ฐ ์คํ๋์์ผ๋ฏ๋ก,
๋จผ์ ์จ ์์
์ ๋๊น์ง ์ฒ๋ฆฌํ๋ ๋ฐฉ์์ด ์๋๋๋ค.
* ์ฐ์ ์์ ์๋: ํน์ ์ค๋ ๋๊ฐ ์์์ ๋
์ ํ๊ฑฐ๋, ๊ธด๊ธํ๊ฒ ์ฒ๋ฆฌ๋๋ ๊ฒฝํฅ ์์ด
A, B, C๊ฐ ๊ณตํํ๊ฒ ๋๋ ๊ฐ์ง๋ ๋ชจ์ต์ ๋ณด์
๋๋ค.
* ์ต์ข
๊ฒฐ๋ก : ๊ฐ ์ค๋ ๋๊ฐ ์ ํด์ง ์๊ฐ ํ ๋น๋๋งํผ CPU๋ฅผ ์ฌ์ฉํ๊ณ , ์์์ ๋ฐ๋ฉํ๋
๋ผ์ด๋ ๋ก๋น ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ์ถ๋ก ๋ฉ๋๋ค.๐ก (ํด์ค) ์์์์ ๋ฐ๋ณต์ ์ผ๋ก ๋ฑ์ฅํ๋ ํต์ฌ ๋ก๊ทธ ๋ฌธ์์ด์ ๊ทธ๋๋ก ๊ฒ์ ํค์๋๋ก ์ธ ์ ์๋ค.
- OOM:
Memory limit exceeded,MemoryGuard,SELF-TERMINATED- CPU:
WATCHDOG,EMERGENCY ABORT,SIGTERM- Deadlock:
WAITING,BLOCKEDgrep์ผ๋ก ์ด ๋ฌธ์์ด์ ์ก์ ๋ฆฌํฌํธ์ ๋ฐ์ทํ๋ฉด E1-2 / E2-2 / E3-3 ์๊ฑด์ ์ง์ ์ถฉ์กฑํ๋ค.
| ์๊ตฌ์ฌํญ | ํ๋ฉด์ ์ผ๋ก ์ํค๋ ์ผ | ์ค์ ๋ก ํ์ต์ํค๋ ค๋ ๊ฐ๋ | ์ค์ค๋ก ๋ตํด๋ณผ ์ง๋ฌธ |
|---|---|---|---|
| R1-1 (root ์๋ ๊ณ์ ) | ์ผ๋ฐ ์ฌ์ฉ์๋ก ์คํ | ๋ฆฌ๋ ์ค ๊ถํ ๋ชจ๋ธ๊ณผ ์ต์ ๊ถํ ์์น, root๋ก ๋๋ฆฌ๋ ์๋น์ค๊ฐ ์ ์ํํ๊ฐ | ์ด ์ฑ์ด root๋ก ๋์๋ค๋ฉด OOM์ด ๋ฐ์ํ์ ๋ ์์คํ ์ ์ฒด์ ์ด๋ค ์ฐจ์ด๊ฐ ์๊ธฐ๋๊ฐ? |
R1-3 / R1-11 (AGENT_PORT=15034 ๊ณ ์ , 0.0.0.0:15034 ๋ฐ์ธ๋ฉ) |
ํฌํธ๋ฅผ ์ด์ด๋๋ค | ์์ผ ๋ฐ์ธ๋ฉ, 0.0.0.0 vs 127.0.0.1์ ์ฐจ์ด, EADDRINUSE(ํฌํธ ์ถฉ๋), ๋ฐฉํ๋ฒฝ |
0.0.0.0 ๋ฐ์ธ๋ฉ๊ณผ 127.0.0.1 ๋ฐ์ธ๋ฉ์ ๋ณด์์ ๋ฌด์์ด ๋ค๋ฅธ๊ฐ? ํฌํธ๊ฐ ์ด๋ฏธ ์ฐ์ด๊ณ ์์ผ๋ฉด ์ด๋ป๊ฒ ํ์ธํ๋๊ฐ? |
| R1-2ยทR1-4~R1-10 (ํ๊ฒฝ๋ณ์ยท๋๋ ํฐ๋ฆฌยทsecret.key) | ํ๊ฒฝ์ ์ค๋นํ๋ค | ํ๊ฒฝ๋ณ์์ ํ๋ก์ธ์ค ์์, 12-Factor์ ์ธ๋ถ ์ค์ ์ฃผ์ , ํ์ผ ํผ๋ฏธ์ (์กด์ฌ vs ์ฐ๊ธฐ ๊ถํ), ๋ถํธ ์ํ์ค ์ฌ์ ๊ฒ์ฆ(fail-fast) | ์ ์ค์ ์ ์ฝ๋๊ฐ ์๋๋ผ ํ๊ฒฝ๋ณ์๋ก ๋ฐ๋๊ฐ? "๋๋ ํฐ๋ฆฌ๊ฐ ์กด์ฌํ๋ค"์ "์ธ ์ ์๋ค"๋ ์ด๋ป๊ฒ ๋ค๋ฅด๊ฒ ๊ฒ์ฌํ๋๊ฐ? |
R1-7 / R1-8 (MEMORY_LIMIT 50CPU_MAX_OCCUPY 10 |
์ซ์๋ฅผ ๋ฒ์ ์์ ๋ฃ๋๋ค | ์ ๋ ฅ ๊ฒ์ฆ(range validation), ๋ฆฌ์์ค ์ฟผํฐยท์๊ณ๊ฐ ์ค๊ณ, cgroups/ulimit ๊ฐ์ ์ค์ OS ์์ ์ ํ๊ณผ์ ๋น๊ต | ์ค์ ๋ฆฌ๋
์ค๋ ํ๋ก์ธ์ค ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ด๋ป๊ฒ ์ ํํ๋๊ฐ(cgroups, ulimit -v)? ์ฑ ๋ด๋ถ ์ ํ๊ณผ OS ์ ํ ์ค ๋ฌด์์ด ๋ ์ ๋ขฐํ ์ ์๋๊ฐ? |
| R2-1 (monitor.sh๋ก ๋ฉ๋ชจ๋ฆฌ ์ฆ๊ฐ ๊ด์ธก) | ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฃผ๊ธฐ์ ์ผ๋ก ์ฐ๋๋ค | ์๊ณ์ด ๊ด์ (polling)์ ์ํ๋ง ์ฃผ๊ธฐ, ps -o rss,vsz,%mem์ ์๋ฏธ ์ฐจ์ด, RSS/VSZ/ํ์ ๊ตฌ๋ถ |
%MEM๊ณผ RSS๋ ๋ฌด์์ด ๋ค๋ฅธ๊ฐ? 3๋ถ ๊ฐ๊ฒฉ ์ํ๋ง์ผ๋ก ๋์น๋ ์ฅ์ ๋ ๋ฌด์์ธ๊ฐ? |
| R2-2 (MemoryGuard ๋ก๊ทธ ์๋ณ) | ์ข ๋ฃ ๋ก๊ทธ๋ฅผ ์ฐพ๋๋ค | ๋ฉ๋ชจ๋ฆฌ ๋์์ ๋ฉ์ปค๋์ฆ(ํ์ ์๊ณ ํด์ ์ ํจ), ๊ฐ๋น์ง ์ปฌ๋ ์ ์ ํ๊ณ(์ฐธ์กฐ๊ฐ ๋จ์ผ๋ฉด GC๋ ๋ชป ์ง์ด๋ค), ์ ํ๋ฆฌ์ผ์ด์ ๋ ๋ฒจ ๋ณดํธ ์ ์ฑ vs ์ปค๋ OOM Killer | ํ์ด์ฌ์ฒ๋ผ GC๊ฐ ์๋ ์ธ์ด์์๋ ๋ฉ๋ชจ๋ฆฌ ๋์๊ฐ ์ ๋ฐ์ํ๋๊ฐ? ์ปค๋ OOM Killer๋ ๋ฌด์์ ๊ทผ๊ฑฐ๋ก ํฌ์์๋ฅผ ๊ณ ๋ฅด๋๊ฐ(oom_score)? |
R2-3 (MEMORY_LIMIT Before & After) |
์๊ณ๊ฐ์ ์ฌ๋ ค๋ณธ๋ค | ์ฆ์ ์ํ์ ๊ทผ๋ณธ ํด๊ฒฐ์ ๊ตฌ๋ถ, ํต์ ๋ณ์ธ ํ๋๋ง ๋ฐ๊พธ๋ ์คํ ์ค๊ณ, ํ๊ท ๊ฒ์ฆ | ํ๋๋ฅผ 512MB๋ก ์ฌ๋ฆฌ๋ฉด ์ฅ์ ๊ฐ "ํด๊ฒฐ"๋ ๊ฒ์ธ๊ฐ, "์ง์ฐ"๋ ๊ฒ์ธ๊ฐ? ๋์์จ์ด ์ผ์ ํ๋ค๋ฉด ์ ์ข ๋ฃ ์์ ์ ๊ณ์ฐํ ์ ์๋๊ฐ? |
| R3-1 (์ ์ฒด ๋ถํ vs ํน์ ํ๋ก์ธ์ค) | CPU ๊ทธ๋ํ๋ฅผ ๋ณธ๋ค | load average์ %CPU์ ์ฐจ์ด, ์ฝ์ด ์์ ๋ฐ๋ฅธ 100%โ ํด์, top์ Irix/Solaris ๋ชจ๋ |
top์์ 400%๊ฐ ์ฐํ๋ ๊ฒ์ ๋ฌด์จ ๋ป์ธ๊ฐ? load average 4.0์ 8์ฝ์ด์ 2์ฝ์ด์์ ๊ฐ๊ฐ ์ด๋ค ์ํ์ธ๊ฐ? |
| R3-2 (Watchdog = ๋ณดํธ ์กฐ์น์์ ์ ์ฆ) | ์ข ๋ฃ ์์ธ์ ๋ฐํ๋ค | ์๊ทธ๋ ์๋ฏธ๋ก : SIGTERM(์ ์ ์ข
๋ฃ ์์ฒญ, ํธ๋ค๋ง ๊ฐ๋ฅ) vs SIGKILL(๋ฌด์กฐ๊ฑด ์ข
๋ฃ), watchdog/์ํท ๋ธ๋ ์ด์ปค ํจํด |
์ OOM์ SIGKILL์ด๊ณ Watchdog์ SIGTERM์ธ๊ฐ? SIGTERM์ ๋ฐ์ ํ๋ก์ธ์ค๊ฐ ํ ์ ์๋ ๋ง์ง๋ง ์ผ์ ๋ฌด์์ธ๊ฐ? |
R3-3 (CPU_MAX_OCCUPY Before & After) |
์๊ณ๊ฐ์ ์กฐ์ ํ๋ค | CPU ๊ณผ์ ์ ๊ฐ ์์คํ ์ง์ฐ์ ๋ง๋๋ ์๋ฆฌ(์ค์ผ์ค๋ฌ ํ ๋๊ธฐ, ์ปจํ ์คํธ ์ค์์น ๋น์ฉ, starvation) | ํ ํ๋ก์ธ์ค๊ฐ CPU๋ฅผ ๋ ์ ํ๋ฉด ๋ค๋ฅธ ํ๋ก์ธ์ค์ ์๋ต ์ง์ฐ์ ์ ์๊ธฐ๋๊ฐ? ์๊ณ๊ฐ์ 100%๋ก ์ฌ๋ฆฌ๋ฉด ๋ฌด์์ด ๋ ๋๋น ์ง๋๊ฐ? |
| R4-1 (PID ์กด์ฌ + ๋ณํ ์์) | ๋ฉ์ถ ๊ฑธ ํ์ธํ๋ค | ํ๋ก์ธ์ค ์ํ ์ฝ๋: R/S/D(uninterruptible sleep)/Z/T, "์ด์์์"๊ณผ "์ผํ๊ณ ์์"์ ์ฐจ์ด, ๋ฌด์๋ต ์ง๋จ ์ ์ฐจ |
ps STAT ์ด์ด S์ D์ผ ๋ ๋์์ด ์ด๋ป๊ฒ ๋ฌ๋ผ์ง๋๊ฐ? ํ๋ก์ธ์ค๊ฐ CPU 0%์ธ๋ฐ ์ ์์ธ ๊ฒฝ์ฐ์ ๋ฐ๋๋ฝ์ธ ๊ฒฝ์ฐ๋ฅผ ๋ฌด์์ผ๋ก ๊ตฌ๋ถํ๋๊ฐ? |
| R4-2 (์ค๋ ๋ ๊ฐ ์ํ ๋๊ธฐ ์ฆ๋ช ) | ๋ง์ง๋ง ๋ก๊ทธ๋ฅผ ์ฝ๋๋ค | ๊ต์ฐฉ์ํ 4๋ ์กฐ๊ฑด(์ํธ ๋ฐฐ์ ยท์ ์ ๋๊ธฐยท๋น์ ์ ยท์ํ ๋๊ธฐ), ๋ฎคํ
์ค/๋ฝ ํ๋ ์์, ์ค๋ ๋ ๋จ์ ๊ด์ฐฐ(top -H, ps -L, /proc/<pid>/task) |
๋ก๊ทธ์์ AโB, BโA ์ํ ์์กด์ ์ด๋ป๊ฒ ์ฝ์ด๋ด๋๊ฐ? 4๋ ์กฐ๊ฑด ์ค ํ๋๋ง ๊นจ๋ฉด ๋ฐ๋๋ฝ์ด ์ฌ๋ผ์ง๋ ์ด์ ๋? |
R4-3 (MULTI_THREAD_ENABLE ์ฌํ/ํํผ) |
์ค์์น๋ฅผ ๋๋ค | ์ฌํ ๊ฐ๋ฅ์ฑ(reproducibility)์ด ๊ณง ์ง๋จ์ ์ฆ๊ฑฐ, ๋์์ฑ ๋ฒ๊ทธ์ ๋น๊ฒฐ์ ์ฑ, ๋จ์ผ ์ค๋ ๋ ์ ํ์ด "ํด๊ฒฐ"์ด ์๋ ์ด์ | ์ค๋ ๋๋ฅผ ๋๋ฉด ๋ฐ๋๋ฝ์ด ์ฌ๋ผ์ง๋๋ฐ, ์ ์ด๊ฒ์ ๊ทผ๋ณธ ํด๊ฒฐ์ด๋ผ ๋ถ๋ฅด๋ฉด ์ ๋๋๊ฐ? ์ฝ๋๋ฅผ ๊ณ ์น๋ค๋ฉด ๋ฝ ์์๋ฅผ ์ด๋ป๊ฒ ์ ํ๊ฒ ๋๊ฐ? |
| D1-D2 / E1-E3 (Issue ํ ํ๋ฆฟยท์ฆ๊ฑฐ ์๊ฑด) | ๋ฌธ์๋ฅผ ํ์์ ๋ง์ถ๋ค | ๊ธฐ์ ์ปค๋ฎค๋์ผ์ด์ : ํ์โ์ฆ๊ฑฐโ์์ธโ์กฐ์น์ ์ธ๊ณผ ์ฌ์ฌ, ์กํ์์น, ์ฌํ ์ ์ฐจ์ ์๊ฒฐ์ฑ, ์ฃผ์ฅ๊ณผ ์ฆ๊ฑฐ์ ๋ถ๋ฆฌ | ๋ด ๋ฆฌํฌํธ๋ง ์ฝ์ ๋๋ฃ๊ฐ ๋ด ํ๊ฒฝ ์์ด ๊ฐ์ ์ฅ์ ๋ฅผ ์ฌํํ ์ ์๋๊ฐ? "~์ธ ๊ฒ ๊ฐ๋ค"๋ฅผ "~๋ผ๋ ๋ก๊ทธ๊ฐ ์ด๋ฅผ ๋ท๋ฐ์นจํ๋ค"๋ก ๋ฐ๊ฟ ์ผ๋๊ฐ? |
| B1-1~B1-3 (์ค์ผ์ค๋ง ์ญ์ถ๋ก ) | ๋ก๊ทธ ํ์์คํฌํ๋ฅผ ๋ณธ๋ค | CPU ์ค์ผ์ค๋ง ์๊ณ ๋ฆฌ์ฆ(Round-Robin / FCFS / Priority), ํ์ ์ฌ๋ผ์ด์ค์ ์ ์ (preemption), ์ปจํ ์คํธ ์ค์์น, ์ฒ๋ฆฌ๋ vs ์๋ต์๊ฐ ํธ๋ ์ด๋์คํ | 50ms ๊ฐ๊ฒฉ ๊ต์ฒด๋ ํ์ ํํ ์ด 50ms๋ผ๋ ๋ป์ธ๊ฐ? Round-Robin์ ํํ ์ ๋๋ฆฌ๋ฉด ์น ์๋ฒ์ ๋ฐฐ์น ์๋ฒ์ ๊ฐ๊ฐ ์ด๋ค ์ํฅ์ด ์๋๊ฐ? |
| ์ ์ฝ: ๋ฆฌ๋ฒ์ค ์์ง๋์ด๋ง ๊ธ์ง | ๋ฐ์ด๋๋ฆฌ๋ฅผ ์ ๋ฏ๋๋ค | ๋ธ๋๋ฐ์ค ๊ด์ธก ๊ธฐ๋ฐ ์ถ๋ก , ๊ด์ธก ๊ฐ๋ฅ์ฑ(observability), ๊ฐ์ค-๊ฒ์ฆ ์ฌ์ดํด | ์์ค๋ฅผ ๋ชป ๋ณผ ๋ ๋ด๊ฐ ์ธ ์ ์๋ ๊ด์ธก ์ฐฝ๊ตฌ๋ ๋ฌด์์ธ๊ฐ(/proc, ๋ก๊ทธ, ์์คํ
์ฝ, ๋ฆฌ์์ค ์งํ)? |
| ์ ์ฒด (์ด์ ๊ด์ ) | 3๊ฑด ๋ฆฌํฌํธ๋ฅผ ๋ธ๋ค | ์ฌํ ๋ถ์(Post-mortem)๊ณผ ์ฌ๊ณ ๋์ ์ ์ฐจ, "์ฌ๋ถํ ๋จผ์ "๊ฐ ์ ์ต์ ์ธ์ง, ์ ์ ํ์ง(์๋ฆผ ์๊ณ์น) ์ค๊ณ | ์ฅ์ ๋ฐ์ ์ ์ ๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ํ์งํ๋ ค๋ฉด monitor.sh๋ฅผ ์ด๋ป๊ฒ ๊ฐ์ ํด์ผ ํ๋๊ฐ(์ฆ๊ฐ ์ถ์ธ ๊ธฐ๋ฐ ๊ฒฝ๋ณด)? |
๐ก (ํด์ค) ํ๊ฐ ์ฒดํฌ๋ฆฌ์คํธ(
checklists_md/troubleshooting_oom_cpu_deadlock.md)์ "3. ํต์ฌ ๊ฐ๋ ์ดํด" / "4. ํ์ฅ ์ฌ๊ณ ๋ฐ ํธ๋ฌ๋ธ์ํ " ํญ๋ชฉ์ด ์ ํ์ "์ค์ค๋ก ๋ตํด๋ณผ ์ง๋ฌธ" ์ด๊ณผ ๊ฑฐ์ 1:1๋ก ๋์ํ๋ค. ํนํ ๋ค์ 4๊ฐ๋ ๋ฆฌํฌํธ ๋ณธ๋ฌธ์ ๋ต์ด ์์ผ๋ฉด ๊ตฌ์ ๋ก๋ผ๋ ๋ฐ๋์ ๋ตํด์ผ ํ๋ค.
- OOMยทCPU SpikeยทDeadlock ์ค ์ค์ ์๋น์ค์์ ๊ฐ์ฅ ์น๋ช ์ ์ธ ๊ฒ์ ๋ฌด์์ด๋ฉฐ ๊ทธ ์ด์ ์ ๊ทผ๋ณธ ์๋ฐฉ์ฑ ์?
- OOM๊ณผ Deadlock์ด ๋์์ ๋ฐ์ํ๋ค๋ฉด ์ด๋ค ์์๋ก ํธ๋ฌ๋ธ์ํ ํ๊ณ , ์ฐ์ ์์ ํ๋จ ๊ทผ๊ฑฐ๋?
- ํ๊ฒฝ๋ณ์ ์กฐ์ ์ ์์ ์กฐ์น์๋ค. ์์ค ์ฝ๋๋ฅผ ๊ณ ์น ์ ์๋ค๋ฉด ์ฅ์ ์ ํ๋ณ๋ก ์ด๋ค ์ฝ๋ ๋ ๋ฒจ ๊ฐ์ ์ ํ๊ฒ ๋๊ฐ?
- ์ด ๋ฏธ์ ์ ์ฒ์๋ถํฐ ๋ค์ ํ๋ค๋ฉด ์ด๋ค ์ ์ ๋ค๋ฅด๊ฒ ์ ๊ทผํ๊ฒ ๋๊ฐ?
-
"๋ฆฌํฌํธ 3๊ฑด"์ 3๊ฐ์ ๋ ๋ฆฝ ๋ฌธ์๋ค. ํ๋์ ๋ฌธ์์ ์ธ ์ฅ์ ๋ฅผ ๋ชฐ์ ์ฐ๋ฉด D1์ "๊ฐ๊ฐ์ ๋ํด ์์ฑ๋" ์กฐ๊ฑด๊ณผ ์ด๊ธ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ฐ ๋ฆฌํฌํธ๊ฐ D1-1~D1-5(ํ์/์ฆ๊ฑฐ/๊ทผ๋ณธ์์ธ/์กฐ์น/๊ฒฐ๊ณผํ์ธ) 5๊ฐ ํญ๋ชฉ์ ์ ๋ถ ๊ฐ์ ธ์ผ ํ๋ค โ ์กฐ์น๋ง ์ฐ๊ณ "๊ฒฐ๊ณผ ํ์ธ(Before & After)"์ ๋น ๋จ๋ฆฌ๋ ๊ฒฝ์ฐ๊ฐ ๊ฐ์ฅ ํํ๋ค.
-
OOM์ "์ต์ 2ํ ์คํ"์ด ๋ช ์๋์ด ์๋ค(E1-3).
MEMORY_LIMIT๋ณ๊ฒฝ ์ 1ํ, ๋ณ๊ฒฝ ํ 1ํ์ ์คํ ๋ก๊ทธ๊ฐ ๊ฐ๊ฐ ๋จ์ ์์ด์ผ ํ๋ค. ๋ณ๊ฒฝ ํ ํ ๋ฒ๋ง ๋๋ฆฌ๊ณ "์ ์๋ ์ด๋ฌ๋ค"๊ณ ์์ ๋ง ํ๋ฉด ์ฆ๊ฑฐ ์๊ฑด ๋ฏธ๋ฌ์ด๋ค. -
CPU ์ผ์ด์ค์ ์ฑ๊ณต ์กฐ๊ฑด์ "์ข ๋ฃ๋จ"์ด ์๋๋ค. R3-3์ "ํ๋ก์ธ์ค ์ข ๋ฃ ์ฌ๋ถ ๋๋ ์์กด ์๊ฐ ๋ณํ"๋ฅผ ์๊ตฌํ๋ค. ์๊ณ์น๋ฅผ ์ฌ๋ ค์ ์์ ์ข ๋ฃ๋์ง ์๋ ๊ฒฐ๊ณผ๋ ์ ๋นํ After ๊ฒฐ๊ณผ๋ค. ๋ฐ๋๋ก "After์๋ ๋๊ฐ์ด ์ฃฝ์๋ค"๋ก ๋๋ด๋ฉด ๋น๊ต๊ฐ ์ฑ๋ฆฝํ์ง ์๋๋ค.
-
Deadlock์๋ ์ข ๋ฃ ๋ก๊ทธ๊ฐ ์๋ค. OOM/CPU์ ๋ฌ๋ฆฌ ํ๋ก์ธ์ค๊ฐ ์ด์ ์์ผ๋ฏ๋ก
SELF-TERMINATED๋ฅ ๋ฌธ์์ด์ ์ฐพ์ ํค๋งค๋ฉด ์ ๋๋ค. ์ฆ๊ฑฐ๋ "PID๋ ์๋๋ฐ(E3-1) ์์น๊ฐ ๋ฉ์ท๊ณ (E3-2) ๋ก๊ทธ๊ฐ ๊ทธ ์ง์ ์์ ๋๊ฒผ๋ค(E3-3)" ๋ ๋ถ์ฌ(ไธๅจ)์ ์ฆ๋ช ์ด๋ค. -
Deadlock์ ํ๋ก์ธ์ค๊ฐ ์๋๋ผ ์ค๋ ๋ ๋จ์๋ก ๋ด์ผ ํ๋ค.
ps -ef๋ ๊ธฐ๋ณธtop๋ง์ผ๋ก๋ "CPU 0%"๊น์ง๋ฐ์ ๋ชป ๋ณธ๋ค. E3-2๊ฐ ๊ตณ์ดtop -H๋๋ps -L์ ์ง์ ํ ์ด์ ๊ฐ ์ฌ๊ธฐ ์๋ค โ ์ค๋ ๋๋ณ๋ก ๊ฐ๊ฐ ๋ฉ์ถฐ ์์์ ๋ณด์ฌ์ผ ์ํ ๋๊ธฐ ์ถ๋ก (E3-4)์ ๊ทผ๊ฑฐ๊ฐ ๋๋ค. -
์ฌ์ ์ค๋น 11๊ฐ ์กฐ๊ฑด์ "์ถฉ์กฑ๋์ง ์์ผ๋ฉด ๋ถํธ ์ํ์ค์์ ์๋์ผ๋ก ์คํจ ์ฒ๋ฆฌ๋๋ค". ์ฆ ์คํ์ด ์ ๋๋ ๊ฒ์ด ๋ฒ๊ทธ๊ฐ ์๋๋ผ ๋ช ์ธ๋๋ก์ ๋์์ด๋ค.
AGENT_PORT๋ 15034 ๊ณ ์ ์ด๋ผ ํฌํธ๋ฅผ ๋ฐ๊ฟ ํํผํ ์ ์๊ณ ,secret.key๋ ํ์ผ ์กด์ฌ๋ฟ ์๋๋ผ ๋ด์ฉ์ด ์ ํํagent_api_key_test์ฌ์ผ ํ๋ค.AGENT_LOG_DIR๋ ์กด์ฌ๋ง์ผ๋ก ๋ถ์กฑํ๊ณ ์ฐ๊ธฐ ๊ถํ๊น์ง ํ์ํ๋ค. -
MEMORY_LIMIT๋ 50512,100 ๋ฒ์๋ฅผ ๋ฒ์ด๋ ์ ์๋ค. ์์ ๋ฆฌํฌํธ๊ฐ "256MB โ 512MB"๋ก ์ฌ๋ฆฌ๋ ์ด์ ๊ฐ ์ด๊ฒ์ด๋ค. 512๋ฅผ ๋๊ธฐ๋ After ์คํ์ ์ ์ด์ ๋ถํธ์์ ๋งํ๋ค.CPU_MAX_OCCUPY๋ 10 -
๋ฐ์ด๋๋ฆฌ ๋์ปดํ์ผยท๋ฆฌ๋ฒ์ค ์์ง๋์ด๋ง์ ๋ช ์์ ๊ธ์ง๋ค. ์ฝ๋๋ฅผ ์ด์ด ์์ธ์ ํ์ธํ๊ณ ๊ทธ๊ฒ์ "๋ถ์"์ผ๋ก ์ ์ถํ๋ฉด ์ ์ฝ ์๋ฐ์ด๋ค. ๋ชจ๋ ๊ทผ๊ฑฐ๋ ๊ด์ ๋ฐ์ดํฐยท๋ก๊ทธยทํ์ค ๋ฆฌ๋ ์ค ๋ช ๋ น์ด ์ถ๋ ฅ์์ ๋์์ผ ํ๋ค.
๐ก (ํด์ค) ํ์ผ๋ช ์ฃผ์: ์ ๊ณต ๋ฐ์ดํฐํ์ผ์
agent-app-leak.zip(๋ฐ์ด๋๋ฆฌagent-app-leak-x86/agent-app-leak-arm64)์ด์ง๋ง, ์๊ตฌ์ฌํญ ๋ณธ๋ฌธ๊ณผ ์์ ๋ก๊ทธ์์ ํ๋ก์ธ์ค๋agent-leak-app์ผ๋ก ํ๊ธฐ๋๋ค. ์๋ฌธ์ ๋ ํ๊ธฐ๊ฐ ์์ฌ ์์ผ๋ฏ๋ก, ๋ฆฌํฌํธ์์๋ ์ค์ ์คํ ํ๊ฒฝ์์ps์ ์ฐํ๋ ์ด๋ฆ์ ๊ธฐ์ค์ผ๋ก ์ฐ๊ณ ํ์ํ๋ฉด ๊ฐ์ฃผ๋ก ๋ฐํ๋๋ ํธ์ด ์์ ํ๋ค. (์ด ๋ถ์ผ์น๋ PDF ์๋ฌธ ๊ทธ๋๋ก์ด๋ฉฐ, ์ด๋ ์ชฝ์ด ์ ๋ต์ธ์ง PDF๋ ๋ช ์ํ์ง ์๋๋ค.)
์ ๊ฒ ๋ฐฉ์: ์ ์ฅ์์ ์ค์ ์์คยท์ฆ๊ฑฐ ํ์ผ์ ๋ช ์ธ์ ์๊ตฌ์ฌํญ ID ์ 1:1 ๋์กฐ. ํ์ ๊ทผ๊ฑฐ๋ ์ ์ฅ์ ๋ฃจํธ ๊ธฐ์ค ์๋๊ฒฝ๋ก๋ก ๋ช ์. README ์ ์ฃผ์ฅ์ด ์๋๋ผ
evidence/์๋ณธ๊ณผsrc/์คํฌ๋ฆฝํธ๋ฅผ ์ง์ ์ด์ด ํ์ธํ๋ค.
์ข ํฉ ํ์ : ์ถฉ์กฑ โ ํ์ 25๊ฐ ์ค ์ถฉ์กฑ 24 / ๋ถ๋ถ 1 / ๋ฏธ์ถฉ์กฑ 0 / ๋ก์ปฌ๊ฒ์ฆ๋ถ๊ฐ 0 (๋ณด๋์ค 4๊ฐ: ์ถฉ์กฑ 4 / ๋ถ๋ถ 0 / ๋ฏธ์ถฉ์กฑ 0)
ํน๊ธฐ ์ฌํญ: evidence/ ์ ๋ก๊ทธ๋ ์ค์ธก ์ฐ์ถ๋ฌผ์ด๋ค. evidence/oom_monitor.log:8 ์ด ๊ธฐ๋กํ ๋ฐ์ด๋๋ฆฌ ํด์ md5 0fb02e12554328b32e6e1adac861630e ๊ฐ ์ ์ฅ์์ bin/agent-leak-app ์ค์ ํด์์ ์ผ์นํจ์ ํ์ธํ๋ค(๋ณธ ์ ๊ฒ์์ md5sum ์คํ). ์ฆ ๋ฆฌํฌํธ๊ฐ ์ธ์ฉํ PIDยทํ์์คํฌํยท์์น๋ ์ด ์ ์ฅ์์ ๋ค์ด ์๋ ๋ฐ๋ก ๊ทธ ๋ฐ์ด๋๋ฆฌ๋ฅผ ๋๋ ค ์ป์ ๊ฐ์ด๋ค.
| ID | ์๊ตฌ์ฌํญ (์์ฝ) | ํ์ | ๊ทผ๊ฑฐ / ๋น๊ณ |
|---|---|---|---|
| R1 | ์ฌ์ ์ค๋น 11๊ฐ ์กฐ๊ฑด ์ถฉ์กฑ ์ํ๋ก ์ฑ ๋ถํ | โ ์ถฉ์กฑ | evidence/oom_app.log:34-49 โ ๋ถํธ ์ํ์ค [1/6]~[6/6] ์ ๋ถ [OK] + All Boot Checks Passed! / Agent READY. ๋์ผ ๋ธ๋ก์ด evidence/cpu_app.logยทevidence/deadlock_app.log ์๋ ์์ |
| R1-1 | root ์๋ ์ผ๋ฐ ์ฌ์ฉ์๋ก ์คํ | โ ์ถฉ์กฑ | evidence/oom_app.log:36 โ Running as service user 'ashofrondol' (uid=1000). ๊ณ์ ์์ฑ์ src/03_users_and_groups.sh |
| R1-2 | AGENT_HOME ์ค์ |
โ ์ถฉ์กฑ | src/05_env_and_keyfile.sh:34 / ์์ง ํ๊ฒฝ์ evidence/oom_monitor.log:11 ํค๋์ ๋ช
์ |
| R1-3 | AGENT_PORT=15034 ๊ณ ์ |
โ ์ถฉ์กฑ | src/05_env_and_keyfile.sh:35, src/monitor.sh:13, ๋ถํธ ๋ก๊ทธ evidence/oom_app.log:41-42 (Port 15034 is available) |
| R1-4 | AGENT_UPLOAD_DIR ์ค์ + ๋๋ ํฐ๋ฆฌ ์์ฑ |
โ ์ถฉ์กฑ | src/05_env_and_keyfile.sh:36 + ์ค์ ์์ฑ src/04_directories_and_acl.sh:29 |
| R1-5 | AGENT_KEY_PATH=$AGENT_HOME/api_keys (๊ฒฝ๋ก ์กด์ฌ) |
โ ์ถฉ์กฑ | src/05_env_and_keyfile.sh:37 + src/04_directories_and_acl.sh:30. B1-1 ์ "ํ์ผ ๊ฒฝ๋ก" โ B1-2 ์ "๋๋ ํฐ๋ฆฌ" ๋ณ๊ฒฝ์ ์คํฌ๋ฆฝํธ ์ฃผ์(src/05_env_and_keyfile.sh:7-9)์์ ๋ช
์์ ์ผ๋ก ์ฒ๋ฆฌ |
| R1-6 | AGENT_LOG_DIR ์กด์ฌ + ์ฐ๊ธฐ ๊ถํ |
โ ์ถฉ์กฑ | src/04_directories_and_acl.sh:33,44,56-57 (770 + default ACL), ๋ถํธ ๋ก๊ทธ evidence/oom_app.log:44-45 (Log directory is writable: โฆ). src/monitor.sh:145-152 ๋ ์กด์ฌยท์ฐ๊ธฐ ๊ถํ์ ๋ฐ๋ก ๊ฒ์ฌ |
| R1-7 | MEMORY_LIMIT ์ ์ 50~512 |
โ ์ถฉ์กฑ | src/05_env_and_keyfile.sh:44 (512). ์คํ์ ์ด ๊ฐ 100 / 256 / 512 ์ ๋ถ ๋ฒ์ ๋ด โ evidence/oom_monitor.log:311-315 |
| R1-8 | CPU_MAX_OCCUPY ์ ์ 10~100 |
โ ์ถฉ์กฑ | src/05_env_and_keyfile.sh:45 (10). ์คํ๊ฐ 95/80/60/50/10 ์ ๋ถ ๋ฒ์ ๋ด โ evidence/cpu_monitor.log:286-292 |
| R1-9 | MULTI_THREAD_ENABLE true/false |
โ ์ถฉ์กฑ | src/05_env_and_keyfile.sh:46, Before=true / After=false ์์ชฝ ์ค์ธก โ evidence/deadlock_monitor.log:274-302 |
| R1-10 | secret.key ๋ด์ฉ = agent_api_key_test |
โ ์ถฉ์กฑ | src/05_env_and_keyfile.sh:52-57 (์์ฑยท๊ถํ 640), ๋ถํธ ๋ก๊ทธ evidence/oom_app.log:39-40 โ Verified 'secret.key' with correct key string. |
| R1-11 | 0.0.0.0:15034 ๋ฐ์ธ๋ฉ ๊ฐ๋ฅ |
๐ก ๋ถ๋ถ ์ถฉ์กฑ | ๊ฐ์ ๊ทผ๊ฑฐ๋ ์ถฉ๋ถํ๋ค โ ๋ถํธ [4/6] Checking Port Availability [OK](evidence/oom_app.log:41-42), Agent listening at port 15034(evidence/oom_app.log:51), monitor.sh ์ LISTEN ๊ฒ์ฌ ํต๊ณผ(evidence/oom_monitor.log:45, ๊ตฌํ์ src/monitor.sh:57-67), ๋ฐฉํ๋ฒฝ ์์ธ src/02_firewall_allowlist.sh:33. ๋ค๋ง ๋ฐ์ธ๋ฉ ์ฃผ์๊ฐ 0.0.0.0 ์ธ์ง 127.0.0.1 ์ธ์ง ๊ตฌ๋ถํด ์ฃผ๋ ์บก์ฒ(ss -tlnp ๋ฑ)๊ฐ evidence ์ ์ฒด์ 0๊ฑด์ด๊ณ , ๋จ์ ์๋ ์ ์ ์๋๋ curl http://127.0.0.1:15034 ๋ฟ์ด๋ค(evidence/deadlock_ps_top.txt:81-90). [2026-09-21 ๋ณด์] src/experiments/lib_experiment.sh ์ _snapshot_bind_addr() ๊ฐ ์ฑ ๊ธฐ๋ ์งํ ss -tlnp | grep 15034 ๋ฅผ *_ps_top.txt ์ ๋จ๊ธฐ๋๋ก ๋ฐฐ์ ๋๋ค. ์ ์ถ๋ณธ evidence/ ๋ ๊ทธ ์ด์ ์คํ์ด๋ผ ํ์ ์ ๊ทธ๋๋ก ๐ก ์ด๊ณ , ๋ค์ ์คํ๋ถํฐ evidence_live/*_ps_top.txt ์ ์ฃผ์ ์ฆ๊ฑฐ๊ฐ ์๋์ผ๋ก ์์ธ๋ค |
| R2 | ๋ฉ๋ชจ๋ฆฌ ๋์ ์์ธ ๊ท๋ช ๋ฐ ๋ฆฌํฌํ | โ ์ถฉ์กฑ | reports/01_oom_report.md 361์ค โ Description/Evidence/RCA/Workaround 4๋จ ์๋น |
| R2-1 | monitor.sh ๋ก ๋์ ํ๋ก์ธ์ค ๋ฌผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ ์ฆ๊ฐ ๊ด์ธก |
โ ์ถฉ์กฑ | evidence/oom_monitor.log:155-164 โ monitor.sh ๊ฐ ์ง์ append ํ ๊ด์ ๋ผ์ธ PROC_RSS:42.7MB โ 242.7MB(27์ด). ๊ณ ํด์๋ ๊ณ์ด 17.7 โ 267.7MB ๋ evidence/oom_monitor.log:227-236. SYS_MEM(37.4โ37.8%) ์ด ์๋๋ผ PROC_RSS ๊ฐ ๊ทผ๊ฑฐ์์ ๋ช
์(reports/01_oom_report.md:33-43) โ ๋ช
์ธ ํด์ค์ด ๊ฒฝ๊ณ ํ ํจ์ ์ ์ ๋ฉด์ผ๋ก ๋ค๋ฃธ. ์์ง ๋ช
๋ น๋ ํค๋์ ๋ณด์กด(evidence/oom_monitor.log:18-24, while :; do bash src/monitor.sh; sleep 3; done โ ์คํฌ๋ฆฝํธ ๋ฌด์์ ) |
| R2-2 | MemoryGuard ๊ฐ์ ์ข ๋ฃ ํต์ฌ ๋ก๊ทธ ์๋ณ | โ ์ถฉ์กฑ | evidence/oom_app.log:74-75 โ [CRITICAL] [MemoryGuard] Memory limit exceeded (275MB >= 256MB) + Self-terminating process 2738539. ๋ฆฌํฌํธ๋ PDF ์์์ SELF-TERMINATED ๋ฐฐ๋๊ฐ ์ด ๋ฐ์ด๋๋ฆฌ์ ์์์ ์ค์ธก์ผ๋ก ์ ์ (reports/01_oom_report.md:27) โ ์์ ๋ฌธ์์ด ๋ฒ ๊ปด ์ฐ๊ธฐ๋ฅผ ํ์ง ์์๋ค |
| R2-3 | MEMORY_LIMIT ์กฐ์ โ ๋ ์ค๋ ์์กด, Before & After |
โ ์ถฉ์กฑ | Before 256 (09:02:36~, 0m34s ์ฌ๋ง) / After 512 (09:03:11~, 3m00s ์์กด) ๊ฐ๊ฐ ๋ณ๋ PIDยทํ์์คํฌํ๋ก 2ํ ์คํ โ evidence/oom_monitor.log:227-237 vs 239-294. ์ฌ๊ธฐ์ "512 ๋ ๋ ๋ฆ๊ฒ ์ฃฝ๋ ๊ฐ์ด ์๋๋ผ ์ฅ์ ๊ฐ ์ฌํ๋์ง ์๋ ๊ฐ"์์ ์ค์ค๋ก ๊ฐํํ๊ณ , 100MB(13์ด) โ 256MB(34์ด) ๋์กฐ๋ก "์์กด ์ฐ์ฅ"์ ๋ณ๋ ์
์ฆ(evidence/oom_monitor.log:307-319, ์๋ณธ ์ข
๋ฃ ์์ฝ :337-356). ๋ช
์ธ๊ฐ ์๊ตฌํ ๊ฒ๋ณด๋ค ํ ๋จ๊ณ ๊น๋ค |
| R3 | CPU ๊ณผ์ ์ ๋ถ์ ๋ฐ ๋ฆฌํฌํ | โ ์ถฉ์กฑ | reports/02_cpu_report.md 352์ค โ 4๋จ ๊ตฌ์กฐ ์๋น |
| R3-1 | ์์คํ ์ ์ฒด๊ฐ ์๋ ํน์ ํ๋ก์ธ์ค์ CPU ์์น ๊ตฌ๊ฐ ์๋ณ | โ ์ถฉ์กฑ | evidence/cpu_top_ps.txt:303-343 โ /proc/<pid>/stat ์ utime+stime 1์ด ๋ธํ๋ก ์ฐ PROC_%CPU(0โ5%) ์ HOST_%CPU(๋ฌด์ถ์ธ)๋ฅผ ๊ฐ์ ํ์์ ๋์กฐ. ์ฑ ์๊ธฐ๋ณด๊ณ Current Load 5.00โ53.72% ์์น ๊ตฌ๊ฐ์ evidence/cpu_app.log:67-78. ํธ์คํธ ์์ ํ๋ก์ธ์ค ๋ชฉ๋ก์ ์ฑ์ด ์์๋ ๊ต์ฐจ ํ์ธ(evidence/cpu_top_ps.txt:349-379). ps %CPU ๊ฐ ๋์ ํ๊ท ์ด๋ผ ์คํ์ดํฌ๋ฅผ ๋ชป ์ก๋๋ค๋ ํ๊ณ๋ฅผ ์ง๊ณ ๋ณ๋ ๊ณ์ธก์ ๋ถ์ธ ์ ์ด ์ ํํ๋ค(reports/02_cpu_report.md:43) |
| R3-2 | ์ค๋ฅ๊ฐ ์๋ ๋ณดํธ ์ ์ฑ ์ ์ํ ์ข ๋ฃ์์ ์ ์ฆ | โ ์ถฉ์กฑ | evidence/cpu_app.log:78 โ [CRITICAL] [CpuWorker] CPU Threshold Violated! (53.72โฆ%). ์ข
๋ฃ ์ฝ๋ 143(=128+15, SIGTERM) ์ raw ์บก์ฒ๋ ํ์ ์คํ์ ์์(evidence/cpu_monitor.log:309, :325). SIGTERM(์ ์คํ ์ข
๋ฃ) vs SIGKILL(OOM, 137) ๋๋น๋ก "๋ณดํธ ์กฐ์น"๋ฅผ ๋
ผ์ฆ(reports/02_cpu_report.md:256). PDF ์์์ WATCHDOG โฆ EMERGENCY ABORT ๋ฌธ์์ด์ด ์ด ๋ฐ์ด๋๋ฆฌ์ ์์์ ์ค์ธก ์ ์ (reports/02_cpu_report.md:27) |
| R3-3 | CPU_MAX_OCCUPY ์กฐ์ โ ์ข
๋ฃ ์ฌ๋ถ/์์กด ์๊ฐ ๋ณํ, Before & After |
โ ์ถฉ์กฑ | Before 80 (0m30s ์ฌ๋ง) / After 10 (3m00s ์์กด) โ evidence/cpu_monitor.log:205-214 vs :216-271. ๋์๊ฐ 5๊ฐ ๊ฐ ์ค์(95/80/60/50/10)์ผ๋ก "์ํฅ์ ํจ๊ณผ 0, ํํฅ์ด ์ ํจ" ๋ผ๋ ๋ฐ์ง๊ด์ ๊ฒฐ๋ก ์ ์ค์ธก์ผ๋ก ๋ค์ง๊ณ ์คํ ์คํฌ๋ฆฝํธ๊น์ง ๊ณ ์ณค๋ค(evidence/cpu_monitor.log:286-300, src/experiments/02_cpu.sh:29-41). ๋ช
์ธ ํจ์ 3("After ์๋ ๋๊ฐ์ด ์ฃฝ์๋ค๋ก ๋๋ด๋ฉด ์ ๋๋ค")์ ํํผ |
| R4 | ๊ต์ฐฉ์ํ ์ง๋จ ๋ฐ ๋ฆฌํฌํ | โ ์ถฉ์กฑ | reports/03_deadlock_report.md 321์ค โ 4๋จ ๊ตฌ์กฐ ์๋น |
| R4-1 | PID ์กด์ฌ + CPU/๋ฉ๋ชจ๋ฆฌยท๋ก๊ทธ ์ ์ง = ๋ฌด์๋ต ์๋ณ | โ ์ถฉ์กฑ | evidence/deadlock_ps_top.txt:56-61 (ps -ef/ps -p PID ์์กด, STAT=SNl, ELAPSED 01:16, TIME 00:00:00), ๊ด์ PROC_RSS 17.7MB 76์ด ๋ถ๋ณ + PROC_CPU 3.2โ0.0% ๊ฐ์ (evidence/deadlock_monitor.log:192-215). 30s/120s/210s ๋ฐ๋ณต ์บก์ฒ์์ VmRSS 18148kBยทvoluntary_ctxt_switches 14ยท๋ก๊ทธ ํ์ผ 1517 bytesยทmtime ์ด ๋๋
ธ์ด๊น์ง ๋์ผ(evidence/deadlock_ps_top.txt:143-219) โ "๋๋ฆฐ ๊ฒ"๊ณผ "๋ฉ์ถ ๊ฒ"์ ๊ฐ๋ฅด๋ ๊ฒฐ์ ์ ์งํ |
| R4-2 | ๋ง์ง๋ง ๋ก๊ทธ๋ก ์ค๋ ๋ ๊ฐ ์ํ ๋๊ธฐ๋ฅผ ๋ ผ๋ฆฌ์ ์ผ๋ก ์ฆ๋ช | โ ์ถฉ์กฑ | evidence/deadlock_app.log:82-94 โ Worker-Thread-1 LOCK ACQUIRED [Shared_Memory_A] / Worker-Thread-2 LOCK ACQUIRED [Socket_Pool_B] โ ๊ฐ๊ฐ ์๋ ๋ฝ์ WAITING โฆ (Status: BLOCKED). ์์กด ๊ทธ๋ํ์ 4๋ ์กฐ๊ฑด ๋์กฐํ๋ reports/03_deadlock_report.md:193-218. ์ปค๋ ๋ ๋ฒจ ๋ท๋ฐ์นจ์ผ๋ก ps -L -o wchan ์ ์ ์ค๋ ๋ futex_wait_queue(evidence/deadlock_ps_top.txt:75-79) โ ๋ช
์ธ ํจ์ 5(์ค๋ ๋ ๋จ์ ๊ด์ฐฐ)๋ฅผ ์ ํํ ์ถฉ์กฑ |
| R4-3 | MULTI_THREAD_ENABLE ์ฌํ/ํํผ ๋น๊ต |
โ ์ถฉ์กฑ | Before(true)=๋ถํ
9์ด ํ freeze / After(false)=3m00s ์ ์ โ ๋น๊ตํ evidence/deadlock_monitor.log:274-302, After ์ค์ธก ์ค๋
์ท evidence/deadlock_ps_top.txt:102-122(WCHAN ์ด futex_wait_queue1 + do_select2 ๋ก ๊ฐ๋ฆฌ๊ณ TIME+ ๊ฐ ์ ์ง). "์ค๋ ๋ ์๋ ๊ฐ๊ณ ์ํ๊ฐ ๋ค๋ฅด๋ค"๋ ํ๋ณ ๊ธฐ์ค์ ๋ช
์(reports/03_deadlock_report.md:292) |
| R4-4 | (๊ถ์ฅ) ๋ฐ๋๋ฝ 4๋ ์กฐ๊ฑด ยท ์์ฌํ๋ ์ฒ ํ์ ํ์ต | โ ์ถฉ์กฑ | docs/md/์ด๋ก _์ง์.md:737-866(ยง5 ๋์์ฑยท๋ฝยท๋ฐ๋๋ฝ, :797 ์์ฌํ๋ ์ฒ ํ์), docs/md/์ฉ์ด์ง.md:697-699, ๋ฆฌํฌํธ ๋ณธ๋ฌธ์ 4๋ ์กฐ๊ฑด ์ฑ๋ฆฝ ๊ทผ๊ฑฐํ reports/03_deadlock_report.md:209-218. ๊ถ์ฅ ํญ๋ชฉ์ด์ง๋ง ์ค์ ๋ฆฌํฌํธ ๋
ผ์ฆ์ ๋
น์ ์๋ค |
| ID | ์๊ตฌ์ฌํญ (์์ฝ) | ํ์ | ๊ทผ๊ฑฐ / ๋น๊ณ |
|---|---|---|---|
| D1 | 3๊ฐ์ง ์ฅ์ ๊ฐ๊ฐ ๋ ๋ฆฝ๋ Issue ๋ฆฌํฌํธ | โ ์ถฉ์กฑ | reports/01_oom_report.md / reports/02_cpu_report.md / reports/03_deadlock_report.md โ ํ ๋ฌธ์์ ๋ชฐ์์ฐ์ง ์์(๋ช
์ธ ํจ์ 1 ํํผ) |
| D1-1~D1-5 | ํ์ / ์ฌํยท์ฆ๊ฑฐ / ๊ทผ๋ณธ ์์ธ / ์กฐ์น / ๊ฒฐ๊ณผ ํ์ธ | โ ์ถฉ์กฑ | ์ธ ๋ฆฌํฌํธ ๋ชจ๋ ## 1. Description ## 2. Evidence & Logs ## 3. Root Cause Analysis ## 4. Workaround & Verification + Before/After ํ๋ฅผ ๊ฐ์ง (reports/01_oom_report.md:275-300, reports/02_cpu_report.md:278-291, reports/03_deadlock_report.md:248-267) |
| D2 | ๋งํฌ๋ค์ด ํ ํ๋ฆฟ ๊ตฌ์กฐ ์ค์ | โ ์ถฉ์กฑ | ์ ๋ชฉ์ด [Bug] {์ฅ์ ์ ํ} - {ํ ์ค ์์ฝ} ํ์(reports/01_oom_report.md:1 ๋ฑ), .github/ISSUE_TEMPLATE/bug_report.mdยทanalysis_report.md ๋ ๋ณ๋ ์ ๊ณต |
| E1-1 | monitor.sh ๊ฒฐ๊ณผ(๋ฉ๋ชจ๋ฆฌ ์์น ์์น) |
โ ์ถฉ์กฑ | evidence/oom_monitor.log:155-164 |
| E1-2 | ์ข ๋ฃ ์ง์ /์งํ ์คํ ๋ก๊ทธ | โ ์ถฉ์กฑ | evidence/oom_app.log:63-75 |
| E1-3 | MEMORY_LIMIT ๋ณ๊ฒฝ ์ ํ ์ต์ 2ํ ์คํ |
โ ์ถฉ์กฑ | ํ์ดํ๋ผ์ธ Before/After 2ํ(PID 2738539 / 2739609, evidence/oom_monitor.log:226-294) + ๋
๋ฆฝ probe 4ํ(evidence/oom_monitor.log:337-367). ๋ช
์ธ์์ ์ ์ผํ๊ฒ ํ์๋ฅผ ๋ชป ๋ฐ์ ์กฐ๊ฑด์ธ๋ฐ ์ฌ์ ์๊ฒ ์ด๊ณผ |
| E2-1 | CPU ๊ธ์์น ๊ตฌ๊ฐ top/ps/๊ด์ ์บก์ฒ |
๐ก ๋ถ๋ถ ์ถฉ์กฑ | top/ps ์บก์ฒ๋ ์์ผ๋(evidence/cpu_top_ps.txt:43-55, :71-87) ๊ฑฐ๊ธฐ์ ์ฐํ ๊ฐ์ %CPU 0.0 ยท TIME+ 0:00.04โ0:00.28 ยท load average 0.23โ0.28 ๋ก "๊ธ์์น"์ด ๋ณด์ด์ง ์๋๋ค. ์ค์ ์์น์ /proc/<pid>/stat ๋ธํํ(์ต๋ 5%)์ ์ฑ ์๊ธฐ๋ณด๊ณ Current Load(53.72%)์์๋ง ๊ด์ธก๋๋ค. ๋ฆฌํฌํธ๊ฐ ์ด ํ๊ณ๋ฅผ ์จ๊ธฐ์ง ์๊ณ ยง2-3 ์ ๊ทธ๋๋ก ์ ์ ์ ์ ๋์ด ํ๊ฐํ๋(reports/02_cpu_report.md:148-154), ์๊ฑด ๋ฌธ๊ตฌ๊ฐ ์๊ตฌํ ํํ์ ์บก์ฒ๋ ์๋๋ค |
| E2-2 | ์ข ๋ฃ ๋ก๊ทธ | โ ์ถฉ์กฑ | evidence/cpu_app.log:78 (WATCHDOG ๋ฌธ์์ด ๋์ ์ค์ ์ถ๋ ฅ์ธ [CpuWorker] CPU Threshold Violated!. ๋ช
์ธ๊ฐ "โฆ๋ฑ"์ผ๋ก ์ด์ด ๋ ๋ฒ์) |
| E2-3 | CPU_MAX_OCCUPY ๋ณ๊ฒฝ ์ ํ ๋น๊ต |
โ ์ถฉ์กฑ | evidence/cpu_monitor.log:286-292 (5๊ฐ ๊ฐ ์ค์) |
| E3-1 | PID ์กด์ฌ ์ฆ๊ฑฐ | โ ์ถฉ์กฑ | evidence/deadlock_ps_top.txt:56-61, ๋ฐ๋ณต ์บก์ฒ :144-146 ๋ฑ |
| E3-2 | top -H / ps -L ๋ก ๋ณํ ์ ์ฒด ์ฆ๋ช
|
โ ์ถฉ์กฑ | evidence/deadlock_ps_top.txt:63-79 |
| E3-3 | ๋ง์ง๋ง ๋ก๊ทธ ์ง์ (WAITINGโฆ BLOCKED) |
โ ์ถฉ์กฑ | evidence/deadlock_app.log:93-94 |
| E3-4 | ์ค๋ ๋/๋ฝ ๋๊ธฐ ์ถ๋ก ๊ทผ๊ฑฐ | โ ์ถฉ์กฑ | reports/03_deadlock_report.md:193-207 (์์กด ๊ทธ๋ํ) + WCHANยท๋ฌธ๋งฅ๊ตํ ์นด์ดํฐ |
| ํญ๋ชฉ | ํ์ | ๊ทผ๊ฑฐ |
|---|---|---|
| ๐ซ ๋์ปดํ์ผยท๋ฆฌ๋ฒ์ค ์์ง๋์ด๋ง ๊ธ์ง | โ ์๋ฐ ์์ | objdump|readelf|pyinstxtractor|uncompyle|decompil|disassembl|ghidra|radare ์ ์ฅ์ ์ ์ฒด grep 0๊ฑด. ์คํ๋ ค reports/02_cpu_report.md:250 ์ด "๋ฐ์ด๋๋ฆฌ ๋ด๋ถ ๊ตฌํ์ ๋ฆฌ๋ฒ์ค ์์ง๋์ด๋ง ๊ธ์ง ๋์์ด๋ผ ํ์ธํ์ง ์์๋ค. ์ ์์ ์ ์ธ๋ถ ๊ด์ธก๋ง์ผ๋ก ์ธ์ด ์ถ๋ก " ์ด๋ผ๊ณ ํ๊ณ๋ฅผ ๋ช
์ |
| ๋ฆฌ๋ ์ค ํ์ค ๋ช ๋ น์ด/๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ง ์ฌ์ฉ | โ ์๋ฐ ์์ | ์ฌ์ฉ ๋๊ตฌ๋ ps top free df ss/netstat awk stat pgrep kill curl + /proc ๋ฟ(src/monitor.sh, src/experiments/lib_experiment.sh). ๋ณ๋ APMยทํ๋กํ์ผ๋ฌ ์ค์น ์์ |
| ํฌํธ 15034 ๊ณ ์ | โ ์๋ฐ ์์ | src/05_env_and_keyfile.sh:35, src/02_firewall_allowlist.sh:33, src/07_cron_schedule.sh:26 ๋ชจ๋ 15034 |
| ์๋ํ ์คํฌ๋ฆฝํธ Bash ์ ์ฉ(์ ์ฅ์ ์์ฒด ์ ์ธ) | โ ์๋ฐ ์์ | ๋ณธ README ยง7 ์ ์ฝ ์ฌํญ ์ด ์ ์ธ ๋ฒ์๋ฅผ "๋ถ์ยท๊ด์ ยท๊ฒ์ฆ ์๋ํ๋ Bash ๋ก๋ง"์ผ๋ก ํ์ ํ๊ณ , ์ ์ผํ Python ์ธ tools/build_docs.py ๊ฐ ๊ณผ์ ์ฐ์ถ๋ฌผ์ด ์๋ ๋ฌธ์ HTML ๋น๋์์ ๊ฐ์ ์๋ฆฌ์์ ๋ช
์ํ๋ค. ํด๋น ๊ฒฝ๋ก(src/**, verify_orbstack.sh, demo.sh, tools/check_req_ids.sh)๋ ์ ๋ถ Bash โ ์์ธ 0๊ฑด (2026-09-21 ๋ฌธ๊ตฌ ํ์ ์ผ๋ก ํด์) |
| ๊ฒฉ๋ฆฌ ํ๊ฒฝ(Docker/VM) ๊ถ์ฅ | ๐ก ๊ถ์ฅ ๋ฏธ์ค์ | ๋ณธ README ยง5 ๋น ๋ฅธ ์คํ ๊ฐ์ด๋ ์ demo.sh/verify_orbstack.sh ๋ OrbStack Ubuntu ๋จธ์ ์๋๋ฆฌ์ค๋ฅผ ๊ธฐ์ ํ์ง๋ง, ์ ์ถ evidence ๋ AGENT_HOME=/home/ashofrondol/b12_sandbox/agent-app ๋ก ๊ฐ๋ฐ ํธ์คํธ์์ ์ง์ ์คํํ ๊ฒฐ๊ณผ๋ค(evidence/oom_monitor.log:6,11). ๊ฐ์ ํธ์คํธ์์ java(RSS 19GB)ยทgrafanaยทloki ๊ฐ ๋๊ณ ์์ด(evidence/oom_ps_top.txt:353-362) ํธ์คํธ ์งํ์ ๋ฐฐ๊ฒฝ ๋ถํ๊ฐ ์์ธ๋ค. ๋ฆฌํฌํธ๊ฐ ์ด๋ฅผ ์ค์ค๋ก ๋ฐํ๊ณ ํ๋ก์ธ์ค ๋จ์ ์งํ๋ก ๋ถ๋ฆฌํ์ผ๋ฏ๋ก(reports/02_cpu_report.md:207) ๊ฒฐ๋ก ์๋ ์ํฅ์ด ์๋ค. ๋ช
์ธ์ "๊ถ์ฅ"์ด๋ผ ๊ฐ์ ์์๋ ์๋๋ค |
| ID | ์๊ตฌ์ฌํญ (์์ฝ) | ํ์ | ๊ทผ๊ฑฐ / ๋น๊ณ |
|---|---|---|---|
| B1 | ์ค์ผ์ค๋ง ์๊ณ ๋ฆฌ์ฆ ์ถ๋ก | โ ์ถฉ์กฑ | reports/04_scheduling_analysis.md 240์ค + ์์ง ์คํฌ๋ฆฝํธ src/experiments/04_scheduling.sh |
| B1-1 | ํ์์คํฌํ ๊ธฐ๋ฐ ์คํ ์์ยท๊ต์ฒด ์ฃผ๊ธฐ ํจํดํ | โ ์ถฉ์กฑ | evidence/scheduling_workers.log:38-62 ์๋ฌธ 21์ค + :176-201 ๊ฒฝ๊ณผ/๊ฐ๊ฒฉ ๊ณ์ฐํ. ๊ฐ๊ฒฉ ํ๋ณธ 20๊ฐ ์ ๋ถ 50~51ms(ํ๊ท 50.8ms), ๋ฑ์ฅ ์์ AโBโC ๊ณ ์ ํ์ ๊น์ง ์ ๋ํ |
| B1-2 | Round-Robin / FCFS / Priority ์ค ์ญ์ถ๋ก | โ ์ถฉ์กฑ | reports/04_scheduling_analysis.md:158-191 โ FCFS ๊ธฐ๊ฐ(A ๊ฐ 40%์์ Preempted ์งํ B ์์), Priority ๊ธฐ๊ฐ(ํด ์ 3/3/3, ํด๋น ์งํํญ 20%p ๋์ผ, ์๋ฃ ์๊ฐ ์ฐจ 51ms ์ด๋ด), RR ๊ฒฐ๋ก (๊ณ ์ ํ ๋น๋ยท์ํ ๊ต์ฒดยท๊ณตํ์ฑยท์ํ ๋ณด์กด 4๊ทผ๊ฑฐ). ๊ฒ๋ค๊ฐ [Thread-A/B/C] ๊ฐ OS ์ค๋ ๋๊ฐ ์๋๋ผ ์ฑ ๋ด๋ถ ๋
ผ๋ฆฌ ํ์คํฌ์์ top -H ๋ก ํ์ธํ๊ณ ์ดํ์ ์๋ชป๋ ๊ทผ๊ฑฐ๋ฅผ ์ค์ค๋ก ํ๊ธฐ(:127-129) |
| B1-3 | ์ฅ๋จ์ ๋ฐ ์ ํฉ ์ํคํ ์ฒ ๋ถ์ | โ ์ถฉ์กฑ | reports/04_scheduling_analysis.md:195-223 โ ์ฅ์ 3 / ๋จ์ 3 + ์ ํฉ(์น์๋ฒยท์ธํฐ๋ํฐ๋ธยท๋ฉํฐํ
๋ํธ) / ๋ถ์ ํฉ(๋ฐฐ์นยทETL, RTOS, HPC) ํ. ๋ช
์ธ๊ฐ ์์๋ก ๋ "์ค์๊ฐ ์๋ต ์น ์๋ฒ vs ์ฒ๋ฆฌ๋ ๋ฐฐ์น ์๋ฒ" ๋๋น๋ฅผ ์ ํํ ๋ค๋ฃธ |
| ID | ํ์ | ๊ทผ๊ฑฐ |
|---|---|---|
| G1 ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐยท๋์ ์ํฅ | โ ์ถฉ์กฑ | docs/md/์ด๋ก _์ง์.md:92-233 (ยง2 ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ~OOM), ๋ฆฌํฌํธ reports/01_oom_report.md:249-254 |
| G2 CPU ๊ณผ์ ์ โ ์์คํ ์ง์ฐ ์๋ฆฌ | โ ์ถฉ์กฑ | docs/md/์ด๋ก _์ง์.md:234-325 (ยง3 CPUยท์ค์ผ์ค๋ง), reports/02_cpu_report.md:252-257 |
| G3 ๋ฐ๋๋ฝ ๊ฐ๋ + ์์คํ ๋๊ตฌ ์ง๋จ | โ ์ถฉ์กฑ | docs/md/์ด๋ก _์ง์.md:737-866, reports/03_deadlock_report.md:220-225 |
| G4 ์กํ์์นยทIssue ์ํต | โ ์ถฉ์กฑ | ๋ฆฌํฌํธ 3์ข
์ ๋จธ๋ฆฌ๋ง์ด ํ๊ฒฝยท๊ณ์ ยทํ๊ฒฝ๋ณ์ยท์ธก์ ๊ตฌ๊ฐ์ ๋ชจ๋ ์ ์(reports/01_oom_report.md:3-7), ๋ชจ๋ ์ธ์ฉ์ ์๋ณธ: evidence/ํ์ผ:์ค๋ฒํธ ์ญ์ถ์ ๋งํฌ. ๊ตฌ์ ๋๋น ๋ฌธ๋ต์ docs/md/ํ๊ฐ_๋ฌธํญ.md 263์ค |
-
[๊ฒฝ๋ฏธ ยท R1-11]
0.0.0.0๋ฐ์ธ๋ฉ์ ์ง์ ๋ณด์ฌ ์ฃผ๋ ์บก์ฒ๊ฐ ์๋ค.- ๋ฌด์์ด ๋ถ์กฑํ๊ฐ: ํฌํธ๊ฐ LISTEN ์ด๋ผ๋ ์ฌ์ค์ ๋ถํธ ๋ก๊ทธยท
monitor.sh๋ก ํ์ธ๋์ง๋ง, ๋ฐ์ธ๋ฉ ์ฃผ์๊ฐ0.0.0.0(์ ์ธํฐํ์ด์ค)์ธ์ง127.0.0.1(๋ฃจํ๋ฐฑ)์ธ์ง ๊ตฌ๋ถ๋๋ ์ถ๋ ฅ์ด evidence ์ ์ฒด์ ์๋ค. ๋ช ์ธ 0.8 ์ ์ ํ์ต ์ง๋ฌธ("0.0.0.0๊ณผ127.0.0.1๋ฐ์ธ๋ฉ์ ๋ณด์์ ๋ฌด์์ด ๋ค๋ฅธ๊ฐ")์ด ์ ์กฐ์คํ๋ ์ง์ ์ด๋ค. - ์ด๋ป๊ฒ ๊ณ ์น๋ฉด ๋๋๊ฐ: ์ฑ ๊ธฐ๋ ์ํ์์
ss -tlnp | grep 15034(๋๋ss -tln 'sport = :15034') ํ ์ค์ ์บก์ฒํด*_ps_top.txt์ ๋ถํธ ๊ฒ์ฆ ๋ธ๋ก์ ์ถ๊ฐํ๊ณ , ๋ฆฌํฌํธ R1 ์ฒดํฌ๋ฆฌ์คํธ์์ ์ด๋ฅผ ์ธ์ฉํ๋ค. - โ
๋ฐฐ์ ์๋ฃ (2026-09-21).
src/experiments/lib_experiment.sh์_snapshot_bind_addr()๋ฅผ ์ถ๊ฐํ๊ณ , ๋ค ์คํ ์ ๋ถ(OOM/CPU ์ BeforeยทAfter, Deadlock ์ BeforeยทAfter, ์ค์ผ์ค๋ง)์์ ์ฑ ๊ธฐ๋ ์งํ ํ ๋ฒ์ฉ ํธ์ถํ๋ค. ๊ฐ์ ํ์ผ์preflight()์๋ ๊ธฐ๋ ์ ํฌํธ ์ ์ ์ํ๋ฅผ ๋ณด๊ณ ํ๋ ์ค์ ๋ฃ์ด, ์์กด ํ๋ก์ธ์ค๊ฐ ๋ฌผ๊ณ ์๋ ํฌํธ๋ฅผ ์ฑ์ ๊ฒ์ผ๋ก ์ค๋ ํ์ง ์๊ฒ ํ๋ค.evidence/๋ ์ด์ ์คํ ์ฐ์ถ๋ฌผ์ด๋ผ ์๊ธ ์ ์ฉ๋์ง ์๋๋ค โ ๋ค์ ์คํ๋ถํฐevidence_live/*_ps_top.txt์ ๋จ๋๋ค.
- ๋ฌด์์ด ๋ถ์กฑํ๊ฐ: ํฌํธ๊ฐ LISTEN ์ด๋ผ๋ ์ฌ์ค์ ๋ถํธ ๋ก๊ทธยท
-
[๊ฒฝ๋ฏธ ยท E2-1]
top/ps์บก์ฒ๋ง ๋ณด๋ฉด "CPU ๊ธ์์น"์ด ๋ณด์ด์ง ์๋๋ค.- ๋ฌด์์ด ๋ถ์กฑํ๊ฐ: ์๊ฑด์ "
top/ps/๊ด์ ๋ก ๊ธ์์น ๊ตฌ๊ฐ์ ์บก์ฒ"์ธ๋ฐ, ์ค์ ์บก์ฒ๊ฐ์%CPU 0.0ยทTIME+ 0.24์ดยท load average ๋ฌด๋ณํ๋ค. ์์น์/proc๋ธํํ์ ์ฑ ์๊ธฐ๋ณด๊ณ ๊ฐ์์๋ง ๋ณด์ธ๋ค. ๋ฆฌํฌํธ๊ฐ ์ด ๋ถ์ผ์น๋ฅผ ์ ์งํ๊ฒ ์์ ํ ๊ฒ์ ์คํ๋ ค ๊ฐ์ ์ด์ง๋ง, ์ฑ์ ์๊ฐ ์๊ฑด ๋ฌธ๊ตฌ๋ง ๋์กฐํ๋ฉด ๋ฏธ๋น๋ก ์ฝํ ์ ์๋ค. - ์ด๋ป๊ฒ ๊ณ ์น๋ฉด ๋๋๊ฐ:
top -b -n 2 -d 1 -p <pid>์ ๋ ๋ฒ์งธ ์ํ(= ์ง์ง ์๊ฐ๊ฐ)์ ๋ถํ ์์น ๊ตฌ๊ฐ์์ 3~4ํ ์ฐ์ ์บก์ฒํด%CPU๊ฐ ์ค์ ๋ก ์ค๋ฅด๋ ํ๋ฅผ ๋ง๋ค์ดevidence/cpu_top_ps.txtยง1 ์ ๋ฃ๋๋ค. ์ง๊ธ๋:349-379์top -b -n 2์ฌ์ฉ ์๊ฐ ์์ผ๋ฏ๋ก ๋์ PID ๋ก ํ ๋ฒ ๋ ๋๋ฆฌ๋ฉด ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ฆฌํฌํธ ยง2-3 ์ฒซ๋จธ๋ฆฌ์ "์ด ์ฑ์ ๋ถํ๋ OS ์งํ์ ์ต๋ 5%์ด๋ฉฐ, ๊ทธ ์ด์ ๋ ์ฑ ๋ด๋ถ ํ๊ณ๊ฐ ์ข ๋ฃ๋ฅผ ๊ฒฐ์ ํ๊ธฐ ๋๋ฌธ"์ด๋ผ๋ ํ ์ค ์์ฝ์ ๋จผ์ ๋ฐฐ์นํด ์ค๋ ์ ๋ง๋๋ค.
- ๋ฌด์์ด ๋ถ์กฑํ๊ฐ: ์๊ฑด์ "
-
[๊ฒฝ๋ฏธ ยท R2-3 / R3-2] ํ์ดํ๋ผ์ธ Before ์คํ์ ์ข ๋ฃ ์ฝ๋๊ฐ raw ์บก์ฒ๋ก ๋จ์ ์์ง ์๋ค.
- ๋ฌด์์ด ๋ถ์กฑํ๊ฐ: ๋ฆฌํฌํธ๋ Before ๋ฅผ "exit 137"(OOM) / "exit 143"(CPU) ๋ก ๋จ์ธํ์ง๋ง, ๊ทธ ํด๋น ์คํ ์์ฒด์ ์ข
๋ฃ ์ฝ๋ ์ถ๋ ฅ์ evidence ์ ์๋ค. raw
exit_code=์บก์ฒ๋ ํ์ probe ์๋ง ์๋ค(evidence/oom_monitor.log:340,348/evidence/cpu_monitor.log:309,325). ํ์ดํ๋ผ์ธ ๊ตฌ๊ฐ์ ๋จ์ ๊ฒ์ After ์rc=2(๊ด์ธก ์ข ๋ฃ)๋ฟ์ด๋ค(evidence/oom_monitor.log:294,evidence/cpu_monitor.log:271). - ์ด๋ป๊ฒ ๊ณ ์น๋ฉด ๋๋๊ฐ:
src/experiments/lib_experiment.sh์_terminating_experiment๊ฐ ์์ปค ์ข ๋ฃ ํwait; echo "exit=$?"๊ฒฐ๊ณผ๋ฅผ*_monitor.log์ ํด๋น ๊ตฌ๊ฐ ๋์ค์ append ํ๋๋ก ํ ์ค ์ถ๊ฐํ๋ค. ๊ทธ๋ฌ๋ฉด Before ๊ตฌ๊ฐ ์์ฒด์์ 137/143 ์ด ์ง์ ์ฆ๋ช ๋๋ค.
- ๋ฌด์์ด ๋ถ์กฑํ๊ฐ: ๋ฆฌํฌํธ๋ Before ๋ฅผ "exit 137"(OOM) / "exit 143"(CPU) ๋ก ๋จ์ธํ์ง๋ง, ๊ทธ ํด๋น ์คํ ์์ฒด์ ์ข
๋ฃ ์ฝ๋ ์ถ๋ ฅ์ evidence ์ ์๋ค. raw
-
[๊ฒฝ๋ฏธ ยท ๋ฌธ์] โ ํด์๋จ (2026-09-21) โ
README.md์ ์ ์ฅ์ ์ค๋ฌผ์ด ๋ ๊ตฐ๋ฐ์์ ์ด๊ธ๋ฌ๋ค.ยง2 ๋๋ ํ ๋ฆฌ ๊ตฌ์กฐ์bin/ํญ๋ชฉ์ด "๋น์ด ์์",ยง2์๋ ๋น๊ณ ๊ฐ "์ด ์ ์ฅ์์ ๋ฐ์ด๋๋ฆฌ๋ ํฌํจ๋์ด ์์ง ์์ผ๋"๋ผ๊ณ ์ ์์ง๋ง ์ค์ ๋ก๋bin/agent-leak-app(6.5MB ELF)์ด git ์ ์ถ์ ๋๊ณ ์์๋ค(git ls-files bin/ํ์ธ). ํด์๊ฐ evidence ํค๋์ ์ผ์นํด ์ฌํ์ฑ ๋ฉด์์๋ ์คํ๋ ค ์ฅ์ ์ด๋ฏ๋ก ํ์ผ์ ์ง์ฐ์ง ์๊ณ ๋ฌธ๊ตฌ๋ฅผ ์ค๋ฌผ์ ๋ง์ท๋ค โ ๋ ๊ณณ ๋ชจ๋ md50fb02e12554328b32e6e1adac861630e๋ฅผ ๋ช ์ํ๊ณ ,ยง5 ๋น ๋ฅธ ์คํ ๊ฐ์ด๋์cp ~/Downloads/โฆ์๋ด๋ "์ด๋ฏธ ํฌํจ๋จ, ๊ต์ฒดํ ๋๋ง"์ผ๋ก ๋ฐ๊ฟจ๋ค.ยง7 ์ ์ฝ ์ฌํญ์ "์๋ํ ์คํฌ๋ฆฝํธ๋ Bash ๋ก๋ง" ์ ์ธ๊ณผtools/build_docs.py์ ๊ณต์กด โ ์ ์ธ์ "๋ถ์ยท๊ด์ ยท๊ฒ์ฆ ์๋ํ๋ Bash ๋ก๋ง"์ผ๋ก ํ์ ํ๊ณ ,build_docs.py๊ฐ ๊ณผ์ ์ฐ์ถ๋ฌผ์ด ์๋ ๋ฌธ์ ๋น๋์์ ๊ฐ์ ์๋ฆฌ์ ์ ์๋ค.
-
[๊ฒฝ๋ฏธ ยท ์ถ์ ์ฑ] โ ํด์๋จ (2026-09-21) โ ์์ฒด ์๊ตฌ์ฌํญ ID(
B1-2-A1,B1-2-P1~P11,B1-2-E-OOM1,B1-2-C2,B1-2-B1~B3)์ ์ ์ํ๊ฐ ์์๋ค.- ๋ฌด์์ด ๋ถ์กฑํ๋: ๋ฆฌํฌํธยทevidenceยท์คํ ์คํฌ๋ฆฝํธ ์ฃผ์์ด ์ด ID ๋ก ๊ทผ๊ฑฐ๋ฅผ ๋ฌ๊ณ ์๋๋ฐ(์:
reports/01_oom_report.md:107,evidence/oom_monitor.log:2), ID โ ์๋ฌธ ์๊ตฌ์ฌํญ ๋งคํ ๋ฌธ์๊ฐ ์์ด ์ 3์๊ฐ ์ถ์ ํ ์ ์์๋ค. - ์ด๋ป๊ฒ ๊ณ ์ณค๋: docs/md/์๊ตฌ์ฌํญ_ID_๋งคํ.md ์
B1-2-P1~P11 โ R1-1~R1-11/B1-2-A1~A9 โ R2-1~R4-3/B1-2-E-* โ E1~E3/B1-2-B1~B3 โ B1-1~B1-3/B1-2-C1~C3 โ 0.6 ์ ๋์กฐํ๋ฅผ ๋ง๋ค์๋ค. ๋ฆฌํฌํธ ๋ณธ๋ฌธ์ ID ๋ ์นํํ์ง ์์๋ค โ ์ธ์ฉ ์ค๋ฒํธ๊ฐ ์ ๋ถ ๋ฐ๋ ค ๋ค๋ฅธ ๊ทผ๊ฑฐ๊ฐ ๊ฑฐ์ง์ด ๋๊ธฐ ๋๋ฌธ์ด๊ณ , ๋์กฐํ ํ๋๋ก ๊ฐ์ ์ถ์ ์ฑ์ ์ป์ ์ ์๋ค. - ํ๊ฐ ์ฉ์ง ์๊ฒ:
tools/check_req_ids.sh๊ฐ ์ ์ฅ์์์ ์ฐ์ด๋ ๋ชจ๋B1-2-*ID ๋ฅผ ๋ชจ์ ๋์กฐํ์ ์ ์๊ฐ ์์ผ๋ฉด exit 1 ๋ก ๋๋๋ค. ์ ID ๋ฅผ ๋ง๋ค๋ฉด์ ํ๋ฅผ ๊ฐฑ์ ํ์ง ์์ผ๋ฉด ๊ฒ์ฌ๊ฐ ์คํจํ๋ค.
- ๋ฌด์์ด ๋ถ์กฑํ๋: ๋ฆฌํฌํธยทevidenceยท์คํ ์คํฌ๋ฆฝํธ ์ฃผ์์ด ์ด ID ๋ก ๊ทผ๊ฑฐ๋ฅผ ๋ฌ๊ณ ์๋๋ฐ(์:
-
[์ฐธ๊ณ ยท ๊ฒฐํจ ์๋] ๋ฆฌํฌํธ๊ฐ ์ค์ค๋ก ๋ฐํ ๋ฏธํ์ธ ํญ๋ชฉ 3๊ฑด โ โ
Worker-Thread-1/2์ LWP ์ 1:1 ๋์ ๋ฏธํ์ธ(reports/03_deadlock_report.md:70), โกPreempted๊ฐ ์ง์ง ์ ์ ์ธ์ง ํ์กฐ์ ์๋ณด์ธ์ง ๋ฏธ๊ตฌ๋ถ(reports/04_scheduling_analysis.md:230), โข OOM ์dmesg๋ฏธํ์ธ(reports/01_oom_report.md:254). ์ ๋ค ๋ช ์ธ๊ฐ ์๊ตฌํ์ง ์์ ๋ฒ์์ด๊ณ , "ํ์ธํ์ง ๋ชปํ๋ค"๊ณ ์ ์ ํ๋ ์์ฒด๊ฐ D1-2(๊ฐ๊ด์ ์ฆ๊ฑฐ) ๊ธฐ์ค์ ๋ถํฉํ๋ค. ๋ ๊น์ด ๊ฐ๊ณ ์ถ๋ค๋ฉด โ ์/proc/<pid>/task/<tid>/comm์, โข์dmesg -T | grep -i oom์ ์บก์ฒํ๋ฉด ๋๋ค.
์ ์ฅ์๋ฅผ ๋ณ๊ฒฝํ์ง ์๊ณ ๋คํธ์ํฌยท์ค์น ์์ด ๊ฐ๋ฅํ ๋ฒ์๋ง ์ํํ๋ค.
๋จ (2026-09-21 ์ถ๊ฐ) ๋ก ํ์๋ ํ์ ๊ฐ์ ๋ ๊ฐ์ ์์
์ค์ ๋๋ฆฐ ๊ฒ์ด๊ณ , ๊ทธ ์์
์ ์ ์ฅ์๋ฅผ ๋ณ๊ฒฝํ๋ค.
| ๊ฒ์ฆ | ๋ช ๋ น | ๊ฒฐ๊ณผ |
|---|---|---|
| ์ ธ ๋ฌธ๋ฒ ๊ฒ์ฌ (์ ์คํฌ๋ฆฝํธ) | for f in $(find . -name '*.sh' -not -path './.git/*'); do bash -n "$f"; done |
20๊ฐ ์ ๋ถ OK (demo.sh, verify_orbstack.sh, src/*.sh 11๊ฐ, src/experiments/*.sh 6๊ฐ, tools/check_req_ids.sh 1๊ฐ) โ ๊ตฌ๋ฌธ ์ค๋ฅ 0๊ฑด |
| ์๊ตฌ์ฌํญ ID ๋งคํ ๊ฒ์ฌ (2026-09-21 ์ถ๊ฐ) | bash tools/check_req_ids.sh |
โ ์ ์ฅ์๊ฐ ์ฐ๋ B1-2-* ID ์ ๋ถ docs/md/์๊ตฌ์ฌํญ_ID_๋งคํ.md ์ ์ ์๋จ(๊ฐ์๋ ๊ฒ์ฌ ์ถ๋ ฅ์ด ์ง์ ๋งํด ์ค๋ค). ์ผ๋ถ๋ฌ ๋งคํํ์ ์๋ ๋ฒํธ์ P ๊ณ์ด ID ๋ฅผ ๋ฃ์ด exit 1 ยท ์ฌ์ฉ์ฒ ํ์ผ ์ถ๋ ฅ์ ํ์ธํ๊ณ ์๋ณตํจ (์ด ํ์ ์ฐ๋ค๊ฐ ๊ฒ์ฌ๊ฐ ์ค์ ๋ก ํ ๋ฒ ๋ ๋ฌผ์๋ค โ README ์ ์ ์ ์์ ID ๊น์ง ์ก๋๋ค) โ ๊นจ์ง๋ ๊ฒ์ฌ์์ด ์ค์ฆ๋๋ค |
| ๊ฒ์ฆ ๋๋ผ์ด๋ฒ ์ข ๋ฃ ์ฝ๋ (2026-09-21 ์ถ๊ฐ) | verify_orbstack.sh ์ main() ๋ง์ง๋ง return "$EXP_WARN" |
EXP_WARN=0 โ exit 0 / EXP_WARN=1 โ exit 1 ์์ชฝ ํ์ธ. ์ด์ ์๋ ์คํ์ด PASS ์๋์ด๋ ํญ์ 0 ์ด๋ผ CIยท๋ํผ๊ฐ ์คํจ๋ฅผ ๋ณผ ์ ์์๋ค. demo.sh ๋ ์ฝ๋๋ฅผ ๋ฐ์ ์๋ด ์ถ๋ ฅ ํ ๊ทธ๋๋ก ์ ํํ๋ค. ์คํ
์ผ๋ก verify ์ข
๋ฃ ์ฝ๋ 0/1 ร evidence_live ๋น์์/์ฑ์์ง 4๊ฐ์ง ์กฐํฉ์ ์ค์ ๋ก ๋๋ ค demo.sh ์ข
๋ฃ ์ฝ๋์ ์๋ด ๋๋ฌ์ ํ์ธํ๋ค โ ์ด๋ ๊ฐ ํด๋ก ํ ์ํ(evidence_live/ ์ README.md ๋ฟ)์์ ์ฐ์ถ๋ฌผ ๋ชฉ๋ก ์ถ๋ ฅ์ `ls โฆ |
| ๋ฐ์ด๋๋ฆฌ ๋์ผ์ฑ | md5sum bin/agent-leak-app |
0fb02e12554328b32e6e1adac861630e โ evidence/oom_monitor.log:8 ์ด ๊ธฐ๋กํ ํด์์ ์ผ์น. evidence ๊ฐ ์ด ์ ์ฅ์์ ๋ฐ์ด๋๋ฆฌ์์ ๋์์์ด ํ์ธ๋จ |
| ๋ฆฌ๋ฒ์ค ์์ง๋์ด๋ง ํ์ | grep -rniE "objdump|readelf|pyinstxtractor|uncompyle|decompil|disassembl|ghidra|radare" --include='*.sh' --include='*.md' --include='*.py' --include='*.txt' --include='*.log' . |
0๊ฑด (์ฉ์ด์ง์ ์ฉ์ด ์ค๋ช ์ ์ธ) |
| ๋ฐ์ธ๋ฉ ์ฃผ์ ๊ทผ๊ฑฐ | grep -rn "0\.0\.0\.0:15034|ss -tln|netstat -tln|LISTEN" evidence/ |
์ฃผ์ 1์ค๋ฟ, ์ค์ ss ์ถ๋ ฅ ์บก์ฒ 0๊ฑด โ R1-11 ๋ถ๋ถ ์ถฉ์กฑ ํ์ ์ ๊ทผ๊ฑฐ. (2026-09-21: _snapshot_bind_addr() ๋ฐฐ์ ์๋ฃ โ ๋ฆฌ์ค๋๊ฐ ์์ ๋ 0.0.0.0:15034 ์ค์, ์์ ๋ "LISTEN ์์" ์ ๋จ๊ธฐ๋ ๊ฒ์ ์์ชฝ ๋ค ์คํํด ํ์ธ. ์ ์ถ๋ณธ evidence/ ์๋ ์๊ธ๋์ง ์๋๋ค) |
| ๋ฆฌํฌํธโevidence ์ค๋ฒํธ ๋์กฐ | sed -n ์ผ๋ก ์ธ์ฉ ๊ตฌ๊ฐ ์ง์ ์ด๋ (oom_app.log:34-58,63-78 / oom_monitor.log:150-170,225-240,300-370 / oom_ps_top.txt:290-372 / cpu_monitor.log:280-340 / cpu_top_ps.txt:300-350 / deadlock_ps_top.txt:78-95,140-226 / deadlock_monitor.log:274-302 / scheduling_workers.log:30-70,170-206) |
ํ๋ณธ์ผ๋ก ํ์ธํ ์ธ์ฉ ์ ๋ถ ์ผ์น. ๋ฆฌํฌํธ ๋ณธ๋ฌธ์ ๋ถ์ ์๋ณธ: โฆ:Lxx-yy ๋งํฌ๊ฐ ์ค์ ์ค ๋ด์ฉ๊ณผ ๋ง๋ค |
๋ฏธ์คํ ํญ๋ชฉ๊ณผ ์ด์
bin/agent-leak-app์คํ /src/monitor.sh์คํ /src/experiments/*.sh์คํ โ ๋ฏธ์คํ. ์ฑ ์คํ์$AGENT_HOMEยท$AGENT_LOG_DIR๋๋ ํฐ๋ฆฌ ์์ฑ๊ณผ ๋ก๊ทธ ํ์ผ ์ฐ๊ธฐ๋ฅผ ๋๋ฐํด "์ ์ฅ์ยท์์คํ ๋ฌด๋ณ๊ฒฝ" ๊ท์น์ ์ด๊ธ๋๊ณ ,monitor.sh๋ ์ฑ์ด ๋ ์์ด์ผ๋ง Health Check ๋ฅผ ํต๊ณผํ๋ฉฐ$AGENT_LOG_DIR์ append ํ๋ค.src/0X_*.shsetup ์คํฌ๋ฆฝํธ โ ๋ฏธ์คํ.apt-get install(aclยทufwยทcron), ๊ณ์ ์์ฑ,sudo์์คํ ๋ณ๊ฒฝ์ ์ํํ๋ค.tools/build_docs.pyโ ๋ฏธ์คํ.markdownยทpygments์ค์น๊ฐ ํ์ํ๊ณ (๋ณธ READMEยง9 ๋ฌธ์ ๋น๋) ์ค์น๋ ๊ธ์ง ๋ฒ์๋ค. ๋จ,docs/html/index.html์ฐ์ถ๋ฌผ์ด ์ด๋ฏธ ์กด์ฌํจ๊ณผpython3 -m py_compileํต๊ณผ๋ ํ์ธํ๋ค.
์ ๋ช ๋ น์ด๋ฅผ ์ธ์์ ํธ๋ ๊ฒ ์๋๋ผ, ์ธ๋ถ์์ ๋ณด์ด๋ ๋ฐ์ดํฐ(๋ก๊ทธยท๊ด์ ยท์์คํ ๋๊ตฌ) ๋ง์ผ๋ก ํ๋ก์ธ์ค ์๊ณผ OS ์์์ ๋ฌด์จ ์ผ์ด ๋ฒ์ด์ก๋์ง ์ญ์ถ๋ก ํ ์ ์๋์ง๋ฅผ ๋ฌป๋๋ค.
[๊ด์ธก] monitor.log ์ PROC_RSS ๊ฐ 17.7MBโ267.7MB ๋ก ์ฌ๋๊ณ [MemoryGuard] Self-terminating ์ด ์ฐํ๋ค
โ
[์ถ๋ก ] ์ด๋ค ์๋ฃ๊ตฌ์กฐ ์์์, ์ด๋ค ์ ์ฑ
์ด, ๋๊ตฌ๋ฅผ, ์ด๋ค ์๊ทธ๋๋ก ์ฃฝ์๋๊ฐ?
โ
[์ฆ๋ช
] /proc, ps, top ์ผ๋ก ๊ทธ ์ถ๋ก ์ ๋ท๋ฐ์นจํ ์ ์๋๊ฐ?
โ
[์ํต] ์ 3๋จ๊ณ๋ฅผ ๋๋ฃ ๊ฐ๋ฐ์๊ฐ 30์ด๋ง์ ๋ฐ๋ผ์ฌ ์ ์๋ Issue ๋ก ์ ๋ฆฌํ๋๊ฐ?
๋ฐ๋ผ์ ๋ฏธ์ ์ ์ฐ์ถ๋ฌผ์ ๋ฆฌํฌํธ(.md) ๋ค. ํ์ง๋ง ์ง์ง ์ธก์ ๋์์ ํ์ต์๊ฐ ์ด์์ฒด์ ๋์ ์๋ฆฌ ๋ฅผ ์๊ธฐ ์ธ์ด๋ก ์ค๋ช ํ ์ ์๊ฒ ๋๋๊ฐ์ด๋ค. ๊ทธ๋์ ๋ณธ ์ ์ฅ์๋ ๋ฆฌํฌํธ์ ํจ๊ป ์ด๋ก ์ง์ ๋ฌธ์๋ฅผ ํต์ฌ ์ฐ์ถ๋ฌผ๋ก ํฌํจํ๋ค.
์๋ฃ ํ ํ์ต์๋ ๋ค์์ ์๊ธฐ ๋ง๋ก ์ค๋ช ํ ์ ์์ด์ผ ํ๋ค:
- ๊ฐ์ ๋ฉ๋ชจ๋ฆฌยทHeapยทRSSยทOOM Killerยท์ฑ ์์ฒด MemoryGuard ์ ๊ด๊ณ
- ํน์ ํ๋ก์ธ์ค์ CPU ๊ณผ์ ์ ๊ฐ ์์คํ ์ง์ฐ์ ์ ๋ฐํ๋ ์๋ฆฌ, CFS ์ค์ผ์ค๋ฌ์ ๊ธฐ๋ณธ ์ง๊ด
- ๋ฐ๋๋ฝ 4๋ ์กฐ๊ฑด(์ํธ๋ฐฐ์ ยท์ ์ ๋๊ธฐยท๋น์ ์ ยท์ํ๋๊ธฐ), ์ธ๋ถ ๋๊ตฌ๋ก ๋ฐ๋๋ฝ์ ์ฆ๋ช ํ๋ 6๊ฐ์ง ์ฆ๊ฑฐ
- ๋ก๊ทธยท๊ด์ ๋ฐ์ดํฐ๋ฅผ ๊ทผ๊ฑฐ๋ก GitHub Issue ํํ๋ก ๋๋ฃ์ ์ํตํ๋ ๋ฐฉ๋ฒ
์ด๋ก ์ ๋ฐฐ๊ฒฝ์ docs/md/์ด๋ก _์ง์.md ์ ๊น์ด ์ ๋ฆฌ๋ผ ์๋ค โ ๋ฆฌํฌํธ๋ฅผ ์ฐ๊ธฐ ์ ์ ํ ๋ฒ ํต๋ ํ ๊ฒ.
codyssey_B1-2/
โโโ README.md โ ์ด ํ์ผ (๋ฏธ์
๊ฐ์ + ์ํ ๋ฐฉ๋ฒ)
โโโ ์คํ_์ ์ฐจ์.md โ 3๊ฐ ์ฅ์ ์ฌํยท๊ฒ์ฆ ์ ์ฐจ
โโโ demo.sh โ (macOS) OrbStack ์๋ ์์ฐ ๋ํผ โ ํ ์ค๋ก ์ ์ฒด ์คํ
โโโ verify_orbstack.sh โ (macOS) ๋จธ์ ์์ฑโsetupโ๋ถํธโ์คํโ์ฆ๊ฑฐ ์์ง ๋๋ผ์ด๋ฒ
โ
โโโ docs/
โ โโโ md/
โ โ โโโ ์ด๋ก _์ง์.md โ ์ปดํจํฐ ๊ตฌ์กฐ ยท ๋ฉ๋ชจ๋ฆฌ ยท CPU ยท ๋์์ฑ (ํ๋
)
โ โ โโโ ์ฉ์ด์ง.md โ ๋ฏธ์
์ ๋์ค๋ ์ฉ์ด ์ ์
โ โ โโโ ํ๊ฐ_๋ฌธํญ.md โ ๊ตฌ์ ํ๊ฐ ๋๋น ๋ฌธ๋ต
โ โ โโโ ์๊ตฌ์ฌํญ_ID_๋งคํ.md โ B1-2-* ์์ฒด ID โ ๋ช
์ธ ์๋ฌธ ID(R/D/E/B) ๋์กฐํ
โ โโโ html/
โ โโโ index.html โ tools/build_docs.py ๊ฐ ์์ฑํ๋ ์ ์ ์ฌ์ดํธ
โ
โโโ reports/ โ GitHub Issue ํ์ ๋ถ์ ๋ฆฌํฌํธ (์ ์ถ ์ฐ์ถ๋ฌผ)
โ โโโ 01_oom_report.md
โ โโโ 02_cpu_report.md
โ โโโ 03_deadlock_report.md
โ โโโ 04_scheduling_analysis.md โ ๋ณด๋์ค (์ค์ผ์ค๋ง ์ถ๋ก )
โ
โโโ evidence/ โ ๋ฆฌํฌํธ๊ฐ ์ธ์ฉํ ๋ก๊ทธยท๋ช
๋ น์ด ์ถ๋ ฅ ์๋ณธ
โ โโโ oom_monitor.log / oom_app.log / oom_ps_top.txt
โ โโโ cpu_monitor.log / cpu_app.log / cpu_top_ps.txt
โ โโโ deadlock_monitor.log / deadlock_app.log / deadlock_ps_top.txt
โ โโโ scheduling_workers.log / scheduling_top_h.txt
โ
โโโ bin/ โ ์คํ์ ์ค์ ๋ก ์ด agent-leak-app (์ฌํ์ฑ ์ํด git ์ถ์ )
โ โโโ agent-leak-app โ md5 0fb02e12554328b32e6e1adac861630e
โ evidence/ ์ ํ์ผ ํค๋๊ฐ ๊ธฐ๋กํ ํด์์ ๋์ผ =
โ ์ ์ถ ๋ก๊ทธ๊ฐ ์ด ํ์ผ์์ ๋์์์ด ์ฆ๋ช
๋๋ค
โ
โโโ src/ โ B1-1 ์์ ๊ฐ์ ธ์จ ์ธํ๋ผ ์๋ํ ์คํฌ๋ฆฝํธ
โ โโโ monitor.sh โ ์์คํ
์ํ ์์งยท๋ก๊น
(cron ๋งค๋ถ)
โ โโโ report.sh โ monitor.log ํต๊ณ ์ถ๋ ฅ
โ โโโ archive_logs.sh โ ์๊ฐ ๊ธฐ๋ฐ ๋ก๊ทธ ๋ณด์กด ์ ์ฑ
โ โโโ 00_run_all.sh โ 01~07 setup ๋จ๊ณ๋ฅผ ํ ๋ฒ์ ์คํ
โ โโโ 01_ssh_hardening.sh โ SSH ํฌํธ 20022 + Root ์ฐจ๋จ
โ โโโ 02_firewall_allowlist.sh โ UFW ํ์ดํธ๋ฆฌ์คํธ (20022/15034)
โ โโโ 03_users_and_groups.sh โ ๊ณ์ 3์ข
+ ๊ทธ๋ฃน 2์ข
โ โโโ 04_directories_and_acl.sh โ ๋๋ ํ ๋ฆฌ + ACL
โ โโโ 05_env_and_keyfile.sh โ B1-2 ์ฌ์ env 5์ข
+ ์คํ์ฉ 3์ข
+ secret.key
โ โโโ 06_deploy_app_and_scripts.sh โ agent-leak-app + *.sh ๋ฐฐํฌ (B1-2 ๋ฒ์ )
โ โโโ 07_cron_schedule.sh โ cron ๋งค๋ถ/๋งค์ผ ๋ฑ๋ก
โ โโโ experiments/ โ ์คํ_์ ์ฐจ์.md ๋ฅผ ์๋ ์ํํ๋ ๊ฒ์ฆ ํ์ดํ๋ผ์ธ
โ โโโ 00_run_experiments.sh โ 4๊ฐ ์คํ ์ผ๊ด/๊ฐ๋ณ ์คํ ์ค์ผ์คํธ๋ ์ดํฐ
โ โโโ lib_experiment.sh โ ๊ณตํต ๋๊ตฌ (์ค์ ยท๊ด์ธก ๋ฃจํยท์ฆ๊ฑฐ ์ค๋
์ทยท์์ฝ) โ ์ง์ ์คํ ์ ํจ
โ โโโ 01_oom.sh โ OOM ์ฌํยท๊ฒ์ฆ (MEMORY_LIMIT 256โ512)
โ โโโ 02_cpu.sh โ CPU ๊ณผ์ ์ ์ฌํยท๊ฒ์ฆ (CPU_MAX_OCCUPY 80โ10)
โ โโโ 03_deadlock.sh โ Deadlock(freeze) ์ฌํยท๊ฒ์ฆ (MULTI_THREAD_ENABLE trueโfalse)
โ โโโ 04_scheduling.sh โ ์ค์ผ์ค๋ง ์ถ๋ก ๋ฐ์ดํฐ ์์ง (๋ณด๋์ค)
โ
โโโ tools/
โโโ build_docs.py โ .md โ docs/html/index.html ๋น๋ (๊ณผ์ ์ฐ์ถ๋ฌผ ์๋ โ ยง7 ์ฐธ๊ณ )
โโโ check_req_ids.sh โ ์ฐ์ด๋ B1-2-* ID ๊ฐ ๋งคํํ์ ์ ๋ถ ์๋์ง ๊ฒ์ฌ (์์ผ๋ฉด exit 1)
B1-1 ๊ณผ ๊ฐ์ฅ ํฐ ์ฐจ์ด๋ ๋ ๊ฐ์ง๋ค:
src/05_env_and_keyfile.sh๊ฐ B1-2 ์ฌ์์ผ๋ก ๋ฐ๋์๋ค (key ํ์ผ๋ช , key ๊ฒฝ๋ก ์๋ฏธ, ์คํ์ฉ ENV 3์ข ์ถ๊ฐ).src/06_deploy_app_and_scripts.sh์ ๋ฐ์ด๋๋ฆฌ ์ด๋ฆ์ดagent-leak-app์ผ๋ก ๋ฐ๋์๋ค. ๋ฐ์ด๋๋ฆฌ๋bin/agent-leak-app์ผ๋ก ์ด ์ ์ฅ์์ ํฌํจ๋ผ ์๋ค(md50fb02e12554328b32e6e1adac861630e) โ ์ ์ถ evidence ์ ํค๋ ํด์์ ๊ฐ์ ํ์ผ์ด๋ผ, ํด๋ก ๋ง ํ๋ฉด ๊ฐ์ ์คํ์ ๊ทธ๋๋ก ์ฌํํ ์ ์๋ค. ๋ค๋ฅธ ๋น๋(x86/arm64)๋ก ๋ฐ๊พธ๋ ค๋ฉด ๊ฐ์ ๊ฒฝ๋ก์ ๋ฎ์ด์ฐ๋ฉด ๋๋ค.
์ด์ ์ธก์์ ์ ๊ณตํ agent-leak-app ์ ๋ถํธ ์ํ์ค์์ ์๋ ํญ๋ชฉ์ ๋ชจ๋ ๊ฒ์ฌํ๊ณ , ํ๋๋ผ๋ ์คํจํ๋ฉด ์๋ ๋ถํ
์คํจ ์ฒ๋ฆฌ๋๋ค.
| ํญ๋ชฉ | ์กฐ๊ฑด |
|---|---|
| ์คํ ๊ณ์ | root ๊ธ์ง, ์ผ๋ฐ ์ฌ์ฉ์ (์: agent-admin) |
AGENT_HOME |
ํ์ ํ๊ฒฝ๋ณ์ |
AGENT_PORT |
15034 ๊ณ ์ |
AGENT_UPLOAD_DIR |
$AGENT_HOME/upload_files (๋๋ ํ ๋ฆฌ ์กด์ฌ) |
AGENT_KEY_PATH |
$AGENT_HOME/api_keys (๊ฒฝ๋ก ์กด์ฌ) โ B1-1 ๊ณผ ๋ฌ๋ฆฌ ๋๋ ํ ๋ฆฌ |
AGENT_LOG_DIR |
๋๋ ํ ๋ฆฌ ์กด์ฌ + ์ฐ๊ธฐ ๊ถํ |
MEMORY_LIMIT |
์ ์, 50~512 (MB) |
CPU_MAX_OCCUPY |
์ ์, 10~100 (%) |
MULTI_THREAD_ENABLE |
true/false, 1/0, yes/no ํ์ฉ |
secret.key ํ์ผ |
$AGENT_HOME/api_keys/secret.key, ๋ด์ฉ = agent_api_key_test |
| ๋คํธ์ํฌ | 0.0.0.0:15034 ๋ฐ์ธ๋ฉ ๊ฐ๋ฅ |
.bashrc ์์ (src/05_env_and_keyfile.sh ๊ฐ ์๋ ๋ฑ๋ก):
export AGENT_HOME="/home/agent-admin/agent-app"
export AGENT_PORT="15034"
export AGENT_UPLOAD_DIR="$AGENT_HOME/upload_files"
export AGENT_KEY_PATH="$AGENT_HOME/api_keys"
export AGENT_LOG_DIR="/var/log/agent-app"
# ๋ฒ ์ด์ค๋ผ์ธ (์ ์ ๊ฐ๋) โ ์คํ ์ ์คํ_์ ์ฐจ์.md ์กฐํฉํ๋๋ก ๋ฐ๊ฟ์ ์ฌ์คํ
# CPU_MAX_OCCUPY ๋ 10 ์ด์ด์ผ [Healthy System Monitoring] ์ด ์ ํ๋๋ค.
# 95 ๋ก ๋๋ฉด CPU ๊ณผ์ ์ ์๋๋ฆฌ์ค๊ฐ ๊ณจ๋ผ์ ธ 34์ด ๋ง์ ์ฃฝ๋๋ค(exit 143). ์คํ_์ ์ฐจ์.md ยง์กฐํฉํ ์ฐธ๊ณ .
export MEMORY_LIMIT="512"
export CPU_MAX_OCCUPY="10"
export MULTI_THREAD_ENABLE="false"[1] ์ ์ ๊ฐ๋ (Baseline ์์ง)
โ monitor.sh ๊ฐ 1๋ถ ๋จ์๋ก CPU/MEM/DISK ๋ก๊ทธ
โผ
[2] ์ฅ์ ๊ด์ธก (Symptom)
โ - OOM: ๋ฉ๋ชจ๋ฆฌ ์ ํ ์ฆ๊ฐ โ ์ข
๋ฃ
โ - CPU: CPU% ๊ธ์์น โ SIGTERM
โ - Deadlock: PID ์ด์์์ง๋ง ๋ก๊ทธ/๋ฆฌ์์ค ์ ์ง
โผ
[3] ์ฆ๊ฑฐ ์์ง (Evidence)
โ monitor.log + agent-leak-app ์คํ ๋ก๊ทธ + ps/top
โผ
[4] ์์ธ ์ถ๋ก (Root Cause)
โ OS ๋์ ์๋ฆฌ + ์ฑ ์ ์ฑ
๋งคํ
โ โ ๋งํ๋ฉด docs/md/์ด๋ก _์ง์.md ์ฌ์ฐธ์กฐ
โผ
[5] ์์ ์กฐ์น & ์ฌ๊ฒ์ฆ (Workaround)
โ ํ๊ฒฝ๋ณ์ ์กฐ์ โ ์ฌ์คํ โ Before/After ๋น๊ต
โผ
[6] GitHub Issue ์์ฑ (reports/*.md)
bin/agent-leak-app ์ ์ด๋ฏธ ์ ์ฅ์์ ๋ค์ด ์๋ค. ํด๋ก ํ ๊ทธ๋๋ก, ๋จธ์ ์์ฑ โ ยง1~ยง7 setup โ
agent-leak-app ๋ถํธ ๊ฒ์ฆ โ monitor/cron ํ์ธ โ 3๋ ์ฅ์ ์คํ โ ์ฆ๊ฑฐ ์์ง๊น์ง ํ ๋ฒ์ ๋๋ฆฐ๋ค.
์ฆ๊ฑฐ๋ ./.verify-artifacts/ ์ ๋ชจ์ธ๋ค.
# bin/agent-leak-app ์ ์ด๋ฏธ ํฌํจ๋ผ ์๋ค. ๋ค๋ฅธ ๋น๋๋ก ๊ต์ฒดํ ๋๋ง:
# cp ~/Downloads/agent-leak-app bin/agent-leak-app
./demo.sh # ์์ฐ ๋ชจ๋(์น์
๋ง๋ค ์ํฐ) + ์คํ ์ ์ฒด(์ค์ธก)
./demo.sh --quick # ์ฅ์ ์คํ ๋๊ธฐ์๊ฐ ๋จ์ถ (๋ผ์ด๋ธ ์์ฐ ๊ถ์ฅ)
./demo.sh --no-exp # setup + ๋ถํธ ๊ฒ์ฆ๊น์ง๋ง (์คํ ์๋ต)
./demo.sh --fast # ์ผ์์ ์ง ์์ด ๋๊น์ง (CI ์ฒ๋ผ)
# demo.sh ์์ด ๋๋ผ์ด๋ฒ๋ง ์ง์ :
./verify_orbstack.sh # ์คํ ์ ์ฒด(์ค์ธก โ OOM โค25๋ถ ๋ฑ ๋งค์ฐ ๊น)
QUICK=1 ./verify_orbstack.sh # ์คํ ๋จ์ถ
RUN_EXPERIMENTS=0 ./verify_orbstack.sh # setup+๋ถํธ๋ง
FRESH=1 ./verify_orbstack.sh # ๋จธ์ ๊นจ๋์ด ์ฌ์์ฑโ ์คํ '์ ์ฒด(์ค์ธก)' ๋ ์๋์ ์ผ๋ก ์ฅ์ ๋ฅผ ์ฌํํ๋ฏ๋ก ๋งค์ฐ ์ค๋ ๊ฑธ๋ฆฐ๋ค (OOM โค25๋ถ / CPU โค15๋ถ / Deadlock โค10๋ถ). ๋น ๋ฅธ ํ์ธ์
--quick๋๋--no-exp.
# macOS ํธ์คํธ
brew install orbstack
orb create ubuntu:24.04 codyssey-b1-2
# bin/agent-leak-app ์ ์ ์ฅ์์ ํฌํจ๋ผ ์๋ค (๊ต์ฒดํ ๋๋ง cp)
orb push -m codyssey-b1-2 src/*.sh bin/agent-leak-app /tmp/
orb shell -m codyssey-b1-2
# ๋จธ์ ์์์ (CRLF ์ ๋ฆฌ ํ setup)
sudo apt-get install -y dos2unix
dos2unix /tmp/*.sh && chmod +x /tmp/*.sh
bash /tmp/00_run_all.sh # 7๋จ๊ณ setup ํ ๋ฒ์sudo -iu agent-admin
cd $AGENT_HOME
./agent-leak-app # ๋ชจ๋ [OK] ๊ฐ ๋ ์ผ ์ ์์ธ ๊ฐ์ง ์ฅ์ ๋ฅผ ์์๋๋ก ์ฌํํ๋ ํ๊ฒฝ๋ณ์ ์กฐํฉ๊ณผ ๊ฒ์ฆ ๋ช ๋ น์ ์คํ_์ ์ฐจ์.md ์ ์ ๋ฆฌ๋ผ ์๋ค.
# ํ ์ค ์์ฝ
# (์๋ ์๊ฐยท์๊ทธ๋์ฒ๋ 2026-08-26 ์ค์ธก๊ฐ. ๋๋จธ์ง ๋ ๋ณ์๋ ์์ ๊ฐ MEMORY_LIMIT=512 / CPU_MAX_OCCUPY=10 ๊ณ ์ )
# OOM : MEMORY_LIMIT=256 โ 0m34s ํ exit 137, [MemoryGuard] Memory limit exceeded + Self-terminating
# CPU : CPU_MAX_OCCUPY=80 โ 0m30s ํ exit 143, [CpuWorker] CPU Threshold Violated!
# Deadlock: MULTI_THREAD_ENABLE=true โ ๋ถํ
์ฝ 9์ด ํ ๋ฌด์๋ต (PID ์์กด, ์๊ฐ ์ข
๋ฃ ์์)์ ์ ์ฐจ๋ฅผ ์ฌ๋ ์ ์์ด ์๋ ์ํํ๋ ค๋ฉด src/experiments/ ์ ํ์ดํ๋ผ์ธ์ ์ด๋ค (ํ๊ฒฝ๋ณ์ ์ค์ โ ์ฑ ์คํ โ ์์ ์ํ๋ง โ ps/top/curl ์ฆ๊ฑฐ ์บก์ฒ โ ์ข ๋ฃ/freeze ํ์ โ Before/After ๋น๊ต โ PASS/FAIL ์์ฝ):
cd $AGENT_HOME/experiments # ๋๋ src/experiments ๋ฅผ ๋จธ์ ์ ํธ์ํ ๊ฒฝ๋ก
bash 00_run_experiments.sh selftest # ์ฑ ์ ๋์ฐ๊ณ ํ๊ฒฝ/๊ถํ๋ง ์ ๊ฒ
bash 00_run_experiments.sh all # 4๊ฐ ํ์ดํ๋ผ์ธ ์ผ๊ด (oomโcpuโdeadlockโscheduling)
bash 01_oom.sh # ํ์ดํ๋ผ์ธ ํ๋๋ง ๋จ๋
์คํ
QUICK=1 bash 00_run_experiments.sh all # ๋๊ธฐ์๊ฐ ๋จ์ถ (๋ฐฐ์ ํ์ธยท๋ฐ๋ชจ์ฉ)# ๋ค๋ฅธ ํฐ๋ฏธ๋
tail -f /var/log/agent-app/monitor.log # cron ๋งค๋ถ ๋์
tail -f $AGENT_LOG_DIR/agent_app.log # ์ฑ ์์ฒด ๋ก๊ทธ (์ฑ์ด ์ง์ append)
tail -f $AGENT_LOG_DIR/agent_app.out # nohup stdout (๋ถํธ ์ํ์ค [1/6]~[6/6])๋ผ์ด๋ธ ๊ด์ฐฐ๋ง์ผ๋ก๋ ๋ฆฌํฌํธ์ ๋ฃ์ ์์น๊ฐ ์ ๋์จ๋ค. monitor.log ์์ ์ถ์ธ๋ฅผ ๋ฝ๊ฑฐ๋(grep/awk), src/report.sh ๋ก ๊ตฌ๊ฐ ํต๊ณ(Max/Minยท๋๋ฌ ์๊ฐยทํ๊ท )๋ฅผ ์ฐ์ถํ๋ค:
# ํน์ PID ์ PROC_RSS(MB) ์๊ณ์ด๋ง ์ถ์ถ (Evidence ํ/๊ทธ๋ํ ์ฌ๋ฃ)
# monitor.log ํฌ๋งท: [TS] PID:n SYS_CPU:x% SYS_MEM:y% PROC_CPU:z% PROC_RSS:wMB DISK_USED:d%
# SYS_* = ํธ์คํธ ์ ์ฒด / PROC_* = ๋์ ํ๋ก์ธ์ค. ํ๋ก์ธ์ค ๋ฉ๋ชจ๋ฆฌ ์ฆ๊ฐ์ ๊ทผ๊ฑฐ๋ PROC_RSS ๋ค.
grep "PID:<pid>" /var/log/agent-app/monitor.log | awk -F'PROC_RSS:' '{print $2}' | awk -F'MB' '{print $1}'
# ๊ตฌ๊ฐ ํต๊ณ โ ====== STATISTICS REPORT ====== ([Process RSS] Maximum โฆ MB at โฆ )
bash src/report.sh # ์ ์ฒด
bash src/report.sh "2026-08-26 09:02:37" "2026-08-26 09:03:11" # ๊ตฌ๊ฐ ์ง์ (OOM Before ์ค์ธก ๊ตฌ๊ฐ)์ธ ๋ฆฌํฌํธ ๋ชจ๋ ๋์ผํ 4๋จ ๊ตฌ์กฐ๋ก ์ด๋ค:
[Bug] {์ฅ์ ์ ํ} - {ํ ์ค ์์ฝ}
## 1. Description (ํ์ ์ค๋ช
)
- ๋ฌด์์ด, ์ธ์ , ์ด๋ค ์กฐ๊ฑด์์ ๋ฐ์ํ๋
## 2. Evidence & Logs (์ฆ๊ฑฐ ์๋ฃ)
- monitor.log ๋ฐ์ท (์์น)
- ์ฑ ๋ก๊ทธ ํต์ฌ ๋ผ์ธ ๋ฐ์ท
- ps/top ์ถ๋ ฅ
## 3. Root Cause Analysis (์์ธ ๋ถ์)
- ์ ์ฆ๊ฑฐ๊ฐ OS ๋์ ์๋ฆฌ๋ก ์ด๋ป๊ฒ ์ค๋ช
๋๋๊ฐ
- (์ด๋ก _์ง์.md ์ ์ด๋ ๋ถ๋ถ์ ๋์ด์๋์ง ์๊ธฐ ์ธ์ด๋ก ์ ๊ธฐ)
## 4. Workaround & Verification (์กฐ์น ๋ฐ ๊ฒ์ฆ)
- ์ด๋ค ํ๊ฒฝ๋ณ์๋ฅผ ์ด๋ป๊ฒ ๋ฐ๊ฟจ๊ณ
- Before / After ๊ฒฐ๊ณผ๊ฐ ์ด๋ป๊ฒ ๋ฌ๋ผ์ก๋๊ฐ
- ๊ทผ๋ณธ ํด๊ฒฐ์ ๋ฌด์์ธ๊ฐ (์ ํ)๐ ๋ฆฌํฌํธ์ ํฉ๊ฒฉ์ ์ "๋๋ฃ๊ฐ 30์ด ์์ ๋ฐ๋ผ์ฌ ์ ์๋๊ฐ" ๋ค. 4๋จ ๊ตฌ์กฐ์ ๊ฐ ์น์ ์ ํ ๋ฒ์ ํ ๊ฐ์ง ์ฌ์ค๋ง ์ ๋, ๊ทธ ์ฌ์ค์ ๊ทผ๊ฑฐ๋ฅผ evidence/ ํ์ผ๊ณผ 1:1 ๋ก ์ฐ๊ฒฐ๋๊ฒ ์ธ์ฉํ๋ค.
- ์ฌ์ฉ ๊ฐ๋ฅ ๋๊ตฌ:
monitor.sh,ps,top,htop,pstree,kill,vmstat,/proc๋ฑ ๋ฆฌ๋ ์ค ํ์ค ๋๊ตฌ - ๋ฐ์ด๋๋ฆฌ ๋์ปดํ์ผ/๋ฆฌ๋ฒ์ค ์์ง๋์ด๋ง ๊ธ์ง โ ์ธ๋ถ ๊ด์ธก ์ ๋ณด(๋ก๊ทธ/๊ด์ )๋ง์ผ๋ก ์ถ๋ก
- ์ผ๋ฐ ๊ณ์ ์ผ๋ก๋ง ์คํ (root ๊ธ์ง)
- ๋ถ์ยท๊ด์ ยท๊ฒ์ฆ ์๋ํ ์คํฌ๋ฆฝํธ๋ Bash ๋ก๋ง โ
src/**,verify_orbstack.sh,demo.sh,tools/check_req_ids.sh๊ฐ ์ ๋ถ ์ฌ๊ธฐ์ ํด๋นํ๊ณ ์์ธ ์์ด Bash ๋ค- ์์ธ๋
tools/build_docs.pyํ๋๋ฟ์ด๋ค. ์ด๊ฒ์ ๊ณผ์ ์ฐ์ถ๋ฌผ์ด ์๋๋ผ ๋ฌธ์ HTML ๋น๋๋ก, ์ฅ์ ์ฌํยท๊ด์ ยท์ฆ๊ฑฐ ์์ง ๊ฒฝ๋ก ๋ฐ๊นฅ์ ์๋ค. ํ ๋ฒ๋ ์คํํ์ง ์์๋ ๋ฆฌํฌํธ์ evidence ๋ ๊ทธ๋๋ก ์์ ํ๋ค (ยง9 ๋ฌธ์ ๋น๋ ์ฐธ๊ณ )
- ์์ธ๋
| ์ฅ์ | ์ฆ๊ฑฐ |
|---|---|
| OOM | monitor.log PROC_RSS ์ ํ ์ฆ๊ฐ ๊ตฌ๊ฐ(SYS_MEM ์๋) + [MemoryGuard] Memory limit exceeded / Self-terminating process โฆ ๋ก๊ทธ + ์ข
๋ฃ ์ฝ๋ 137 + MEMORY_LIMIT ๋ณ๊ฒฝ ์ /ํ ์์กด์๊ฐ ๋น๊ต |
| CPU | [CpuWorker] Current Load ์์น ๊ณ์ด + /proc/<pid>/stat ๋ธํ๋ก ์ฐ ํ๋ก์ธ์ค CPU(ํธ์คํธ ์ ์ฒด์ ๋์กฐ) + [CpuWorker] CPU Threshold Violated! ๋ก๊ทธ + ์ข
๋ฃ ์ฝ๋ 143 + CPU_MAX_OCCUPY ๋ณ๊ฒฝ ์ /ํ ๋น๊ต |
| Deadlock | ps -ef | grep agent PID ์กด์ฌ + top -H ์ค๋ ๋ TIME+ ์ ์ง + ps -L -o wchan ์ futex_wait_queue(์ ์ค๋ ๋) + ์ฑ ๋ก๊ทธ mtime ์ ์ง + ๋ง์ง๋ง WAITING/BLOCKED ๋ก๊ทธ + MULTI_THREAD_ENABLE=false ํํผ ํ์ธ |
| (๋ณด๋์ค) ์ค์ผ์ค๋ง | ์์ปค ์ค๋ ๋ ๋ก๊ทธ์ ํ์์คํฌํ + ์งํ๋ฅ ํจํด โ RR / FCFS / Priority / CFS ์ค ์ด๋ ์๊ทธ๋์ฒ์ธ์ง |
์ธ ๊ฐ์ .md (์ด ํ์ผ, ์คํ_์ ์ฐจ์, ์ด๋ก _์ง์) ์ 4๊ฐ ๋ฆฌํฌํธ๋ฅผ ๋ฌถ์ด ๋ณด๊ธฐ ์ข์ ์ ์ HTML ๋ก ๋น๋:
# ์์กด์ฑ (Python 3 + markdown + pygments)
pip install markdown pygments
python3 tools/build_docs.py # docs/html/index.html ์์ฑ
# Windows: ๋๋ธํด๋ฆญ์ผ๋ก ์ด๊ธฐ / macOS: open docs/html/index.html์์ฑ๋ docs/html/index.html ์ ๋จ์ผ ํ์ผยท์ธ๋ถ ํ์ผ ์์ ์ผ๋ก ๋ง๋ค์ด์ ธ ์ด๋๋ก ์ฎ๊ฒจ๋ ๊ทธ๋๋ก ์ด๋ฆฐ๋ค. ์ข์ธก ์ฌ์ด๋๋ฐ์์ ๋ฌธ์ ๊ฐ ์ด๋ + ์ฐ์ธก์ ํ์ฌ ๋ฌธ์ ๋ชฉ์ฐจ๊ฐ ๊ฐ์ด ๋ณด์ธ๋ค.
๋ฆฌํฌํธยท์ฆ๊ฑฐ๊ฐ ์ฐ๋ ์์ฒด ID(B1-2-A1 ๋ฑ)๊ฐ docs/md/์๊ตฌ์ฌํญ_ID_๋งคํ.md ์
์ ๋ถ ์ ์๋ผ ์๋์ง ๊ฒ์ฌํ๋ค. ์ค์น๋ ๋คํธ์ํฌ๋ ํ์ ์๊ณ Bash ๋ง ์์ผ๋ฉด ๋๋ค.
bash tools/check_req_ids.sh # ์ ์ ์๋ ID ๊ฐ ํ๋๋ผ๋ ์์ผ๋ฉด exit 1๋ฆฌํฌํธ๋ฅผ ๋ค ์ด ๋ค, ์ด๋ก _์ง์.md ์ ยง8 ํ์ต ์ฒดํฌ๋ฆฌ์คํธ ์ ์ง๋ฌธ๋ค์ ์๊ธฐ ์ธ์ด๋ก ๋ตํ ์ ์๋์ง ํ์ธํด๋ณด์. ๋ต์ด ๋งํ๋ ํญ๋ชฉ์ด ์๋ค๋ฉด ๊ทธ ๋ถ๋ถ์ด ์ด๋ฒ ๋ฏธ์ ์์ ๋ ์ฑ์์ผ ํ ์ด๋ก ์ ๋น ๊ณณ์ด๋ค.