23개 웹 프레임워크 벤치마크: 상위 5개는 Rust 기반
요약
23개의 웹 프레임워크를 대상으로 RPS, 지연 시간, 리소스 효율성, 스트레스 테스트를 포함한 4단계 벤치마크를 수행했습니다. 특히 메모리 1MB당 처리 가능한 요청 수를 기준으로 효율성 점수를 산출하여 Rust 기반 프레임워크의 우수성을 확인했습니다.
핵심 포인트
- 4단계 아키텍처를 통한 다각도 성능 검증
- RPS 대비 메모리 사용량을 기준으로 한 효율성 점수 도입
- 스트레스 테스트를 통한 메모리 누수 및 회복 탄력성 확인
- Rust 기반 프레임워크가 상위 5개에 포진하며 높은 효율성 증명
🧪 벤치마크 방법론 (4단계 아키텍처)
다양한 실제 시나리오를 시뮬레이션하기 위해, 우리의 테스트 접근 방식은 네 가지 견고한 단계로 나뉩니다:
🌍 1단계: 빠른 로드 (기본 성능)
- 목표: 순수 초당 요청 수 (RPS, Requests Per Second) 및 지연 시간 (Latency)의 기준점 설정.
- 부하: 10초 동안 125개의 동시 연결 (Concurrent connections).
- 엔드포인트 (Endpoints):
/text,/json,/db-single,/html
⚡ 2단계: 동시성 및 지연 시간 (고트래픽)
- 목표: 갑작스러운 트래픽 급증 시의 동작을 평가하고 P99 지연 시간 (P99 latency)을 측정.
- 부하: 30 seconds 동안 300개의 동시 연결.
- 엔드포인트 (Endpoints):
/json
🧠 3단계: 리소스 효율성 (유휴 상태 vs 피크 상태)
- 목표: "탐욕적인 (Greedy)" 아키텍처와 "효율적인 (Efficient)" 아키텍처의 CPU 및 RAM 사용률 식별.
- 방법: 트래픽이 없는 상태 (Idle)와 200개의 동시 연결이 있는 상태 (Peak) 동안의 Docker 통계 측정.
🔥 4단계: 스트레스 및 회복 탄력성 (메모리 누수 탐지)
- 목표: 프레임워크가 장시간의 스트레스 상황에서도 충돌하거나 메모리 누수 (Memory leak)가 발생하지 않는지 확인.
- 부하: 2분 동안 지속적으로 500개의 동시 연결.
- 엔드포인트 (Endpoints):
/json
🏅 효율성 순위 점수 (RPS/MB)
우리의 공식 순위는 프레임워크가 소비하는 메모리 1MB당 얼마나 많은 요청을 처리할 수 있는지를 측정하는 **효율성 점수 (Efficiency Score)**에 의해 결정됩니다.
- 공식:
효율성 (Efficiency) = JSON RPS (1단계) / 피크 RAM MB (3단계) - 예시: 20MB RAM으로 100,000 RPS를 처리하는 프레임워크는
5,000점을 받습니다. 200MB RAM으로 100,000 RPS를 처리하는 프레임워크는500점을 받습니다. - 실격 페널티: 4단계 스트레스 테스트 (Tier 4 Stress Test) 동안 연결을 끊거나, 충돌하거나,
timeout에러를 반환하는 모든 프레임워크는 자동으로 실격 처리되며 0점을 받습니다. 서버가 압박 속에서 무너진다면 속도는 의미가 없습니다!
💻 최소 하드웨어 요구 사항
자원 부족(특히 500개 연결의 Tier 4 테스트 중)으로 인해 결과가 왜곡되는 것을 방지하기 위해, 이 벤치마크를 로컬에서 실행하려면 다음의 최소 사양을 권장합니다:
- CPU: 4 코어 / 8 스레드 (8 코어 이상 권장)
- RAM: 최소 8GB (16GB 이상 권장)
- OS: Linux, macOS, 또는 Windows (WSL2)
- Docker Engine: Docker에 최소 4개의 CPU와 8GB의 RAM이 할당되었는지 확인하십시오.
📊 공식 테스트 하드웨어
이 저장소(repository)에 나열된 모든 벤치마크 결과는 일관성을 보장하기 위해 다음 환경에서 실행되었습니다:
- CPU:
AMD Ryzen 7 5700U (8 Cores / 16 Threads) - RAM:
8GB - OS:
Windows 11 (Docker with WSL2)
🗄️ 데이터베이스 아키텍처 (Database Architecture)
모든 프레임워크는 전용 PostgreSQL 15 컨테이너에 연결됩니다.
- 데이터베이스는
db-init스크립트를 통해 초기화되며, 이 스크립트는world라는 테이블에 수천 개의 무작위 행을 미리 채워 넣습니다. - 프레임워크는
/db-single엔드포인트를 위해ID = 1인World레코드를 가져와야 합니다. 커넥션 풀링 (Connection pooling) 사용을 강력히 권장합니다.
Top 10:
🏅 공식 효율성 순위 (Official Efficiency Ranking)
| 🏆 순위 | 프레임워크 | 언어 | 효율성 (RPS/MB) | JSON RPS | DB Single RPS | 평균 지연 시간 (Avg Latency) | 최대 RAM (Peak RAM) | 상태 |
|---|---|---|---|---|---|---|---|---|
| 🥇 1위 | Actix-Web | Rust | 6.778 | 128.654,31 | 12.366,9 | 2.34ms | 18.98MiB | ✅ 통과 (Passed) |
| ... |
상위 23개를 확인하고 싶으신가요?
링크는 다음과 같습니다: https://rullst.github.io/Benchmarks/
저장소 링크: https://github.com/Rullst/Benchmarks/
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기