跳至主要內容

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)
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。

兩種組態3次執行中記錄的請求均回傳HTTP 2xx,請求錯誤與逾時均為0。

組態p95 (ms)p99 (ms)
Spine0.9442.739
Spring MVC60.92789.248
查看完成速率與統計依據

此完成速率記錄於固定目標負載下,不代表最大吞吐量。完成速率為每次執行的成功回應數除以記錄的經過時間。不同執行的經過時間可能不同,各欄分別取3次獨立伺服器啟動的中位數。完成速率不等於請求遺失率。

組態實際完成速率 (req/s)
Spine116,777
Spring MVC117,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萬次請求計算的情境

使用Spine取代NestJS / Express時
₩73,440/ 年,預估節省
換算每月預估節省約₩6,120
3 vCPU / 6GB每年$80,一次預付
使用Spine取代Spring MVC時
₩46,734/ 年,預估節省
換算每月預估節省約₩3,895
2 vCPU / 4GB每年$60,一次預付
使用Spine取代FastAPI / Uvicorn時
₩126,851/ 年,預估節省
換算每月預估節省約₩10,571
4 vCPU / 8GB每年$120,一次預付

依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

執行版本

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秒、共3次的量測。DB、外部API、CORS、身分驗證、TLS、逐請求DI服務呼叫和長時間運作穩定性不在測試範圍內。
  • 記憶體按量測期間每隔1秒採集的memory.current計算各視窗中位數,再取3次執行的中位數。該值不表示最低所需RAM或行程RSS。

公開資料和驗證

我們驗證了30個正式量測樣本、168項HTTP契約檢查和30個HDR直方圖。未出現請求錯誤或Docker OOMKilled標記。ZIP包含應用程式原始碼、量測程式碼、原始zrk JSON和直方圖。

組態選擇和量測標準的來源

← 返回主畫面