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

앱상주서버.한선 P0-1 — 스크롤백 꼬리파싱 수정

개요

벡터 직결 10ms 파이프라인(계약: 벡터직결-계약.md 부록2 P0-1)의 확정 결함 수정. src/앱상주서버.한선이 벡터| 이벤트마다 /tmp/터미널상태.psv 전체 스크롤백을 읽기()+줄분리()로 재파싱해, 대용량(3000줄급) 상태에서 문자열 핸들이 빠르게 소진되고 인스턴스가 무진단 소멸하는 문제(2026-07-12 적대검증 실측: 2000요청에서 문자열 핸들 90% 경고 + 소멸).

무엇을 했는지

  1. _출력줄들()파일바이트크기(297)+버퍼파일읽기(874)로 바이너리 버퍼
로드 후, 파일 끝에서부터 버퍼바이트읽기(851)로 개행(0x0A)만 세어 렌더 캡(_표시줄수=26)+여유(4)=30줄 분량의 파일 꼬리 구간만 버퍼잘라(395)로 잘라 그 구간만 문자열화·파싱. 전체 스크롤백 크기와 무관하게 함수 비용이 "꼬리 ~30줄" 고정 크기가 된다.
  1. (추가 발견) _psv값(_터미널상태경로,"경로") 호출 2곳(_렌더cmd,
_v터미널렌더)도 같은 파일을 전체 재파싱하고 있어 1번 수정만으로는 스트레스 재현 시 문자열 핸들 90% 경고가 여전히 발생 — 전용 헤드리더 _터미널경로헤드()를 추가(첫 개행까지만 전진 스캔)해 두 호출부를 교체.
  1. P0-1 부수 요구사항: 전역 요청 카운터(_요청카운터) 추가, 1000요청마다
출력값()(stdout — 한선씨 VM에 stderr 전용 빌트인 없음, 기존 시작/종료 배너와 동일 채널) 진단 1줄로 "무진단 소멸" 방지.

검증 (실측)

  • 컴파일: CROWNY_STRICT=1 ./hanseonc_high → exit0, [STRICT] 경고 0건.
  • 격리 인스턴스(포트 19860, CROWNY_TERMSRV_PORT)에서 /tmp/터미널상태.psv
3001줄(경로 1 + 줄 3000) 픽스처로 교체 후 벡터|터미널|KEY·BS·렌더 + 벡터|계산기|액션 혼합 2500요청 스트레스:
  • errs=0/2500, 프로세스 생존, drift_ratio(last100/first100 p50)=1.00x
  • (p50 51ms대 균일 — 구버전은 2000요청 근방에서 이후 전 요청 connection refused로 소멸했던 것과 대비).
  • stderr에 [STR] 조기경고: 문자열 핸들 432000/480000(90%) 1회 발생 —
  • 다만 이 경고는 크래시를 유발하지 않았다(0 errors, 0 drift 확인). 이 VM은 str_count>=STR_ID_MAX(480000)에 도달할 때만 자동 GC를 트리거하는 구조(90% 경고 자체는 GC 미실행 정보성 로그, crownyc.c str_new() 참조)라, 계산기+터미널 렌더 파이프라인 전반(_v버튼/ _v글자 등 공용 프리미티브, 8앱 서비스가 공유)의 문자열 연결 비용이 남아있는 한 대량 트래픽에서 1회성으로는 계속 발생할 수 있다. "0경고"까지 없애려면 _출력줄들() 범위를 넘어 렌더 프리미티브 전반의 문자열 핸들 절감(예: 사전 포맷 캐시)이 필요 — P0-1 소유 범위 밖이라 8앱 이식(전역 _v* 재사용) 담당에게 인계 권고.
    • 레거시 3verb 회귀 스모크: 렌더/렌더|960|640/키|FOCUS|.../키|KEY|x/
    벡터|계산기|렌더/벡터|터미널|렌더/종료 전부 정상 응답, 종료 verb로 정상 종료(앱상주서버 종료 — 누적요청=2507, 종료요청 카운터가 스트레스 2500+스모크6+종료1=2507과 정확히 일치).
    • 상태파일 원복: `/tmp/{터미널상태,입력상태,계산기상태,터미널선택,입력모드,
    캐럿상태,앱상주_캔버스}.psv`를 테스트 전 백업본으로 복원(다른 세션 mtime 변경 없음 확인 후 복원).
    • 실행 중이던 무관 프로세스(pid 93820, /tmp/앱상주서버.toau 실행 중,
    포트 9801)는 건드리지 않음. CrownyAI.app은 이 세션 동안 미기동 확인.

    관련 파일

    • /Users/ef/CrownyBrowser/src/앱상주서버.한선 (단독 소유, 수정)
    • /private/tmp/claude-501/-Users-ef/2e95e8b6-e663-4b81-9734-9ded4339b18d/scratchpad/벡터직결-계약.md (SSOT 계약)
    • 검증 스크립트(스크래치, 비영속): p01_stress.py, p01_legacy_smoke.py

    잔여 이슈

    • [STR] 조기경고: 90% 도달 로그 자체를 완전히 0으로 만들려면 렌더
    프리미티브(_v버튼/_v글자/_v사각형 등, 계산기·터미널·향후 8앱이 공유) 전반의 문자열 연결 비용 절감이 필요 — 이번 P0-1 스코프(스크롤백 파싱) 밖. 다만 크래시/성능열화는 실측상 없음(0 errors, 1.00x drift).
    • /tmp/앱상주서버.toau는 이번 수정 반영 전 버전 그대로(ObjC 측
    appSrvEnsureToauFresh stale-toau 가드가 소스 mtime 갱신을 감지해 다음 기동 시 자동 재컴파일 — 계약대로 ObjC 담당(P0-2) 영역, 이 세션에서 직접 배치하지 않음).