package stress import ( "fmt" "time" ) // ============================ // 测试指标定义 // ============================ // Metric 测试指标(定义测什么、用什么工具、怎么判结果) type Metric struct { Name string // 指标名称(cpu/memory/disk/memnative/full) Tool string // 依赖的工具(stress-ng/stressapptest/fio) Enabled bool // 是否启用 IsMonitor bool // 是否为监控指标(temp/dmesg,自动附加) DisableReason string // 禁用时展示的原因 } // BuildMetrics 根据配置和可用工具,生成要执行的指标列表 func BuildMetrics(types []TestType, tools ToolSet) []Metric { var metrics []Metric for _, t := range types { m := Metric{Name: string(t), Enabled: true} switch t { case TestCPU: m.Tool = "stress-ng" case TestMemory: m.Tool = "stress-ng" case TestDiskIO: // disk 优先 fio;无 fio 可降级 stress-ng switch { case tools.Has("fio"): m.Tool = "fio" case tools.Has("stress-ng"): m.Tool = "stress-ng" default: m.Tool = "fio" } case TestMemNative: m.Tool = "stressapptest" case TestFull: m.Tool = "stress-ng" default: m.Enabled = false m.DisableReason = "未知测试类型" } // 根据工具可用性决定是否禁用,并记录原因 switch t { case TestDiskIO: if !tools.Has("fio") && !tools.Has("stress-ng") { m.Enabled = false m.DisableReason = "缺少 fio 或 stress-ng" } default: if m.Tool != "" && !tools.Has(m.Tool) { m.Enabled = false m.DisableReason = fmt.Sprintf("缺少 %s", m.Tool) } } metrics = append(metrics, m) } // 自动附加监控指标 metrics = append(metrics, Metric{Name: "temp", Tool: "lm-sensors", Enabled: tools.Has("lm-sensors"), IsMonitor: true}) metrics = append(metrics, Metric{Name: "dmesg", Tool: "", Enabled: true, IsMonitor: true}) return metrics } // ============================ // 压力测试配置 // ============================ // Config 压力测试配置 type Config struct { Duration time.Duration Threads int MemSizeMB int // 0=自动(可用60%) DiskSizeMB int // 0=默认1024 DiskDir string // 空=自动临时目录 TempLogInt time.Duration // 0=10s TempLimit float64 // 温度上限(°C),0=不判定 } // DefaultConfig 默认配置 func DefaultConfig() Config { return Config{ Duration: 30 * time.Second, Threads: 4, DiskSizeMB: 1024, TempLogInt: 10 * time.Second, TempLimit: 90, } }