diff options
Diffstat (limited to 'docs/research')
| -rw-r--r-- | docs/research/075-http-host-against-axum.md | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/docs/research/075-http-host-against-axum.md b/docs/research/075-http-host-against-axum.md index 8a03889..17cfe39 100644 --- a/docs/research/075-http-host-against-axum.md +++ b/docs/research/075-http-host-against-axum.md @@ -137,3 +137,39 @@ ThreadSanitizer는 이 커널(47비트 가상 주소)을 지원하지 않아 쓰 충돌에 안전한 axum 대비 쓰기 처리량 3.4–4.5배, 봉우리 RSS 3.0–4.6 MiB 대 7.3–9.6 MiB다. 이제 읽기, 1 MiB 읽기, 저장 보장 쓰기 모두에서 axum보다 빠르고 메모리를 덜 쓴다. + +## 5단계: drogon 추가, CPU 효율 + +drogon(C++) 1.9.0으로 같은 계약의 서비스를 만들었다(`benchmarks/http/drogon-baseline`, Debian 패키지를 설치하지 +않고 풀어서 빌드). 메모리·fdatasync·충돌 안전 세 모드, IO 스레드 3개다. 처음 잰 값(65k/s)은 잘못이었다. +drogon은 IO 루프마다 `SO_REUSEPORT` 리스너를 따로 여는데, 포트 0을 주면 루프마다 다른 포트가 잡혀 부하가 루프 +하나에만 갔다. 빈 포트를 먼저 골라 쓰게 고쳤다. + +부하 생성기는 코어 하나라 초당 약 15만 건 근처에서 먼저 한계에 닿는다. 그래서 하네스가 서버 CPU 시간(모든 스레드, +user+system)당 성공 응답 수(`2xx/cpu-s`)도 기록한다. 아래 표는 서버 순서를 회전한 3라운드(3초씩)의 중앙값이다 +([원시 결과](../../research/experiments/011-http-frameworks/2026-09-26-pi5-sd.jsonl)). +괄호 안은 p99(µs)다. + +| 작업 | pure-serve | pure-serve 3샤드 | axum | drogon | +|---|---:|---:|---:|---:| +| GET 64 B keep-alive, 성공/초 | 127,764 (576) | **151,608** (608) | 120,942 (1,152) | 145,269 (736) | +| 같은 작업, 성공/CPU-초 | **128,191** | 99,961 | 61,754 | 65,338 | +| GET 64 B 연결마다 닫기, 성공/초 | **23,219** | 22,619 | 21,208 | 20,910 | +| 같은 작업, 성공/CPU-초 | **41,629** | 36,482 | 18,462 | 18,450 | +| GET 1 MiB keep-alive, 성공/초 | **2,794** | 1,751 | 1,372 | 708 | +| PUT 충돌 안전, 연결 64, 성공/초 | 2,155 | **2,450** | 421 | 83 | +| PUT 충돌 안전, 연결 8, 성공/초 | 548 | **551** | 105 | 41 | +| 봉우리 RSS | **5.0 MiB** | 6.1 MiB | 14.4 MiB | 76.5 MiB | + +axum과 drogon의 GET·RSS는 메모리 모드, PUT은 충돌 안전 모드(임시 파일, fsync, rename, 디렉터리 fsync)다. Pure는 +모든 쓰기를 트리 저장소에 커밋한다. 참고로 충돌에 안전하지 않은 fdatasync 모드는 axum 433·101, drogon 146·87이었다. +메모리 모드의 PUT은 axum 58,360·33,767, drogon 60,482·37,802로 내구성이 없어 비교 대상이 아니다. + +- 작은 GET 처리량은 3샤드가 가장 높다. CPU 효율은 1스레드가 axum·drogon의 약 2배다(부하 생성기 한계 근처에서 + 3샤드는 스레드끼리 부하를 나누느라 효율이 낮아진다). +- 1 MiB GET은 axum의 2배, drogon의 3.9배다. drogon은 본문을 `std::string`으로 여러 번 복사한다. +- 충돌 안전 쓰기는 axum의 5.1–5.8배, drogon의 13–30배다. drogon 판은 가장 단순한 핸들러라 동기화하는 동안 이벤트 + 루프를 막는다(axum 판은 `spawn_blocking`으로 넘긴다). 동기화를 별도 스레드 풀로 옮기면 drogon 값은 나아질 수 + 있다. 그래도 요청마다 동기화하는 한 axum 판과 같은 한계에 닿는다. +- 메모리는 axum의 약 1/3, drogon의 약 1/15다. + |
