本文記錄 Spider RPC (高效能 Java RPC 框架) 在特定硬體環境下的完整效能基準測試過程、關鍵指標、瓶頸分析與調優建議,為分散式系統容量規劃提供參考。
┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ Client │ ───▶ │ Spider NB │ ───▶ │ Spider NP │ │ (Driver) │ │ (Broker) │ │ (Provider) │ └─────────────┘ └─────────────┘ └─────────────┘ 200 並發 VMware VM VMware VM 8C/16G 4C/8G 4C/8G Linux 4.19 Linux 4.19 Linux 4.19 JDK 1.8 JDK 1.8 JDK 1.8
網路:千兆內網,平均延遲 0.3ms
序列化:Spider 私有二進制協定 (類似 Hessian2)
壓縮:Zlib 啟用 (請求 194B → 120B,響應 178B → 110B)
// Request (194 bytes)
{
"systemId": "PL",
"appVersion": "qq.qq.qq",
"companyId": "12",
"sourceIp": "DESKTOP-NDOHT79",
"destIp": "DESKTOP-NDOHT79",
"spiderOpts": {},
"companyName": "機構1",
"createDate": "20160101",
"companyType": 1
}
// Response (178 bytes)
{
"lists": [
{"nodeId": 100001, "nodeName": "機構100001", "companyId": "1200", "createDate": "20160101"},
{"nodeId": 100001, "nodeName": "機構100001", "companyId": "1200", "createDate": "20160101"}
]
}
@RequestMapping("/1001.html")
@ResponseBody
public String t1001() {
PlatformReq req = PlatformReq.createDemo();
req.setCompanyId("12");
req.setSystemId("PL");
// 為壓滿 Server CPU,每次 HTTP 請求發起 5 次 RPC 調用
platformService.doQuery(req); // 1
platformService.doQuery(req); // 2
platformService.doQuery(req); // 3
platformService.doQuery(req); // 4
platformService.doQuery(req); // 5
return JsonUtils.toJson(platformService.doQuery(req)); // 6 (返回結果)
}
@Service
public class PlatformServiceImpl implements PlatformService {
public PlatformQuery doQuery(PlatformReq req) {
// 極簡邏輯:僅構建響應物件,無 DB/外部呼叫
return PlatformQuery.createDemo();
}
}
| 指標 | 數值 | 備註 |
|---|---|---|
| 客戶端運行總次數 | ≈ 1,500 萬 | 測試持續時長統計 |
| Spider RPC 總調用次數 | ≈ 7,500 萬 | 客戶端次數 × 5 |
| 平均響應時間 (RT) | 90 ms | 含網路、序列化、業務邏輯 |
| 客戶端 QPS | 2,199 TPS | HTTP 介面吞吐 |
| Spider NB/NP 叢集 QPS | ≈ 11,000 TPS | 2,199 × 5 (單機 NB 處理上限) |
| 客戶端 CPU 負載 | 95%~100% | 壓測驅動端瓶頸 |
| Spider NB CPU 負載 | 90%~95% | 軟中斷佔比高 (VMware 虛擬網卡單隊列) |
| Spider NP CPU 負載 | ~60% | 業務邏輯極簡,資源閒置 |
| 失敗率 | < 0.01% | 網路抖動導致超時 |
VMware 虛擬網卡預設單隊列 (single RX/TX queue),所有網路封包中斷集中在 CPU 0 處理,導致單核 100% 而其他核心閒置。
證據:top -H 顯示 ksoftirqd/0 佔用 90%+ CPU,cat /proc/interrupts 顯示 eth0 中斷全在 CPU0。
參考:阿里雲 ECS 同樣受限於單隊列網卡,單機 TPS 上限約 18,000 (參考《阿里雲 ECS 單隊列網卡軟中斷優化》)。
單客戶端 200 並發無法壓滿 Provider (NP CPU 僅 60%)。解決方案:增加客戶端機器、提高並發、使用專業壓測工具 (如 JMeter、nGrinder、wrk2)。
Zlib 壓縮雖減少網路傳輸 (約 38%),但增加 CPU 計算。內網高頻小包場景建議關閉壓縮,跨機房/公網啟用。
Spider RPC 在 4C/8G VMware 環境下單機 NB 可支撐 11k QPS,受限於虛擬化網路軟中斷。物理機多隊列網卡環境下預估單機 30k+ QPS。生產環境建議:物理機部署 + 多隊列網卡 + 客戶端集群壓測 + 全鏈路監控,並建立自動化效能基準回歸機制,防範版本迭代引入效能退化。