본문으로 건너뛰기

Spine 내부 랩 테스트 ​

2026-11-01, Spine 0.5.2, GOGC=400

같은 CPU와 메모리 조건에서 HTTP 처리량, 응답 지연과 메모리 사용량을 비교했습니다. Web Frameworks Benchmark의 공개 측정 방식을 참고한 Spine 프로젝트의 자체 측정입니다.

비교 결과

처리량은 포화 부하, 지연과 메모리는 공통 초당 2만 요청 조건에서 각각 비교합니다. 각 값은 서버를 새로 시작해 측정한 3회 결과의 중앙값입니다.

포화 부하, 동시 연결 256

구성처리량 (req/s)p95 (ms)p99 (ms)
Spine163,559관측 범위: 161,621–164,7393.1594.398
NestJS / Express93,977관측 범위: 92,999–94,4333.5674.770
Spring MVC118,943관측 범위: 117,960–121,5043.1193.891
FastAPI / Uvicorn50,173관측 범위: 50,124–50,1905.4717.026

공통 부하, 초당 20,000 요청

구성평균 (ms)p95 (ms)p99 (ms)관측 메모리 (MiB)
Spine0.1690.3991.062관측 범위: 0.825–1.15441.8
NestJS / Express0.2100.5281.098관측 범위: 0.956–1.509479.3
Spring MVC0.1990.5111.115관측 범위: 1.093–1.235608.8
FastAPI / Uvicorn0.4111.0591.744관측 범위: 1.563–1.814156.5

공통 초당 2만 요청에서 Spine의 평균 응답 시간은 0.169ms, p95는 0.399ms, p99는 1.062ms였습니다.

고정 목표 부하에서의 응답 지연

초당 118,000건 목표 부하에서 응답 지연을 비교했습니다. 처리량 비교에 사용하는 별도 포화 부하 실험의 관측값은 Spine 163,559 req/s, Spring MVC 118,943 req/s입니다.

두 구현 모두 세 실행에서 기록된 요청은 전부 HTTP 2xx 응답이었고, 요청 오류와 타임아웃은 0건이었습니다.

구성p95 (ms)p99 (ms)
Spine0.9442.739
Spring MVC60.92789.248
완료 처리율과 집계 근거 보기

이 완료 처리율은 고정 목표 부하에서 기록된 값으로 최대 처리량을 뜻하지 않습니다. 완료 처리율은 성공 응답 수를 실행별 기록 시간으로 나눈 값입니다. 기록 시간은 실행마다 달라질 수 있으며, 각 열은 독립 실행 3회의 지표별 중앙값입니다. 완료 처리율은 요청 손실률을 뜻하지 않습니다.

구성실제 완료 처리율 (req/s)
Spine116,777
Spring MVC117,305

표의 완료 처리율 중앙값에 해당하는 3회차에서 Spine은 1,768,230건을 15.142초에, Spring MVC는 1,759,690건을 15.001초에 집계했습니다. 성공 응답 수가 더 많아도 집계 시간이 길면 초당 값은 낮게 나타날 수 있습니다.

11.8만 요청 조건은 Spring MVC의 포화 처리량에 가깝습니다. p99 관측 범위는 Spine 2.707–2.931ms, Spring MVC 10.724–206.784ms였습니다. Spring MVC의 3회 중 1회는 목표 요청률의 98%에 미달했으며 해당 표본을 보존했습니다.

예상 연간 절감액

실측한 CPU와 메모리 사용량을 vpsGOD의 공개 상품에 대입한 예측입니다. 아래 요금은 실제 VM 성능 측정 결과와 구분해 읽어주세요.

초당 2만 요청을 기준으로 계산한 시나리오

NestJS / Express 대신 Spine을 쓰면
₩73,440/ 년 절감 예상
월 환산 약 ₩6,120 절감 예상
3 vCPU / 6GB연 $80 선결제
Spring MVC 대신 Spine을 쓰면
₩46,734/ 년 절감 예상
월 환산 약 ₩3,895 절감 예상
2 vCPU / 4GB연 $60 선결제
FastAPI / Uvicorn 대신 Spine을 쓰면
₩126,851/ 년 절감 예상
월 환산 약 ₩10,571 절감 예상
4 vCPU / 8GB연 $120 선결제

vpsGOD의 연간 선결제 요금 차이로 계산했습니다. 월 절감액은 연간 차액을 12로 나눈 값입니다. 비교군에도 저렴한 공개 할인 상품을 적용했습니다.

Spine은 2 vCPU와 256MB 메모리를 제공하는 상품을 기준으로 계산했습니다. 연 $25를 선결제하는 구성입니다.

CPU 성능과 여유를 가정한 예측입니다. 해당 VM에서 처리량과 p99를 실측하지 않았으며, 추가 트래픽과 세금은 제외했습니다.

구성과 계산 근거 보기

계산에 사용한 가정

코어당 성능을 측정 환경의 50%로 가정하고 CPU 여유 20%를 반영했습니다. 3회 측정 중 가장 큰 평균 CPU 사용량으로 코어 수를 계산했습니다.

시작과 예열을 포함한 관측 최대 메모리의 1.25배에 경량 OS용 128MiB를 더했습니다. 워커 수 조정과 미리 빌드한 앱의 직접 실행을 가정한 값이며, 최소 RAM 실측값은 아닙니다.

