← 목록
기타 2026-07-26 8KB 읽기 9분

게이트웨이 버전별 실측 벤치 — "어느 버전이 가장 빠른가" 결판

2026-07-26. 요청: 고수준/RPN기계어/JIT 3버전을 그림자 포트에서 실측 비교, 라이브 무접촉. 방법: 동일 gateway.yaml(라이브 원본, 읽기전용) + python http.server 로컬 업스트림, ab -n 2000 -c 20 3회 중앙값. 참조: 2026-07-09 게이트웨이 LuaJIT급 최적화 분석(경로매칭 O(n) 수리, JIT 예측).

실측 결과 (그림자, 라이브 무접촉·PID불변)

버전포트3회 RPS중앙값baseline 대비
① 고수준 현행(hanseonc_high, 경로매칭 수리 포함)1808156.89 / 60.89 / 59.0259.021.00x (baseline)
② RPN 기계어(게이트웨이통합.rpn.toau)18082측정불가(고장)N/A
③ JIT armed(crownyc-jit, CROWNY_JIT=1, 같은 baseline.toau)1808165.61 / 63.35 / 62.6263.351.073x (+7.3%)
머신 부하: load averages: 30.05 27.73 23.65(다른 세션 100+ crownyc 상주 프로세스 동시구동) — 절대 RPS는 07-09 격리측정(46.6→102.1)보다 낮게 나오나(경합), 3버전을 동일 시각·동일 부하창에서 순차측정했으므로 상대 비교는 유효.

핵심 질문 4개 답

Q1. RPN 기계어 버전이 고수준보다 빠른가/같은가/느린가?

측정 불가 — RPN toau가 고장 상태. 게이트웨이Q/게이트웨이통합.rpn.toau를 GW_PORT=18082로 기동하면 리스너 바인딩("포트 X (프록시...)" 출력줄)까지 전혀 도달하지 못하고 CPU 95~99%로 무한루프에 빠진다. 22초 관찰 동안 요청 0건 처리, 포트 리슨조차 안 됨. 축소재현: gateway.yaml을 1서비스짜리 최소 yaml로 바꿔도 동일하게 무한루프(→ 설정크기 문제가 아니라 RPN 변환 자체의 구조적 버그). 이는 파일 자체의 기존 경고와 일치한다 — 소스 상단 주석(2026-07-09 갱신)에 "미인식 단어 74건 잔존", "⚠️ 이 결과물은 '미인식=조용한 0' 함정 때문에 곧바로 라이브 대체 불가. hanseonc_rpn 미인식 0건 확인 전엔 실행 금지"라고 명시돼 있음. 즉 RPN 변환은 아직 실행 가능한 상태가 아니며, "RPN이 고수준보다 빠르다/느리다"는 질문 자체가 지금은 성립하지 않는다(작동하는 버전이 없음).

Q2. JIT 빌드가 프록시 워크로드에 이득이 있나?

미미하게 있음 — +7.3% (59.02 → 63.35 RPS 중앙값). 07-09 분석의 예측("VM은 요청비용의 1%뿐이라 JIT 이득 미미")과 정합. crownyc-jit self-test는 PASS해 JIT armed 상태로 서빙했음에도 프록시 요청 경로(I/O 대기·소켓 폴링·문자열 처리 위주, 컴퓨트 루프 거의 없음) 자체가 JIT가 노리는 "핫루프 반복 실행"과 거리가 멀어 실제 이득이 작다. JIT는 컴퓨트 워크로드(수치 루프 등)에서나 29~362배 격차를 좁히는 도구이지, 게이트웨이 같은 I/O-바운드 워크로드의 병목(단일스레드 직렬화·poll/recv 왕복)은 건드리지 못함.

Q3. 경로매칭 O(n) 수리가 라이브에 반영됐나?

반영됨(이미 배포 완료, 신규 발견 아님). 소스 확인: 한선게이트웨이/설정.한선에 "★[성능 2026-07-09] pathRoutes 전용 소배열(_경로소배열)" 구현이 이미 존재하고 경로매칭()이 이 소배열(~10원소)만 스캔하도록 되어 있음(라우트맵 301쌍 전량스캔 아님). 그리고 이번 세션에서 그 소스를 그대로 재컴파일한 baseline.toau(MD5 b13d353710abd831b1e1dca71d702a22)가 현재 라이브가 쓰는 /tmp/gwlive.toau와 MD5 완전 일치로 확인됨(읽기전용 비교, 라이브 프로세스/파일 미변경). 즉 지금 결과 표의 "①고수준 현행" 수치가 곧 라이브 실체와 동일한 코드다. 07-09 문서에 기록된 대로 그날 컷오버가 실제로 반영·유지되고 있다.

Q4. 최종 권고 — 라이브를 어느 버전으로 바꾸면 몇 배 빨라지나?

