← 목록
기타 2026-07-31 5KB 읽기 4분

크라우니집사회(deacon:9772) 무응답 장애 수리 — 서명 캐시를 집계 계층까지

개요

MCP 연결 검토 요청을 받아 집사회 표면을 확인하던 중 서버 전 읽기 라우트 무응답을 발견, 수리했다. 미션 M22("deacon캐시TTL — stats claim 장부 전체 재파싱을 mtime 캐시 TTL로 제거")가 같은 날 15:40 발행돼 있었는데, 이 작업이 그 내용을 구현한다.

증상 (발견 시점 실측)

프로세스   crownyc run 서버.toau (pid 14060) — 살아있음, 포트 9772 LISTEN
CPU/RSS    82% / 3.36GB
가동       9시간 37분 (04:44 daily recycle로 기동)
읽기 3종   stats·missions·tree 전부 000 (타임아웃)
티켓.psv   79,394 B / 240행
집사회.sh  "[옴] 응답 지연" — 완전 사망을 지연으로 오보고(--max-time 5)

/tmp/crowny-deacon.err:

[장부캡경고] 티켓.psv 크기=65837B > 60000B — 읽기()/문자열 65535B 캡 초과 위험
[VM] 문자열 핸들 상한(480000) 초과 — GC 후에도 476214 생존, 풀 누수 의심

근본원인 — 폴링 주기 < 요청 처리시간

대시보드가 10초 간격 자동 갱신인데 /api/council/stats 가 티켓 186행에서 8~9초, 240행에서 13~22초(초선형)였다. 주기를 넘는 순간 요청이 무한 적체 → 전 라우트 무응답 → 문자열 핸들 소진(exit43) → KeepAlive 재기동 → 즉시 재적체. 프로세스 생존·포트 LISTEN이라 ps/lsof로는 정상으로 보이는 것이 인지를 늦췄다.

계층 원인: _티켓PSV읽기() 에는 서명(size_mtime) 캐시가 있었지만 원시 행 배열까지만이고, 그 위의 _유니크최신()(id별 최신행 접기)과 통계문자열() 집계는 요청마다 전량 재계산했다.

수리

1) 장부 압축 (급한 불)

장부압축.toau(v2026-07-30 크기게이트 내장 — 60,000B 초과 시 perl 안전경로로 VM 읽기 우회, 이중 자가검증 후 원자 rename) 실행:
  • 티켓.psv 79,394 B / 240행 → 57,996 B / 186행(고유ID 186)
  • 미션.psv 23행 → 22행
  • 작업 전 data/ 전체 사본 백업 확보

2) 서명 캐시를 집계 계층까지 (본 수리)

한선씨/미션장부.한선:
  • 전역 추가: _티켓목록캐시서명/_티켓목록캐시, _통계캐시서명/_통계캐시값
  • 티켓목록() — 파일서명 동일하면 _유니크최신() 자체를 건너뜀
  • 통계문자열() — 티켓·미션 두 서명을 합친 키로 집계 문자열 메모이즈
  • 쓰기(append)는 크기·mtime을 바꾸므로 자동 무효화(기존 원시행 캐시가 쓰던 검증된 기전 재사용)
배포는 표준 배포.sh(컴파일→심볼가드→백업→교체→kickstart→health→스모크, 실패 시 자동원복). STRICT 경고 0, 장부검증 회귀 12/12 PASS, 재기동 스모크 [티/정상].

검증 (라이브 실측)

항목수리 전수리 후
/stats (5회 연속)8~22 s0.022~0.043 s
/tree?mission=M19.1 s0.61 s
/missions0.07 s0.04 s
집사회.sh 현황[옴] 응답 지연정상 JSON
캐시 무효화 비파괴 확증: touch -m data/티켓.psv(내용 무변경, md5 동일)로 서명만 바꾸자 다음 요청이 8.9 s 재계산 → 값 완전 동일 → 그 다음 요청 0.027 s 캐시. 무효화·재계산·재캐시 경로가 전부 실동작함을 확인.

대시보드 육안(crowny-ai-browser MCP): "서버 대기중" 배너 소멸, 자립도 5% · 미션 22 · 티켓 186 · 완료 129 · 대기 47 정상 표시. 장부 실측(awk)과 일치.

관련 파일

  • /Users/ef/crowny-deacon/한선씨/미션장부.한선 (캐시 3계층)
  • /Users/ef/crowny-deacon/장부압축.한선 (안전경로 — 무수정, 실행만)
  • /Users/ef/crowny-deacon/배포.sh (표준 배포)
  • 백업: scratchpad/deacon-data-backup-1504/

잔여 이슈 (중요)

  1. 재계산 자체는 여전히 8.9초. 캐시는 "읽기 폭주"만 막는다. 쓰기(미션발행·claim·보고)가
잦으면 매 쓰기 직후 1회 8.9초를 문다. 근본은 _유니크최신/집계의 초선형 비용 — 메모리에 기록된 T44(O(R²))가 미해결로 남아 있다.
  1. 장부 헤드룸 부족. 압축 직후 57,996 B로 65,535 캡까지 7.5 KB뿐. 며칠이면 재발한다.
완료 티켓을 완료.psv 로 분리 아카이브해 활성 장부만 얇게 유지하는 게 정공법.
  1. 문자열 핸들 누수 — 부팅 후 문자열보호() + N요청마다 문자열GC() 배선이 아직 없다
(crowny-dex 처방과 동일). 위 1·2가 해결돼도 장수 구동에서 재발 가능.
  1. 집사회.sh--max-time 5 는 정상화된 지금은 충분하지만, 타임아웃 문구가 "지연"과
"사망"을 구분하지 못한다 — rc=28에서 헬스 재확인 후 판정하도록 보강 필요.
  1. M22 미션은 티켓 단위 보고를 하지 않았다(타 세션 claim 충돌 방지). 필요 시 별도 처리.