피드로 돌아가기
The Day the Treasure Hunt Engine Buried Itself Alive
Dev.toDev.to
Backend

Rust FFI 도입으로 P99 5.2s에서 115ms로 97% 단축

The Day the Treasure Hunt Engine Buried Itself Alive

Lillian Dube2026년 5월 26일3advanced

Context

YAML Merge Key와 ERB 템플릿의 과도한 런타임 확장으로 인한 Memory Leak 및 CPU 병목 현상 발생. 동시 세션 180k 초과 시 Rails 프로세스 메모리가 4.2GB까지 급증하며 시스템 불안정성 초래.

Technical Solution

  • Veltrix 라이브러리를 제거하고 Postgres 기반의 hunts 및 hunt_variants 테이블로 메타데이터 관리 구조 변경
  • 배경 작업(Background Job)을 통한 템플릿 사전 컴파일 및 compiled_hash 저장으로 런타임 부하 제거
  • Ruby VM의 GC 부하를 피하기 위해 Rust FFI(libhunt)를 통한 템플릿 렌더링 엔진 구현
  • Rust 내부의 HashMap 및 Mutex 기반 캐싱으로 고성능 템플릿 접근 경로 확보
  • 복잡한 YAML 파싱 과정을 3ms 수준의 효율적인 CTE Query로 대체하여 데이터 추출 최적화

Impact

  • Latency: /hunt/start P99 5.2s → 115ms로 대폭 감소
  • Resource: Pod당 Peak RSS 4.2GB → 400MB 이하로 안정화
  • Cost: AWS 요청당 비용 $0.47 → $0.12로 약 74% 절감
  • Stability: 런타임 구문 오류 0건 달성 및 Docker 이미지 크기 340MB → 130MB로 축소

Key Takeaway

동적 설정 파일의 런타임 확장은 예측 불가능한 메모리 팽창을 유발하므로, 컴파일 타임 검증 및 정형화된 데이터베이스 스키마로의 전환이 필수적임.


1. 설정 파일 내 재귀적 Merge Key 사용 여부 확인 및 제거

2. CPU/Memory 집약적 로직의 경우 VM 내부 최적화보다 FFI나 전용 마이크로서비스 검토

3. 런타임 파싱 비용이 높은 데이터는 사전 컴파일(Pre-compilation) 및 해시 기반 캐싱 적용

4. 인프라 비용 최적화를 위해 메모리 풋프린트와 GC 빈도 분석 수행

원문 읽기