From 3e905300138dcd05acc8d877ffe687c4caddc597 Mon Sep 17 00:00:00 2001 From: Dennis Kobert Date: Wed, 16 Apr 2025 14:22:21 +0200 Subject: Implement better budgeting --- src/energy/budget.rs | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) (limited to 'src/energy') diff --git a/src/energy/budget.rs b/src/energy/budget.rs index 3edce30..cdb2b6d 100644 --- a/src/energy/budget.rs +++ b/src/energy/budget.rs @@ -5,24 +5,29 @@ use std::sync::Arc; type Pid = i32; -const MAX_BUDGET: u64 = 100; +const MAX_BUDGET_FACTOR: f64 = 5.0; +const MAX_BUDGET: u64 = 30000; pub trait BudgetPolicy: Send + 'static { - fn calculate_budgets(&self, energy_service: &mut EnergyService) -> HashMap; + fn calculate_budgets(&mut self, energy_service: &mut EnergyService) -> HashMap; } pub struct SimpleCappingPolicy { power_cap: Arc, + last_ratio: f64, } impl SimpleCappingPolicy { pub fn new(power_cap: Arc) -> Self { - Self { power_cap } + Self { + power_cap, + last_ratio: 1., + } } } impl BudgetPolicy for SimpleCappingPolicy { - fn calculate_budgets(&self, energy_service: &mut EnergyService) -> HashMap { + fn calculate_budgets(&mut self, energy_service: &mut EnergyService) -> HashMap { let mut budgets = HashMap::new(); let process_energies = energy_service.all_process_energy_deltas(); @@ -35,12 +40,17 @@ impl BudgetPolicy for SimpleCappingPolicy { println!("{actual_energy} {energy_cap}"); let base_energy_per_process = energy_cap / process_energies.iter().filter(|(_, e)| **e > 0f64).count() as f64; - let ratio = energy_cap / actual_energy; + let ratio = energy_cap / actual_energy * self.last_ratio; + self.last_ratio = ratio.clamp(0.001, 100.0); for (pid, energy) in process_energies { let budget = budgets.entry(pid).or_insert(0); - *budget = (*budget + (ratio * base_energy_per_process - energy as f64) as u64) + *budget = (*budget + ((ratio * base_energy_per_process - energy) * 1000.) as u64) + //.min((ratio * base_energy_per_process * MAX_BUDGET_FACTOR * 1000.) as u64); .min(MAX_BUDGET); + if energy != 0.0 { + println!("budget: {budget} energy: {energy} ratio: {ratio} base: {base_energy_per_process}"); + } } // Simple proportional distribution if over cap -- cgit v1.3.1