Skip to content

cube-bench 基准测试 源码级讲解

源码路径:CubeSandbox/examples/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 测量的是端到端延迟(包含网络),要区分"平台延迟"和"网络延迟"。

推荐阅读顺序

  1. main.go — CLI 解析与并发调度
  2. runner.go — 核心压测逻辑
  3. stats.go — 统计计算
  4. ui.go — TUI 展示
  5. report.go — JSON 报告导出

源码参考:cube-bench/