From 0998633e5c45a9e5338e42be0b047afa9fc26670 Mon Sep 17 00:00:00 2001 From: alu Date: Thu, 6 Aug 2026 09:21:49 -0700 Subject: [PATCH] code cleanup --- app/cpu/drivers/drivers.go | 1 + app/cpu/drivers/rapl.go | 54 ++++++++++++-------------------------- app/cpu/drivers/sys.go | 3 ++- 3 files changed, 20 insertions(+), 38 deletions(-) diff --git a/app/cpu/drivers/drivers.go b/app/cpu/drivers/drivers.go index 5f0356a..c616b16 100644 --- a/app/cpu/drivers/drivers.go +++ b/app/cpu/drivers/drivers.go @@ -22,6 +22,7 @@ type PowerDriver interface { type ClockSensor struct { path string + number int Name string FrequencyGHz float64 } diff --git a/app/cpu/drivers/rapl.go b/app/cpu/drivers/rapl.go index 8845238..3a43fd1 100644 --- a/app/cpu/drivers/rapl.go +++ b/app/cpu/drivers/rapl.go @@ -2,7 +2,6 @@ package drivers import ( "fmt" - "math" "os" "path/filepath" "strconv" @@ -10,6 +9,8 @@ import ( "time" ) +const milliJoulePerJoule = float64(1000000) + type EnergyState struct { lastEnergy uint64 lastTime time.Time @@ -72,19 +73,9 @@ func getRaplLabel(inputPath string) string { } func (r *RaplDriver) calculateEnergyDelta(inputs []string, out *[]PowerSensor) { - now := time.Now() - - if r.energyState == nil { - r.energyState = make(map[string]EnergyState) - } - - for _, rawPath := range inputs { - key, err := filepath.EvalSymlinks(rawPath) - if err != nil { - key = filepath.Clean(rawPath) - } - - valBytes, err := os.ReadFile(key) + for _, path := range inputs { + now := time.Now() + valBytes, err := os.ReadFile(path) if err != nil { continue } @@ -94,49 +85,38 @@ func (r *RaplDriver) calculateEnergyDelta(inputs []string, out *[]PowerSensor) { continue } - prevState, exists := r.energyState[key] + sensorLabel := getRaplLabel(path) + + prevState, exists := r.energyState[path] if !exists { - r.energyState[key] = EnergyState{ + + r.energyState[path] = EnergyState{ lastEnergy: microJoules, lastTime: now, } *out = append(*out, PowerSensor{ - Name: getRaplLabel(key), + Name: sensorLabel, Watts: 0.0, }) continue } timeDiff := now.Sub(prevState.lastTime).Seconds() - if timeDiff < 0.05 { - continue - } - maxRange := uint64(math.MaxUint64) - rangeBytes, err := os.ReadFile(filepath.Join(filepath.Dir(key), "max_energy_range_uj")) - if err == nil { - if parsedMax, err := strconv.ParseUint(strings.TrimSpace(string(rangeBytes)), 10, 64); err == nil && parsedMax > 0 { - maxRange = parsedMax - } - } + // technically the energy counter could overflow, at ~18 TerraJoules + // the value will be off for that one measurement, then become correct again + energyDiff := float64(microJoules - prevState.lastEnergy) - var energyDiff uint64 - if microJoules >= prevState.lastEnergy { - energyDiff = microJoules - prevState.lastEnergy - } else { - energyDiff = (maxRange - prevState.lastEnergy) + microJoules - } + watts := (energyDiff / milliJoulePerJoule) / timeDiff - watts := (float64(energyDiff) / 1_000_000.0) / timeDiff - - r.energyState[key] = EnergyState{ + r.energyState[path] = EnergyState{ lastEnergy: microJoules, lastTime: now, } *out = append(*out, PowerSensor{ - Name: getRaplLabel(key), + Name: sensorLabel, Watts: watts, }) } diff --git a/app/cpu/drivers/sys.go b/app/cpu/drivers/sys.go index 33fd843..017cff2 100644 --- a/app/cpu/drivers/sys.go +++ b/app/cpu/drivers/sys.go @@ -53,6 +53,7 @@ func (r *SysDriver) ReadClockSensors() ([]ClockSensor, error) { clockSensors = append(clockSensors, ClockSensor{ path: path, + number: coreID, Name: fmt.Sprintf("core %d", coreID), FrequencyGHz: khz / 1000000.0, // Convert KHz to GHz }) @@ -60,7 +61,7 @@ func (r *SysDriver) ReadClockSensors() ([]ClockSensor, error) { // Guarantee numerical order by core ID sort.Slice(clockSensors, func(i, j int) bool { - return clockSensors[i].Name < clockSensors[j].Name + return clockSensors[i].number < clockSensors[j].number }) return clockSensors, nil