감시자가 멈추면, 대상의 정지도 함께 묻힙니다

함대 운영 편 · 지식베이스 시리즈 중 하나입니다.

먼저 밝혀둡니다. 이 글은 "여러 에이전트로 빠르게 돌리는 법"이 아닙니다. 한 작업을 여러 AI 노드에 나눠 맡기면서 만난 운영의 사각들 — 노드가 조용히 31시간을 멈춰 있던 일, 누가 무엇을 했는지 다섯 번 잘못 짚은 일 — 을 적습니다. 이 실패들은 자랑이 아니라 다음 사람이 며칠을 아끼기 위한 기록입니다. 모든 타임스탬프는 2026-08-11에 파일과 상태 출력에서 직접 확인한 값입니다.


1. 시작은 "한 세션으로는 못 끝낸다"였습니다

22,019건을 40건씩 나누면 분류가 551번 필요합니다. 한 자리에서 그 551번을 다 돌리려 했더니, 한 작업 세션이 띄울 수 있는 하위 일꾼 수에 상한이 있었습니다. 200명을 다 쓰면 그 뒤로는 아무것도 못 띄웁니다. 상한에 부딪히면 작업이 절반쯤에서 멈췄습니다.

그래서 여러 노드에 나눠 맡기기로 했습니다. 각 노드는 별개의 세션이라 자기 몫의 예산을 따로 가집니다. 한 노드가 상한에 닿으면 남은 몫을 다음 노드에 넘기는 릴레이 구조입니다. 그런데 노드를 나누자마자, 한 자리에서는 없던 문제들이 나타났습니다.

2. 그래서 이번에 정한 질문 하나

"몇 개의 노드를 병렬로 돌릴까"가 아니었습니다. 질문은 이것이었습니다. 노드가 조용히 멈췄을 때, 그 정지를 무엇이 알아차리는가. 노드가 "저 멈췄습니다"라고 말해줄 수 없는 상태로 멈추면, 그 정지는 누가 봐도 보이지 않습니다.

3. 사용한 개념과 도구 — 세 개의 안전장치

밖에서 보면 이 시스템에 들어오는 것은 처리해야 할 조각 목록이고, 나가는 것은 완료된 분류 파일입니다. 그 사이를 세 개의 안전장치가 지탱합니다. 첫째는 노드가 죽어도 남는 파일 자국을 감시 정본으로 삼는 것, 둘째는 한 노드가 막히면 다음 노드로 넘기는 릴레이, 셋째는 누가 무엇을 했는지를 보고가 아니라 증거로 판정하는 것입니다.

릴레이   미완 조각 목록   → 가용한 노드에 위임   → 그 노드가 처리   → 예산 남았는가
감시     처리 중 파일     → 최신 자국 시각 확인  → 정지 여부 판정   → 자국이 움직이나
귀속     완료·수정 사건   → 파일 자국으로 대조   → 어느 노드인지    → 자국이 증언하나

4. 실제로 만든 것 — 기능 세 개와, 그 기능이 막는 실패

① 파일 자국을 감시 정본으로 삼았다 — 감시자가 죽으면 정지가 묻히던 것을 막는다

노드의 정지를 그 노드의 보고에 의존하면, 노드가 말을 못 하는 상태로 멈출 때 정지가 보이지 않습니다. 감시하는 노드 자신이 멈추면 더 나쁩니다. 그래서 감시의 정본을 노드 밖에 두었습니다. 완료된 분류 파일에는 마지막으로 쓰인 시각 자국이 남는데, 이 자국은 노드가 죽어도 그대로 남습니다. 최신 자국이 수십 분 이상 움직이지 않으면 정지로 판정합니다. 노드의 생존과 무관한 이 자국이 없었다면, 조용한 정지를 사람이 우연히 발견할 때까지 놔뒀을 것입니다.

② 미완 몫을 다음 노드로 넘겼다 — 한 노드의 상한에서 전체가 멈추던 것을 막는다

한 노드는 하위 일꾼 예산에도, 사용량 한도에도, 조직 지출 한도에도 걸릴 수 있습니다. 어느 벽이든 그 노드는 거기서 멈춥니다. 그래서 한 노드가 막히면 남은 조각 목록과 검증 규격을 그대로 다음 노드에 넘기는 릴레이로 만들었습니다. 넘겨받는 노드는 낡은 목록을 믿지 않고 완료된 파일부터 세어, 이미 끝난 몫을 다시 돌리지 않습니다. 이 릴레이로 한 노드의 벽이 작업 전체의 벽이 되는 것을 끊었습니다.

③ 누가 했는지를 증거로 판정했다 — 보고 이름표만 믿고 오판하던 것을 막는다

노드 사이 보고에는 "어느 노드가 보낸다"는 이름표가 붙습니다. 그 이름표를 믿고 누가 무엇을 했는지 판정했더니 다섯 번 틀렸습니다. 이름표는 신뢰할 수 없는 정보였습니다. 그래서 노드를 특정할 때는 이름표가 아니라 증거만 쓰게 했습니다. 지금 누가 처리 중인지는 상태 목록의 활동 표시와 파일 자국으로, 누가 무엇을 고쳤는지는 파일 자국과 그 시각에 활동하던 노드로 봅니다. 보고가 아니라 파일이 정본입니다.

5. 지금까지 관찰된 결과 (실측 · 명령을 같이 적습니다)

수치는 만들지 않았습니다. 아래는 파일 자국과 상태 출력에서 확인한 값입니다.

항목값어떻게 확인했나나눈 조각551개조각 파일 wc -l 로 목록 계수릴레이 노드3개 (예산·쿼터·지출한도로 순차 교대)위임 기록최장 조용한 정지31시간 21분파일 자국 시각과 재개 시각의 차귀속 오판5회정정 기록중복 착수6조각착수 대장과 완료 파일 대조