지금 시점엔 "바꿀 필요 없음(이미 최적 버전이 라이브)" + "바꿀 수 있는 대안이 없음(RPN 고장)".
  • 고수준(현재 라이브) = 이미 경로매칭 수리 반영된 최신 코드. 실측 baseline.
  • RPN 기계어는 아직 배포 후보가 아님(74건 미인식, 무한루프) — 고치기 전엔 비교도 배포도 불가.
  • JIT 빌드는 +7.3% — 오버헤드(빌드/배포 리스크) 대비 이득이 작아 즉시 전환할 유인 낮음. 다만 라이브 무손상 확인됨(crownyc.c와 분리된 crownyc-jit 별도 바이너리 빌드, crownyc.c MD5 ceb79c9868bb4528d4e0a67414264f87 컴파일 전후 불변) — 저위험 실험이라 향후 컴퓨트-바운드 서비스(VM 자체가 병목인 서비스)엔 유효할 수 있음.
  • nginx급(수만 RPS) 도달 가능성 — 정직 판정: 이번 실측 범위(고수준/JIT)로는 불가능. 07-09 분석이 이미 정리한 대로 유일한 경로는 천장3-A(I/O 데이터플레인을 C 네이티브 opcode로 내리는 것, crownyc.c 재빌드 필요·미착수)다. 이번 세션 실측은 그 판정을 뒤집을 근거를 만들지 못했다(오히려 JIT가 프록시 워크로드엔 거의 안 먹힌다는 07-09 예측을 재확인).

재현 방법 (그림자, 라이브 무접촉)

bash# 1. 로컬 백엔드
mkdir -p /tmp/gwbench/backend && echo '<html><body>bench ok</body></html>' > /tmp/gwbench/backend/index.html
cd /tmp/gwbench/backend && python3 -m http.server 19000 --bind 127.0.0.1 &

# 2. 벤치용 yaml (라이브 gateway.yaml 복사 + 테스트 서비스 1개 추가)
cp /Users/ef/crowny-gateway/gateway.yaml /tmp/gwbench/bench-gateway.yaml
cat >> /tmp/gwbench/bench-gateway.yaml << 'EOF'
- name: bench-shadow-test
  domain: bench.local
  upstream: http://127.0.0.1:19000
EOF

# 3. 고수준 컴파일(현재 소스 = 라이브와 MD5 동일)
cd /Users/ef/crowny-gateway/한선게이트웨이
/Users/ef/CrownyOS/crownyc/hanseonc_high 게이트웨이통합.한선 > /tmp/gwbench/baseline.toau

# 4-A. 고수준 실행 + 벤치
cd /Users/ef/CrownyOS/crownyc
GW_PORT=18081 GW_YAML=/tmp/gwbench/bench-gateway.yaml GW_WID=b1 GW_REDIRECT=0 \
  ./crownyc run /tmp/gwbench/baseline.toau &
ab -n 2000 -c 20 -H "Host: bench.local" http://127.0.0.1:18081/

# 4-B. RPN 실행 시도(현재 무한루프로 고장 확인용)
GW_PORT=18082 GW_YAML=/tmp/gwbench/bench-gateway.yaml GW_WID=b2 GW_REDIRECT=0 \
  timeout 12 ./crownyc run /Users/ef/crowny-gateway/게이트웨이Q/게이트웨이통합.rpn.toau
# → EXIT=124(timeout), 리스너 바인딩 로그도 안 나옴

# 4-C. JIT 바이너리 별도 빌드(crownyc.c 무손상) + 벤치
cd /Users/ef/CrownyOS/crownyc
cc -O2 -o /tmp/crownyc-jit crownyc_jitmain.c crownyc_jit_snippets.s -lm -framework Security -framework CoreFoundation
GW_PORT=18081 GW_YAML=/tmp/gwbench/bench-gateway.yaml GW_WID=b1 GW_REDIRECT=0 CROWNY_JIT=1 \
  /tmp/crownyc-jit run /tmp/gwbench/baseline.toau &
ab -n 2000 -c 20 -H "Host: bench.local" http://127.0.0.1:18081/

관련 파일

  • /Users/ef/crowny-gateway/한선게이트웨이/게이트웨이통합.한선 — 고수준 소스(현재 라이브와 동일 코드)
  • /Users/ef/crowny-gateway/한선게이트웨이/설정.한선_경로소배열/경로매칭() 수리 위치
  • /Users/ef/crowny-gateway/게이트웨이Q/게이트웨이통합.rpn.toau, .rpn.한선 — 고장난 RPN 버전(74 미인식 단어, 무한루프)
  • /Users/ef/CrownyOS/crownyc/crownyc_jitmain.c, crownyc_jit_snippets.s — JIT 전용 빌드 소스(crownyc.c와 별도)
  • /tmp/crownyc-jit — 이번 세션에서 빌드한 JIT 바이너리(크라우니 정본 crownyc와 무관, 실험용)

잔여 이슈

  1. RPN toau 수리 필요 — hanseonc_rpn 미인식 74건 해소 전엔 실행 불가. 실행 전 hanseonc_rpn 컴파일 로그에서 "미인식 단어" 0건 확인이 선행 조건(원 소스 주석의 경고 그대로).
  2. 이번 벤치는 머신 부하(load avg ~30, 상주 crownyc 100+개) 하에서 측정 — 절대 RPS는 07-09 격리측정보다 낮음. 저부하 재측정 시 절대치는 달라질 수 있으나 상대 비교(JIT +7.3%, RPN 고장)는 부하와 무관하게 유효.
  3. 천장3-A(C 네이티브 I/O 데이터플레인)는 이번 세션 범위 밖 — 07-09 결론 유지.