diff options
| author | Dennis Kobert <dennis@kobert.dev> | 2025-04-16 14:22:21 +0200 |
|---|---|---|
| committer | Dennis Kobert <dennis@kobert.dev> | 2025-04-16 14:22:21 +0200 |
| commit | 3e905300138dcd05acc8d877ffe687c4caddc597 (patch) | |
| tree | d00ab91ba1d6f42cf29fc1191741ca37ddbdd6f6 /src/energy | |
| parent | 62e5b43451c31b9edca4fa5c5df8dd9e441c0949 (diff) | |
Implement better budgeting
Diffstat (limited to 'src/energy')
| -rw-r--r-- | src/energy/budget.rs | 22 |
1 files changed, 16 insertions, 6 deletions
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<Pid, u64>; + fn calculate_budgets(&mut self, energy_service: &mut EnergyService) -> HashMap<Pid, u64>; } pub struct SimpleCappingPolicy { power_cap: Arc<AtomicU32>, + last_ratio: f64, } impl SimpleCappingPolicy { pub fn new(power_cap: Arc<AtomicU32>) -> Self { - Self { power_cap } + Self { + power_cap, + last_ratio: 1., + } } } impl BudgetPolicy for SimpleCappingPolicy { - fn calculate_budgets(&self, energy_service: &mut EnergyService) -> HashMap<Pid, u64> { + fn calculate_budgets(&mut self, energy_service: &mut EnergyService) -> HashMap<Pid, u64> { 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 |