가장 아팠던 것은 조용한 정지였습니다. 한 노드가 사용량 한도에 걸려 멈췄는데, 그 정지를 감시하던 노드마저 곧이어 만료됐습니다. 감시기는 "멈췄다"는 신호를 계속 냈지만, 감시하는 노드가 턴을 받지 못해 그 신호가 배달되지 않았습니다. 그 결과 31시간 21분 동안 아무도 정지를 몰랐습니다. 자기 시계로는 20시간으로 셌지만, 감시기가 늦게 떠서 앞의 11시간을 못 봤습니다. 자기 시계로 잰 공백은 실제값이 아니라 하한이었습니다.

중복 착수 여섯 조각도 같은 뿌리였습니다. "저 노드가 이미 처리했다"는 잘못된 전제로 같은 조각을 다시 맡겼던 것입니다. 이름표로 귀속을 판정한 대가였습니다.

6. 따라 해보고 싶으시면 — 가장 작은 형태부터

여러 노드로 오래 돌리는 작업을 안전하게 만드는 최소 형태는 이렇습니다.

  1. 진행 상태를 노드의 기억이 아니라 파일에 둡니다. 노드가 죽어도 파일은 남습니다.
  2. 감시의 정본을 감시자 밖에 둡니다. 파일이 마지막으로 쓰인 시각을 보면, 감시하는 노드가 죽어도 정지를 알 수 있습니다.
  3. 깨우는 주체를 명시적으로 정합니다. 사용량 한도는 저절로 풀려도 작업이 저절로 재개되지는 않습니다. 누가 다시 맡길지 미리 정해두지 않으면 그대로 멈춰 있습니다.
  4. 누가 무엇을 했는지는 보고가 아니라 파일 자국으로 판정합니다. 이름표는 틀릴 수 있습니다.

7. 판정은 네 가지로 나누십시오 (두 가지로는 부족합니다)

노드 상태를 "돈다/멈췄다"로만 보면, 조용한 정지가 "돌고 있다"로 집계됩니다.

PASS            파일 자국이 최근 수 분 안에 움직였다 (정상 진행)
PASS_WITH_NOTE  자국은 멈췄으나 사용량 한도라 재개 예정 (정상 대기)
HOLD            정지 원인을 확정 못 함 (자국·상태·health 가 어긋남)
FAIL            정지가 감시자 밖 증거로 확인됐고 깨울 주체가 없다

이 시리즈의 함대 운영은 31시간 정지 1회 외에는 PASS 였고, 그 1회가 FAIL 이었습니다.

8. 한계와 대가 (얻은 것 옆에 잃은 것)

여러 노드로 완주한 대신 분명히 잃은 것이 있습니다.

노드마다 자격증명이 다르면 사용량 한도가 노드별로 따로 놉니다. 그래서 한 노드의 화면에 뜬 한도 경고가 다른 노드에는 없습니다. 이 차이를 오류로 오해하기 쉽고, 실제로 한 노드는 이것을 "정본 미확정"으로 잘못 보고했습니다. 노드별 한도를 사건마다 확인하는 비용이 붙습니다.

깨우는 일에 사람이 개입해야 합니다. 사용량 한도는 시간이 지나면 풀리지만, 작업은 저절로 재개되지 않았습니다. 위 31시간 정지가 끝난 것도 사람이 다시 맡겼기 때문입니다. 완전한 무인 운영은 아직 못 만들었습니다.

그리고 자기보고를 진행 근거로 쓰는 설계를 버렸습니다. 처음에는 노드가 "몇 건 끝냈다"고 보고하면 그대로 진행 상태로 썼습니다. 그런데 보고와 실제 파일이 어긋나는 일이 반복돼, 보고 대신 파일을 세는 쪽으로 바꿨습니다. 이름표로 노드를 귀속하던 방식도 같이 버렸습니다. 다섯 번 틀린 뒤였습니다.

한 가지 더 자랑하지 않겠습니다. 정지를 자동으로 감지해 스스로 다음 노드에 넘기는 완전 자동 릴레이는 설계 완료까지만 했고, 무인으로 검증하지는 못했습니다. 지금은 사람이 파일 자국을 보고 재위임합니다.

9. 결론 — 가져가실 규칙 세 개

첫째, 감시의 정본을 감시자 안에 두지 마십시오. 감시하는 쪽이 멈추면 대상의 정지도 함께 묻힙니다. 노드가 죽어도 남는 것 — 파일 자국, 외부 상태 기록 — 을 정본으로 삼아야 조용한 정지가 드러납니다.

둘째, 자기 시계로 잰 공백은 하한입니다. 감시기가 늦게 떴으면 앞 구간을 통째로 못 봅니다. 20시간으로 셌는데 실제는 31시간이었던 것처럼, 자기가 잰 시간을 실제값으로 믿지 마십시오.

셋째, 누가 무엇을 했는지는 이름표가 아니라 자국으로 판정하십시오. 보고에 붙은 이름표는 틀릴 수 있고, 그 오판은 공적을 엉뚱한 데 돌리는 것으로 끝나지 않습니다. "저 노드가 이미 했다"는 잘못된 전제가 중복 착수와 누락을 만듭니다.

10. 참고

이 글에서 "감시자 밖에 정본을 둔다"는 원칙은 시스템 감시에서 흔히 쓰는 것으로, 감시 대상과 감시 주체의 장애를 분리하는 설계입니다. 파일이 마지막으로 쓰인 시각으로 정지를 판정하는 것은 그 작은 형태이며, 별도의 상태 저장 없이도 동작합니다.

밀어주고 끌어주는

온·오프라인 AI 스터디

AI로 어디까지 할 수 있는지
직접 확인하실 분만 신청하세요.