Spine 內部實驗室測試
2026-11-01, Spine 0.5.2, GOGC=400
我們在相同CPU和記憶體條件下比較了HTTP吞吐量、回應延遲和記憶體用量。這是Spine專案參考Web Frameworks Benchmark公開量測方法進行的自行量測。
比較結果
吞吐量在飽和負載下比較,延遲和記憶體在統一每秒2萬請求的條件下比較。每個數值都是重新啟動伺服器後測得的3次結果的中位數。
飽和負載,256個並行連線
| 組態 | 吞吐量 (req/s) | p95 (ms) | p99 (ms) |
|---|---|---|---|
| Spine | 163,559觀測範圍: 161,621–164,739 | 3.159 | 4.398 |
| NestJS / Express | 93,977觀測範圍: 92,999–94,433 | 3.567 | 4.770 |
| Spring MVC | 118,943觀測範圍: 117,960–121,504 | 3.119 | 3.891 |
| FastAPI / Uvicorn | 50,173觀測範圍: 50,124–50,190 | 5.471 | 7.026 |
統一負載,每秒20,000請求
| 組態 | 平均 (ms) | p95 (ms) | p99 (ms) | 觀測記憶體用量 (MiB) |
|---|---|---|---|---|
| Spine | 0.169 | 0.399 | 1.062觀測範圍: 0.825–1.154 | 41.8 |
| NestJS / Express | 0.210 | 0.528 | 1.098觀測範圍: 0.956–1.509 | 479.3 |
| Spring MVC | 0.199 | 0.511 | 1.115觀測範圍: 1.093–1.235 | 608.8 |
| FastAPI / Uvicorn | 0.411 | 1.059 | 1.744觀測範圍: 1.563–1.814 | 156.5 |
在統一每秒2萬請求的條件下,Spine的平均回應時間為0.169ms,p95為0.399ms,p99為1.062ms。
固定目標負載下的回應延遲
本測試比較目標為每秒118,000次請求時的回應延遲。在用於吞吐量比較的獨立飽和負載測試中,Spine為163,559 req/s,Spring MVC為118,943 req/s。
兩種組態3次執行中記錄的請求均回傳HTTP 2xx,請求錯誤與逾時均為0。
| 組態 | p95 (ms) | p99 (ms) |
|---|---|---|
| Spine | 0.944 | 2.739 |
| Spring MVC | 60.927 | 89.248 |
查看完成速率與統計依據
此完成速率記錄於固定目標負載下,不代表最大吞吐量。完成速率為每次執行的成功回應數除以記錄的經過時間。不同執行的經過時間可能不同,各欄分別取3次獨立伺服器啟動的中位數。完成速率不等於請求遺失率。
| 組態 | 實際完成速率 (req/s) |
|---|---|
| Spine | 116,777 |
| Spring MVC | 117,305 |
兩種組態完成速率的中位數均來自第3次執行:Spine在15.142秒記錄1,768,230次成功回應,Spring MVC在15.001秒記錄1,759,690次。統計時長較長時,即使成功回應更多,每秒速率也可能較低。
每秒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萬次請求計算的情境
依vpsGOD年度預付費用的差額計算。每月節省金額為年度差額除以12。比較對象也採用了較便宜的公開優惠方案。
Spine的估算以提供2 vCPU和256MB記憶體的方案為準。此配置每年預付$25。
這是基於CPU效能與餘裕假設的預測。尚未在該VM上實測處理量與p99,額外流量和稅費不計入其中。
查看配置與計算依據
計算採用的假設
假設單核心效能為測量環境的50%,並預留20%的CPU餘裕。核心數依3次測量中最高的平均CPU用量計算。
將包含啟動與暖機的記憶體用量觀測最大值乘以1.25,再加上供輕量作業系統使用的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。匯率為$1 = ₩1,335.27,依2026-10-30歐洲中央銀行的參考值計算。未使用首張帳單折扣碼。
預估年度節省金額 = (比較方案年費 − 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,另行分配的9個CPU,記憶體1GiB |
| 工作 | 43位元組JSON解析 → 欄位驗證 → JSON回應 |
| 重複量測 | 每個實作重新啟動伺服器3次,每個量測視窗15秒,共30個樣本 |
| 暖機 | Spring MVC至少135秒,其餘為45秒。最近3個視窗的吞吐量變異係數不超過5% |
| Spine設定 | GOGC=400,GOMAXPROCS=3,GOMEMLIMIT=2700MiB |
執行版本
| Spine | 0.5.2 · Echo 4.15.0 · Go 1.27.3 |
|---|---|
| NestJS / Express | NestJS 12.3.2 · Express 5.3.0 · Node.js 26.13.0 · 3 workers |
| Spring MVC | Spring Boot 4.1.2 · Java 25.0.5 · Tomcat · virtual threads |
| FastAPI / Uvicorn | FastAPI 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秒、共3次的量測。DB、外部API、CORS、身分驗證、TLS、逐請求DI服務呼叫和長時間運作穩定性不在測試範圍內。
- 記憶體按量測期間每隔1秒採集的memory.current計算各視窗中位數,再取3次執行的中位數。該值不表示最低所需RAM或行程RSS。
公開資料和驗證
我們驗證了30個正式量測樣本、168項HTTP契約檢查和30個HDR直方圖。未出現請求錯誤或Docker OOMKilled標記。ZIP包含應用程式原始碼、量測程式碼、原始zrk JSON和直方圖。
組態選擇和量測標準的來源
- Web Frameworks Benchmark
- Go garbage collector
- NestJS
- npm: Express
- npm: Fastify
- State of Spring 2024 (PDF)
- FastAPI / Uvicorn
- Uvicorn
- CPU reference clock