필요 CPU와 RAM을 만족하는 확인된 상품 중 연간 기본요금이 낮은 것을 골랐습니다. 더 큰 할인 상품이 더 저렴하면 비교군에도 적용했습니다.

할인 상품은 CPU를 공정 공유 방식으로 배분합니다. 지속 CPU 할당률은 공개되지 않았습니다. 할인 상품의 지역, 최종 재고와 갱신 가격은 확인하지 않았습니다.

포함 트래픽은 Spine 100GB, NestJS 2TB, Spring MVC 1TB, FastAPI 4TB입니다. 초과 전송량 비용은 별도이며, 표시 요금으로 초당 2만 요청을 한 달 내내 처리한다는 뜻은 아닙니다.

CPU 여유를 30%로 늘리면 Spring MVC도 3코어가 필요합니다. FastAPI는 5코어가 필요하지만 확인한 공개 목록에는 맞는 단일 VM이 없어 그 조건의 요금은 산출하지 않았습니다.

요금 확인일 2026-11-01. 환율은 2026-10-30 유럽중앙은행 기준값으로 계산한 $1 = ₩1,335.27입니다. 최초 청구서 할인 코드는 적용하지 않았습니다.

연간 절감 예상액 = (비교 상품 연간 요금 − Spine 상품 연간 요금) × 환율

측정 환경과 방법

호스트ARM64, 14코어(성능 10, 효율 4), RAM 24GB
참고 클럭약 4.5GHz. 측정 중 실제 동작 클럭은 기록하거나 고정하지 않았습니다.
실행 환경Docker Desktop, Linux/arm64, HTTP/1.1 keep-alive, loopback
서버 자원 한도모든 구현에 3 vCPU, 3GiB, 추가 swap 없음
부하 생성기zrk 2.4.2, 별도 CPU 집합 9개, 메모리 1GiB
작업43바이트 JSON 파싱 → 필드 검증 → JSON 응답
반복구현별 새 서버 시작 3회, 창당 15초, 전체 30개 표본
예열Spring MVC 최소 135초, 나머지 45초. 최근 3개 창의 처리량 변동계수 5% 이하
Spine 설정GOGC=400, GOMAXPROCS=3, GOMEMLIMIT=2700MiB

실행 버전

Spine0.5.2 · Echo 4.15.0 · Go 1.27.3
NestJS / ExpressNestJS 12.3.2 · Express 5.3.0 · Node.js 26.13.0 · 3 workers
Spring MVCSpring Boot 4.1.2 · Java 25.0.5 · Tomcat · virtual threads
FastAPI / UvicornFastAPI 0.162.0 · Uvicorn 0.54.0 · Python 3.15.2 · uvloop · httptools · 3 workers

대표 비교 구성을 고른 이유

NestJS / ExpressAdapter

어댑터를 생략할 때 사용하는 기본 ExpressAdapter 구성과 npm 패키지 다운로드 규모를 참고했습니다. 2026-10-01~30의 @nestjs/platform-express 다운로드는 44,534,475회, @nestjs/platform-fastify는 7,725,701회였습니다. 다운로드 수는 패키지 사용 규모의 참고 지표이며 사용자 점유율은 아닙니다.

Spring MVC

State of Spring 2024 조사에서 응답자 1,464명의 70%가 WebMVC를 사용한다고 답한 점을 참고했습니다. 복수응답 설문 결과이며, 측정에는 Tomcat과 가상 스레드를 사용했습니다.

FastAPI / Uvicorn

공식 fastapi run 명령의 기본 ASGI 서버인 Uvicorn을 선택했습니다. 워커 3개와 uvloop, httptools를 사용했습니다.

결과를 읽는 방법

  • JSON은 측정에 사용한 공통 작업입니다. 메모리는 JSON 데이터만의 크기가 아니라 런타임, 프로세스, 워커를 포함한 서버 컨테이너 전체 관측값입니다.
  • Spine은 직접 필드 검사, NestJS는 ValidationPipe/class-validator, Spring MVC는 Jakarta Validation, FastAPI는 Pydantic으로 같은 시험 필드 제약을 검사했습니다.
  • 고정 요청률 지연은 예정된 송신 시각부터 계산해 송신 대기도 포함합니다. 포화 부하 지연은 응답 뒤 다음 요청을 보내는 다른 방식이므로 같은 부하 조건끼리 비교해야 합니다.
  • 단일 호스트에서 15초씩 세 번 측정한 결과입니다. DB, 외부 API, CORS, 인증, TLS, 요청별 DI 서비스 호출과 장시간 운영 안정성은 시험 범위에 포함하지 않았습니다.
  • 메모리는 측정 중 1초 간격 memory.current의 창별 중앙값을 다시 세 실행의 중앙값으로 요약했습니다. 최소 필요 RAM이나 프로세스 RSS를 의미하지 않습니다.

공개 데이터와 검증

본측정 30개, HTTP 계약 검사 168개, HDR 히스토그램 30개를 검증했습니다. 요청 오류와 Docker OOMKilled 표시는 없었습니다. ZIP에는 앱 소스, 측정 코드, 원본 zrk JSON과 히스토그램을 담았습니다.

선정, 측정 기준의 출처

← 메인 화면으로