cube-bench 基准测试 源码级讲解
概述
cube-bench 是 CubeSandbox 官方的性能基准工具,直接驱动 CubeAPI HTTP 端点,精确测量沙箱创建/销毁延迟。使用 Go 编写,支持并发压测、TUI 实时展示、JSON 报告导出。
整体架构
源码解析:核心数据流
1. runner.go — 单次压测迭代
go
func benchOne(client *http.Client, cfg *Config, seq int) IterResult {
// ① 计时开始
t0 := time.Now()
// ② 创建沙箱
req, _ := http.NewRequest("POST", apiURL+"/sandboxes", body)
resp, _ := client.Do(req)
r.CreateMs = float64(time.Since(t0).Microseconds()) / 1000.0
// ③ 解析 sandboxID
json.Unmarshal(respBody, &cr)
// ④ 删除沙箱(create-delete 模式)
dreq, _ := http.NewRequest("DELETE", apiURL+"/sandboxes/"+cr.SandboxID, nil)
dresp, _ := client.Do(dreq)
r.DeleteMs = float64(time.Since(t0).Microseconds()) / 1000.0
}单次迭代时序图
2. main.go — 并发调度
go
// 核心:用 channel 控制并发度
sem := make(chan struct{}, cfg.Concurrency)
var wg sync.WaitGroup
for i := 0; i < cfg.Total; i++ {
wg.Add(1)
sem <- struct{}{} // 获取信号量
go func(seq int) {
defer wg.Done()
defer func() { <-sem }() // 释放信号量
result := benchOne(client, cfg, seq)
results <- result
}(i)
}并发模型
3. stats.go — 统计计算
| 指标 | 计算方式 |
|---|---|
| P50 / P90 / P99 | 排序后百分位 |
| Mean | 所有迭代均值 |
| StdDev | 标准差 |
| Error Rate | 失败迭代占比 |
4. ui.go — Charm TUI
基于 bubbletea + lipgloss 的终端 UI:
Dry-Run 模式原理
当 --dry-run 开启时,不发真实请求,而是模拟随机延迟:
go
func benchOneDry(cfg *Config, seq int) IterResult {
createLat := cfg.DryLatencyMean + cfg.DryLatencyStd*rand.NormFloat64()
time.Sleep(time.Duration(createLat) * time.Millisecond)
// 模拟错误率
if rand.Float64() < cfg.DryErrorRate {
r.Err = "simulated error"
}
}适合在无服务器环境下验证统计逻辑和 TUI 渲染。
与 CubeSandbox 内部链路的关系
注意:cube-bench 测量的是端到端延迟(包含网络),要区分"平台延迟"和"网络延迟"。
推荐阅读顺序
main.go— CLI 解析与并发调度runner.go— 核心压测逻辑stats.go— 统计计算ui.go— TUI 展示report.go— JSON 报告导出
源码参考:cube-bench/