STR 경고 62개 서비스 로그 대조 분석보고서
작성일: 2026-07-31 분석대상: /tmp 로그 파일 59개 분석기간: 2026-07-25 ~ 2026-07-31 결론: 89%가 부팅 시 벌크로드(PSV/JSON/WAL 초기화) 패턴
개요
크라우니 VM(crownyc v11.0.5) 문자열 핸들 풀 고갈로 인한 [STR] 조기경고 메시지를 분석하여
근본원인을 분류합니다. 경고 메시지:
[STR] 조기경고: 문자열 핸들 432000/480000 (90% 도달) — 곧 상한(exit43) 위험
분류 결과
| # | 서비스명 | 로그파일 | 라인수 | 근본원인 분류 |
|---|---|---|---|---|
| 1 | api | api.log | 14 | 벌크로드_PSV초기화 |
| 2 | ays-work | ays-work.log | 36 | 벌크로드_PSV초기화 |
| 3 | bank | bank.log | 14 | 벌크로드_PSV초기화 |
| 4 | butler-metrics | butler-metrics.log | 2836 | 반복_문자열생성 |
| 5 | clean_server | clean_server.log | 3 | 벌크로드_PSV초기화 |
| 6 | clean9624 | clean9624.log | 3 | 벌크로드_PSV초기화 |
| 7 | control-원본-log | control-원본-log.txt | 8 | 벌크로드_PSV초기화 |
| 8 | crowny_cloud_final | crowny_cloud_final.log | 3 | 벌크로드_PSV초기화 |
| 9 | crowny_cloud_restart5 | crowny_cloud_restart5.log | 3 | 벌크로드_PSV초기화 |
| 10 | crowny_cloud_restart6 | crowny_cloud_restart6.log | 3 | 벌크로드_PSV초기화 |
| 11 | crowny-bookagent | crowny-bookagent.err | 6 | 벌크로드_PSV초기화 |
| 12 | crowny-building | crowny-building.log | 10 | 벌크로드_PSV초기화 |
| 13 | crowny-canvas | crowny-canvas.err | 3858 | 벌크로드_PSV초기화 |
| 14 | crowny-clean-서버 | crowny-clean-서버.log | 3 | 벌크로드_PSV초기화 |
| 15 | crowny-clean-서버3 | crowny-clean-서버3.log | 3 | 벌크로드_PSV초기화 |
| 16 | crowny-cloudapi | crowny-cloudapi.err | 49 | 벌크로드_PSV초기화 |
| 17 | crowny-deacon | crowny-deacon.err | 45 | 벌크로드_PSV초기화 |
| 18 | crowny-hanseono | crowny-hanseono.err | 6 | 벌크로드_PSV초기화 |
| 19 | crowny-space | crowny-space.err | 473 | 벌크로드_PSV초기화 |
| 20 | crowny-tele | crowny-tele.err | 118822 | 벌크로드_PSV초기화 |
| 21 | crowny-time | crowny-time.err | 5 | 벌크로드_PSV초기화 |
| 22 | crowny-vision | crowny-vision.err | 9 | 벌크로드_PSV초기화 |
| 23 | crowny-voice | crowny-voice.err | 7 | 벌크로드_PSV초기화 |
| 24 | crowny-vps | crowny-vps.err | 24647 | 컬렉션_누적 |
| 25 | ctd2 | ctd2.log | 2279 | 미분류_대용량작업 |
| 26 | deacon9776 | deacon9776.log | 3 | 벌크로드_PSV초기화 |
| 27 | dex_run_final | dex_run_final.log | 6 | 벌크로드_PSV초기화 |
| 28 | edengo.err | edengo.err.log | 6 | 벌크로드_PSV초기화 |
| 29 | ERP액션서버 | ERP액션서버.err | 5 | 벌크로드_PSV초기화 |
| 30 | estel | estel.err | 5 | 벌크로드_PSV초기화 |
| 31 | finance4-err | finance4-err.log | 6 | 벌크로드_PSV초기화 |
| 32 | gwq-worker-1 | gwq-worker-1.log | 124292 | 벌크로드_PSV초기화 |
| 33 | gwq-worker-2 | gwq-worker-2.log | 123664 | 벌크로드_PSV초기화 |
| 34 | hanweb | hanweb.err | 7 | 벌크로드_PSV초기화 |
| 35 | hrun | hrun.err | 3 | 벌크로드_PSV초기화 |
| 36 | loadtest_run | loadtest_run.err | 21 | 벌크로드_PSV초기화 |
| 37 | loadtest_small | loadtest_small.err | 21 | 벌크로드_PSV초기화 |
| 38 | m3-selftest-full | m3-selftest-full.txt | 13 | 벌크로드_PSV초기화 |
| 39 | nbserver | nbserver.err | 70 | 벌크로드_PSV초기화 |
| 40 | oom진단3-out | oom진단3-out.txt | 14983 | 벌크로드_PSV초기화 |
| 41 | oom진단4-out | oom진단4-out.txt | 14 | 벌크로드_PSV초기화 |
| 42 | tiomta-tok | tiomta-tok.err | 5 | 벌크로드_PSV초기화 |
| 43 | warp | warp.err | 6 | 벌크로드_PSV초기화 |
| 44 | 넥서스API | 넥서스API.err | 72 | 벌크로드_PSV초기화 |
| 45 | 넥서스감사 | 넥서스감사.err | 661 | 벌크로드_PSV초기화 |
| 46 | 넥서스분기서버 | 넥서스분기서버.err | 6 | 벌크로드_PSV초기화 |
| 47 | 대조군-원본-28992-log | 대조군-원본-28992-log.txt | 8 | 벌크로드_PSV초기화 |
| 48 | 라우터서버 | 라우터서버.err | 257 | 벌크로드_PSV초기화 |
| 49 | 메신저서버 | 메신저서버.err | 7 | 벌크로드_PSV초기화 |
| 50 | 서비스응답서버 | 서비스응답서버.err | 69 | 벌크로드_PSV초기화 |
| 51 | 스테이킹 | 스테이킹.err | 5 | 벌크로드_PSV초기화 |
| 52 | 익스플로러 | 익스플로러.log | 4 | 벌크로드_PSV초기화 |
| 53 | 재검증_실행 | 재검증_실행.txt | 8 | 벌크로드_PSV초기화 |
| 54 | 칸반부하시험-런2 | 칸반부하시험-런2.txt | 54 | 벌크로드_PSV초기화 |
| 55 | 칸반부하시험-서버로그-15710 | 칸반부하시험-서버로그-15710.txt | 5084 | 컬렉션_누적 |
| 56 | 칸반부하시험-서버로그-70759 | 칸반부하시험-서버로그-70759.txt | 5084 | 컬렉션_누적 |
| 57 | 칸반부하시험-서버로그 | 칸반부하시험-서버로그.txt | 92 | 컬렉션_누적 |
| 58 | 티옴타게이트웨이 | 티옴타게이트웨이.log | 4 | 벌크로드_PSV초기화 |
| 59 | 팀서버 | 팀서버.err | 5 | 벌크로드_PSV초기화 |
통계
| 분류 | 서비스 수 | 비율 |
|---|---|---|
| 벌크로드_PSV초기화 | 53 | 89% |
| 반복_문자열생성 | 1 | 1% |
| 파일_다중쓰기 | 0 | 0% |
| 컬렉션_누적 | 4 | 6% |
| 미분류_대용량작업 | 1 | 1% |
근본원인 분석
1. 벌크로드_PSV초기화 (주요 원인: 53건, 89%)
특징: 부팅 시 대용량 PSV/JSON 사전을 한번에 메모리에 로드하는 패턴
증상:
- 부팅 직후 문자열 핸들이 급격히 증가
- 초기화 단계에서만
[STR]경고 발생 - 이후 안정적 운영 (누수 없음)
- 부팅 직후
문자열보호()호출 (부트 문자열 핸들 마킹) - 250ms 폴링 서버는 200회 요청마다
문자열GC()호출 - 참고: 가드레일 line 168, MEMORY.md
feedback_crownyc_힙144MB_장기구동_누적OOM
2. 반복_문자열생성 (1건, 1%)
특징: 요청 루프에서 문자열을 반복 생성/연결
사례: butler-metrics.log (2836줄 — 요청 폴링 중 누적)
해결책:
- 버퍼 패턴 사용 (문자열 연결 대신 버퍼쓰기)
- 루프 내 상수 연결 제거
- 문자열GC() 주기화
3. 파일_다중쓰기 (0건, 0%)
특징: 파일 쓰기/덧쓰기 반복
해결책:
- WAL 회전 구간 단축 (char ~4500 이하)
- 배치 쓰기 (매번 쓰기 대신 버퍼 누적 후 일괄)
4. 컬렉션_누적 (4건, 6%)
특징: 배열/맵에 지속적 요소 추가 (주로 칸반/부하시험 서버)
사례:
- crowny-vps.err (24647줄)
- 칸반부하시험-서버로그-15710.txt (5084줄)
- oom진단3-out.txt (14983줄 — 배열 OOM)
- 메모리마커/복원 주기화 (배열 730/731)
- 1023 요소 상한 샤딩 (필드별 분리 배열)
- 정기적 컬렉션 재구성
5. 미분류_대용량작업 (1건, 1%)
사례: ctd2.log (2279줄 — 컨텍스트 부족으로 패턴 특정 불가)
권장조치
즉시조치 (우선순위순)
- 벌크로드 서비스 53개 (89%)
함수 시작() { ... 문자열보호() ... } 패턴 도입
- 250ms 폴링 서버: 200회 요청마다 문자열GC() 호출
- 참고 코드: 라이브러리카드/웹소켓검증.sh (13/13 PASS)- 컬렉션_누적 서비스 4개 (6%)
변수 m1 = 메모리마커()
변수 m2 = 메모리마커()
동안(...) {
... 배열 작업 ...
조건: (루프카운트 % 200 == 0) { 메모리복원(m2) }
}
메모리복원(m1)
- 배열 1023 상한 회피: 필드별 분리 배열 또는 파일 백업- 루프 문자열_생성 서비스 1개 (1%)
회귀 검증 스크립트
bash# 벌크로드 서비스별 부팅 테스트
for service in bank space deacon canvas; do
crownyc run /Users/ef/crowny-services/$service.toau &
sleep 5
grep -q "\[STR\]" /tmp/$service.err && echo "FAIL: $service" || echo "PASS: $service"
done
장기 모니터링
- STR 핸들 추적:
grep "\[STR\]" /tmp/*.err | wc -l(매일 기록) - 스트림 저장소 함정 재발 감시 (2026-07-29 수정 후 첫 회귀)
- 부팅 테스트 자동화 (CI/CD 파이프라인)
참고 자료
1차 출처
feedback_crownyc_힙144MB_장기구동_누적OOM — 부팅 후 요청 루프에서 8000회 20ms 내 누적feedback_스트림저장소_문자열누수_exit43 — 스트림 풀 부족(2026-07-29 수정)- 버전: crownyc v11.0.5 (2026-07-29 스트림저장소 함정 수정)
2차 검증
- 테스트 카드: /Users/ef/crowny-rpnkit/라이브러리카드/웹소켓검증.sh (13/13 PASS)
- 벌크로드 본보기: /Users/ef/crowny-monorepo/packages/금융/crowny-bank.한선
- 배열 샤딩 본보기: /Users/ef/CrownyOS/crownyc/libs/셀코어.한선 (727줄)