함대 운영 편 · 지식베이스 시리즈 중 하나입니다.
⚠ 먼저 밝혀둡니 다. 이 글은 "여러 에이전트로 빠르게 돌리는 법"이 아닙니다. 한 작업을 여러 AI 노드에 나눠 맡기면서 만난 운영의 사각들 — 노드가 조용히 31시간을 멈춰 있던 일, 누가 무엇을 했는지 다섯 번 잘못 짚은 일 — 을 적습니다. 이 실패들은 자랑이 아니라 다음 사람이 며칠을 아끼기 위한 기록입니다. 모든 타임스탬프는 2026-08-11에 파일과 상태 출력에서 직접 확인한 값입니다.
1. 시작은 "한 세션으로는 못 끝낸다"였습니다
22,019건을 40건씩 나누면 분류가 551번 필요합니다. 한 자리에서 그 551번을 다 돌리려 했더니, 한 작업 세션이 띄울 수 있는 하위 일꾼 수에 상한이 있었습니다. 200명을 다 쓰면 그 뒤로는 아무것도 못 띄웁니다. 상한에 부딪히면 작업이 절반쯤에서 멈췄습니다.
그래서 여러 노드에 나눠 맡기기로 했습니다. 각 노드는 별개의 세션이라 자기 몫의 예산을 따로 가집니다. 한 노드가 상한에 닿으면 남은 몫을 다음 노드에 넘기는 릴레이 구조입니다. 그런데 노드를 나누자마자, 한 자리에서는 없던 문제들이 나타났습니다.
2. 그래서 이번에 정한 질문 하나
"몇 개의 노드를 병렬로 돌릴까"가 아니었습니다. 질문은 이것이었습니다. 노드가 조용히 멈췄을 때, 그 정지를 무엇이 알아차리는가. 노드가 "저 멈췄습니다"라고 말해줄 수 없는 상태로 멈추면, 그 정지는 누가 봐도 보이지 않습니다.
3. 사용한 개념과 도구 — 세 개의 안전장치
밖에서 보면 이 시스템에 들어오는 것은 처리해야 할 조각 목록이고, 나가는 것은 완료된 분류 파일입니다. 그 사이를 세 개의 안전장치가 지탱합니다. 첫째는 노드가 죽어도 남는 파일 자국을 감시 정본으로 삼는 것, 둘째는 한 노드가 막히면 다음 노드로 넘기는 릴레이, 셋째는 누가 무엇을 했는지를 보고가 아니라 증거로 판정하는 것입니다.
릴레이 미완 조각 목록 → 가용한 노드에 위임 → 그 노드가 처리 → 예산 남았는가
감시 처리 중 파일 → 최신 자국 시각 확인 → 정지 여부 판정 → 자국이 움직이나
귀속 완료·수정 사건 → 파일 자국으로 대조 → 어느 노드인지 → 자국이 증언하나4. 실제로 만든 것 — 기능 세 개와, 그 기능이 막는 실패
① 파일 자국을 감시 정본으로 삼았다 — 감시자가 죽으면 정지가 묻히던 것을 막는다
노드의 정지를 그 노드의 보고에 의존하면, 노드가 말을 못 하는 상태로 멈출 때 정지가 보이 지 않습니다. 감시하는 노드 자신이 멈추면 더 나쁩니다. 그래서 감시의 정본을 노드 밖에 두었습니다. 완료된 분류 파일에는 마지막으로 쓰인 시각 자국이 남는데, 이 자국은 노드가 죽어도 그대로 남습니다. 최신 자국이 수십 분 이상 움직이지 않으면 정지로 판정합니다. 노드의 생존과 무관한 이 자국이 없었다면, 조용한 정지를 사람이 우연히 발견할 때까지 놔뒀을 것입니다.
② 미완 몫을 다음 노드로 넘겼다 — 한 노드의 상한에서 전체가 멈추던 것을 막는다
한 노드는 하위 일꾼 예산에도, 사용량 한도에도, 조직 지출 한도에도 걸릴 수 있습니다. 어느 벽이든 그 노드는 거기서 멈춥니다. 그래서 한 노드가 막히면 남은 조각 목록과 검증 규격을 그대로 다음 노드에 넘기는 릴레이로 만들었습니다. 넘겨받는 노드는 낡은 목록을 믿지 않고 완료된 파일부터 세어, 이미 끝난 몫을 다시 돌리지 않습니다. 이 릴레이로 한 노드의 벽이 작업 전체의 벽이 되는 것을 끊었습니다.
③ 누가 했는지를 증거로 판정했다 — 보고 이름표만 믿고 오판하던 것을 막는다
노드 사이 보고에는 "어느 노드가 보낸다"는 이름표가 붙습니다. 그 이름표를 믿고 누가 무엇을 했는지 판정했더니 다섯 번 틀렸습니다. 이름표는 신뢰할 수 없는 정보였습니다. 그래서 노드를 특정할 때는 이름표가 아니라 증거만 쓰게 했습니다. 지금 누가 처리 중인지는 상태 목록의 활동 표시와 파일 자국으로, 누가 무엇을 고쳤는지는 파일 자국과 그 시각에 활동하던 노드로 봅니다. 보고가 아니라 파일이 정본입니다.
5. 지금까지 관찰된 결과 (실측 · 명령을 같이 적습니다)
수치는 만들지 않았습니다. 아래는 파일 자국과 상태 출력에서 확 인한 값입니다.
wc -l 로 목록 계수가장 아팠던 것은 조용한 정지였습니다. 한 노드가 사용량 한도에 걸려 멈췄는데, 그 정지를 감시하던 노드마저 곧이어 만료됐습니다. 감시기는 "멈췄다"는 신호를 계속 냈지만, 감시하는 노드가 턴을 받지 못해 그 신호가 배달되지 않았습니다. 그 결과 31시간 21분 동안 아무도 정지를 몰랐습니다. 자기 시계로는 20시간으로 셌지만, 감시기가 늦게 떠서 앞의 11시간을 못 봤습니다. 자기 시계로 잰 공백은 실제값이 아니라 하한이었습니다.
중복 착수 여섯 조각도 같은 뿌리였습니다. "저 노드가 이미 처리했다"는 잘못된 전제로 같은 조각을 다시 맡겼던 것입니다. 이름표로 귀속을 판정한 대가였습니다.
6. 따라 해보고 싶으시면 — 가장 작은 형태부터
여러 노드로 오래 돌리는 작업을 안전하게 만드는 최소 형태는 이렇습니다.
- 진행 상태를 노드의 기억이 아니라 파일에 둡니다. 노드가 죽어도 파일은 남습니다.
- 감시의 정본을 감시자 밖에 둡니다. 파일이 마지막으로 쓰인 시각을 보면, 감시하는 노드가 죽어도 정지를 알 수 있습니다.
- 깨우는 주체를 명시적으로 정합니다. 사용량 한도는 저절로 풀려도 작업이 저절로 재개되지는 않습니다. 누가 다시 맡길지 미리 정해두지 않으면 그대로 멈춰 있습니다.
- 누가 무엇을 했는지는 보고가 아니라 파일 자국으로 판정합니다. 이름표는 틀릴 수 있습니다.
7. 판정은 네 가지로 나누십시오 (두 가지로는 부족합니다)
노드 상태를 "돈다/멈췄다"로만 보면, 조용한 정지가 "돌고 있다"로 집계됩니다.
PASS 파일 자국이 최근 수 분 안에 움직였다 (정상 진행)
PASS_WITH_NOTE 자국은 멈췄으나 사용량 한도라 재개 예정 (정상 대기)
HOLD 정지 원인을 확정 못 함 (자국·상태·health 가 어긋남)
FAIL 정지가 감시자 밖 증거로 확인됐고 깨울 주체가 없다이 시리즈의 함대 운영은 31시간 정지 1회 외에는 PASS 였고, 그 1회가 FAIL 이었습니다.
8. 한계와 대가 (얻은 것 옆에 잃은 것)
여러 노드로 완주한 대신 분명히 잃은 것이 있습니다.
노드마다 자격증명이 다르면 사용량 한도가 노드별로 따로 놉니다. 그래서 한 노드의 화면에 뜬 한도 경고가 다른 노드에는 없습니다. 이 차이를 오류로 오해하기 쉽고, 실제로 한 노드는 이것을 "정본 미확정"으로 잘못 보고했습니다. 노드별 한도를 사건마다 확인하는 비용이 붙습니다.
깨우는 일에 사람이 개입해야 합니다. 사용량 한도는 시간이 지나면 풀리지만, 작업은 저절로 재개되지 않았습니다. 위 31시간 정지가 끝난 것도 사람이 다시 맡겼기 때문입니다. 완전한 무인 운영은 아직 못 만들었습니다.
그리고 자기보고를 진행 근거로 쓰는 설계를 버렸습니다. 처음에는 노드가 "몇 건 끝냈다"고 보고하면 그대로 진행 상태로 썼습니다. 그런데 보고와 실제 파일이 어긋나는 일이 반복돼, 보고 대신 파일을 세는 쪽으로 바꿨습니다. 이름표로 노드를 귀속하던 방식도 같이 버렸습니다. 다섯 번 틀린 뒤였습니다.
한 가지 더 자랑하지 않겠습니다. 정지를 자동으로 감지해 스스로 다음 노드에 넘기는 완전 자동 릴레이는 설계 완료까지만 했고, 무인으로 검증하지는 못했습니다. 지금은 사람이 파일 자국을 보고 재위임합니다.
9. 결론 — 가져가실 규칙 세 개
첫째, 감시의 정본을 감시자 안에 두지 마십시오. 감시하는 쪽이 멈추면 대상의 정지도 함께 묻힙니다. 노드가 죽어도 남는 것 — 파일 자국, 외부 상태 기록 — 을 정본으로 삼아야 조용한 정지가 드러납니다.
둘째, 자기 시계로 잰 공백은 하한입니다. 감시기가 늦게 떴으면 앞 구간을 통째로 못 봅니다. 20시간으로 셌는데 실제는 31시간이었던 것처럼, 자기가 잰 시간을 실제값으로 믿지 마십시오.
셋째, 누가 무엇을 했는지는 이름표가 아니라 자국으로 판정하십시오. 보고에 붙은 이름표는 틀릴 수 있고, 그 오판은 공적을 엉뚱한 데 돌리는 것으로 끝나지 않습니다. "저 노드가 이미 했다"는 잘못된 전제가 중복 착수와 누락을 만듭니다.
10. 참고
이 글에서 "감시자 밖에 정본을 둔다"는 원칙은 시스템 감시에서 흔히 쓰는 것으로, 감시 대상과 감시 주체의 장애를 분리하는 설계입니다. 파일이 마지막으로 쓰인 시각으로 정지를 판정하는 것은 그 작은 형태이며, 별도의 상태 저장 없이도 동작합니다.