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

crownyc 문자열 GC 마크스코프 실측 + 강제GC 검증 (T171+T172)

개요

집사회 티켓 T171(GC 계측)+T172(강제GC 재검증)을 같은 계측 빌드 묶음으로 실행. 대상: crownyc.c str_gc() (opcode 363 문자열GC()), 부하: 의미어라우터_모델.psv (46,074줄) 벌크로드를 5회 반복하는 gc_harness.한선.

정본 crownyc는 건드리지 않음. 모든 빌드/실험은 /tmp/gc_test2/ 에서만 진행.

T171 — GC 마크 스코프 실측

  • 계측 빌드: /tmp/gc_test2/crownyc.c(정본 crownyc.c 복사본)의 str_gc() 끝에
fprintf(stderr,"[GCLOG] run=%d before=%d after=%d freed_this=%d ...") 1줄 추가. make crownyc로 /tmp/gc_test2/crownyc 빌드(정본 컴파일러 hanseonc_high는 무수정).
  • 부하: 모델로드() 자동GC 경로만 사용(강제GC 없음), 5회 반복 로드.
  • 실측 결과:
  • GC 4회 발동(모두 str_count가 STR_ID_MAX=480000 캡에 도달했을 때만 자동 트리거)
  • 매회 before=480000 → after≈46,187~46,257 (약 90.4% 회수)
  • 총 소요 75.67s (34MB peak footprint)
  • [STR] 조기경고 90% 1회만 발화(캡 도달 반복돼도 static 플래그로 1회 제한)
  • 판정: 마크 스코프 결함 없음. 매 GC마다 살아있는 셋(≈46k, 반복마다 +21씩 누적 —
  • 전역 맵 G프라이어/Gfb/G코드 등에 실제 보관되는 값과 일치)만 정확히 생존하고 임시 문자열(필드추출용 버퍼읽기() 핸들)은 90%+ 회수됨. "루프 내 임시문자열 미회수" 가설 기각. 문제는 회수 실패가 아니라 GC가 캡(480000) 도달 시점까지 지연 트리거되어 1) 매 모델로드() 1회 호출만으로 480k 핸들을 다 태우고 캡에 부딪힘 2) 그때마다 480,000개 슬롯 전체를 mark+compact — 이 대형 스윕 자체가 비용(관측 근거: run당 약 15초/1.7GB급 스윕).

    T172 — 강제GC 재검증

    • 의미어라우터_코어.한선을 카피(의미어라우터_코어_forcegc.한선)해 모델로드() 라인루프에
    라인카운트 % 2000 == 0 마다 문자열GC()(기존 opcode 363, 이미 hanseonc_high에 문자열GC 빌트인 매핑 존재 — 신규 VM 빌트인 불필요) 호출 삽입.
  • 동일 계측 빌드(/tmp/gc_test2/crownyc)로 동일 5회 반복 실행.
  • 실측 결과:
  • GC 115회 발동(2000줄마다), 매회 before≈66,257 / after=46,257 고정(0.5회차 이후 안정)
  • 90% 조기경고 0회 (기존 1회 → 0회, 캡 근접 자체가 사라짐)
  • 총 소요 68.07s (기존 75.67s 대비 약 10% 단축 — 더 자주 돌지만 매회 스윕 크기가
  • 480,000→66,257로 작아져 순수익)
  • 최종 생존셋 46,257 — T171 무강제 버전 마지막 after(46,257)와 완전 일치
  • 강제GC가 생존 데이터를 잘못 회수하지 않음(오탐 없음) 확인.

    판정 (VM 수리 필요/불필요)

    • VM(str_gc 마크 로직) 수리 불필요. 마크 스코프(스택+변수영역+힙영역 스캔)는
    정확히 동작, 생존셋 판정에 결함 없음.
    • 운영 권고(수리 아님, 호출측 개선): 대용량 벌크로드 루프(46k줄+ psv/csv 등)는
    자동GC(캡 도달시만 트리거)에만 의존하지 말고 N줄마다 문자열GC() 명시 호출 권장. 실측상 90% 조기경고 소멸 + 성능 10% 개선 + 정확도 손실 없음 확인.
    • 캡 자체(STR_ID_MAX=480000)는 단일 모델로드() 1회 호출로도 도달하는 수준 —
    더 큰 데이터셋(50k줄+)에서는 강제GC 없이 자동GC만으로는 exit(43) 위험 상존.

    관련 파일

    • 계측 빌드(측정용, 정본 아님): /tmp/gc_test2/crownyc.c, /tmp/gc_test2/crownyc
    • 부하 하네스: /tmp/gc_test2/gc_harness.한선(무강제), /tmp/gc_test2/gc_harness_force.한선(강제GC)
    • 강제GC 적용 로더 사본: /tmp/gc_test2/의미어라우터_코어_forcegc.한선
    • 실측 로그: /tmp/gc_test2/stderr.log(T171), /tmp/gc_test2/stderr_force.log(T172)
    • 원본(무수정) 정본: /Users/ef/CrownyOS/crownyc/crownyc.c, /Users/ef/crowny-butler/libs/의미어라우터_코어.한선

    잔여 이슈

    • 의미어라우터_코어.한선 라이브 정본에 2000줄 단위 문자열GC() 강제 호출을
    실제로 편입할지는 별도 티켓(오너/후속 담당) 판단 필요 — 본 티켓은 실측·검증까지만.
    • 강제GC 주기(2000줄) 최적값 튜닝은 미실시(1회 값으로 효과 확인만).