summaryrefslogtreecommitdiff
path: root/src/energy
diff options
context:
space:
mode:
authorDennis Kobert <dennis@kobert.dev>2025-04-16 14:22:21 +0200
committerDennis Kobert <dennis@kobert.dev>2025-04-16 14:22:21 +0200
commit3e905300138dcd05acc8d877ffe687c4caddc597 (patch)
treed00ab91ba1d6f42cf29fc1191741ca37ddbdd6f6 /src/energy
parent62e5b43451c31b9edca4fa5c5df8dd9e441c0949 (diff)
Implement better budgeting
Diffstat (limited to 'src/energy')
-rw-r--r--src/energy/budget.rs22
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