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서버.한선:
에이전트틱배치() 루프 내부 — 매 200틱마다 문자열GC() 호출 추가:
만약 (표준나머지(에이전트틱카운트, 200) == 0) { 문자열GC() }
- 서버 부팅 완료 직후, accept 루프 진입 전 —
문자열보호() 호출 추가하여
부팅까지 생성된 전역/경로/설정 문자열을 영구 보호(이후 GC가 회수하지 않도록):
문자열보호()
- 메인 TCP accept 루프 — 요청 50건마다 보강
문자열GC() 호출 추가
(스왑/대출/주문 등 틱 배치 외 경로도 문자열 핸들을 소비하므로):
_요청카운터 = _요청카운터 + 1
만약 (_요청카운터 >= 50) { _요청카운터 = 0 문자열GC() }
실측 수치
포그라운드
crownyc run build.toau 기동 후
/api/agents/tick(n=300) 반복 호출로 누적 소크:
| 누적 틱 | 조기경고/STR/exit 로그 | 상태 | RSS |
|---|
| ~10,200 | 0건 | healthy | - |
| ~50,200 | 0건 | healthy, verify 통과(6561/0 unmandated) | 24,176 KB |
| ~100,200 | 0건 | 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 비용 절감 가능.