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

crowny-dex 문자열 핸들 풀 안정화 (24h 무인가동 대비)

개요

dex.crowny.org(포트 9402, LaunchAgent org.crowny.dex.plist)의 6561 에이전트 러너가 4라운드(26,244틱) 이후 문자열 핸들 풀 90%(432,000/480,000) 소진 경고를 내는 문제를 근본 수정하고 100,000+ 틱 연속 소크로 검증했다.

원인 진단

DEX서버.한선의 틱 처리 경로(에이전트틱실행담당계산/에이전트스왑실행재투자기록/감사기록)는 매 틱마다 다음을 새로 생성한다:
  • 담당명출력 문자열 연결("연계:"+...)
  • 노트 문자열 연결(다중 조각)
  • 유저(에이전트유저ID = "AGENT-"+id), sid("S-"+n), rid("R-"+n)
  • 문자열변환() 다회 호출, 감사기록/덧쓰기 로그 메시지 조립
이 자체는 정상 패턴이지만, crownyc VM의 자동 GC는 str_count >= str_cap (초기 2,000,000) 시점에만 트리거되어 문자열 핸들 상한(STR_ID_MAX=480,000)보다 훨씬 늦게 위치한다 — 즉 자동 GC가 영영 발동하지 않는 구간에서 상한 도달 시 exit 43으로 프로세스가 죽는다. (기존 실측: feedback_한선씨_폴링서버_문자열핸들_누수_exit43, feedback_hanseon_buf_slots_string_pool — crowny-gametools/crowny-voice에서 동일 패턴 확인됨)

수정 내용

/Users/ef/crowny-dex/DEX서버.한선:

  1. 에이전트틱배치() 루프 내부 — 매 200틱마다 문자열GC() 호출 추가:
만약 (표준나머지(에이전트틱카운트, 200) == 0) { 문자열GC() }
  1. 서버 부팅 완료 직후, accept 루프 진입 전문자열보호() 호출 추가하여
부팅까지 생성된 전역/경로/설정 문자열을 영구 보호(이후 GC가 회수하지 않도록):
문자열보호()
  1. 메인 TCP accept 루프 — 요청 50건마다 보강 문자열GC() 호출 추가
(스왑/대출/주문 등 틱 배치 외 경로도 문자열 핸들을 소비하므로):
_요청카운터 = _요청카운터 + 1
만약 (_요청카운터 >= 50) { _요청카운터 = 0 문자열GC() }

실측 수치

포그라운드 crownyc run build.toau 기동 후 /api/agents/tick(n=300) 반복 호출로 누적 소크:

누적 틱조기경고/STR/exit 로그상태RSS
~10,2000건healthy-
~50,2000건healthy, verify 통과(6561/0 unmandated)24,176 KB
~100,2000건healthy, verify 통과26,384 KB
수정 전 실측(이전 세션): 26,244틱(4라운드)에서 문자열 풀 90%(432,000/480,000) 도달 경고. 수정 후: 이전 임계치의 약 3.8배(100,200틱)까지 경고 0건·크래시 0건·RSS 안정 증가(24→26MB, 완만).

서버 재확인

curl /health   → {"status":"healthy","service":"crowny-dex","version":"2.0.0"}
curl /api/markets → CRN/FNC/CRM/CRD 정상 (한선/선호는 조건 미충족으로 비노출 유지)
curl /api/agents/verify → processed:6561, unmandated:0, business_slots_covered:81/81, service_slots_covered:20/20

LaunchAgent 재기동

launchctl unload ~/Library/LaunchAgents/org.crowny.dex.plist
launchctl load ~/Library/LaunchAgents/org.crowny.dex.plist
재기동 후 새 build.toau로 정상 서빙 확인(health/markets/verify 모두 통과).

관련 파일

  • /Users/ef/crowny-dex/DEX서버.한선 — 수정 대상(에이전트틱배치/부팅/accept루프 3곳)
  • /Users/ef/crowny-dex/build.toau — 재빌드 산출물(hanseonc_high, 41,933 큐브)
  • ~/Library/LaunchAgents/org.crowny.dex.plist — 재기동
  • /Users/ef/.claude/projects/-Users-ef/memory/feedback_crownydex_문자열핸들풀_소진.md — 신규 함정 기록

잔여 이슈

  • VM 배열 상한(≈4095) crash 회피는 이미 배치 축소(300~500)로 되어 있으나 근본 수정
(로그 회전/압축)은 여전히 미착수 — 2026-07-29-crowny-dex-2단계.md 인계사항과 동일.
  • 100,200틱 이후 장기(수십만~수백만 틱, 24h+) 구간은 미검증 — LaunchAgent 상시가동 상태로
운영 중 모니터링 권장(data/*.err조기경고 grep).
  • 문자열GC() 200틱/50요청 주기는 임의값 — 실운영에서 여유 있으면 더 넓혀 GC 비용 절감 가능.