diff options
Diffstat (limited to 'src/energy.rs')
-rw-r--r-- | src/energy.rs | 34 |
1 files changed, 22 insertions, 12 deletions
diff --git a/src/energy.rs b/src/energy.rs index 21283b8..b9cfced 100644 --- a/src/energy.rs +++ b/src/energy.rs @@ -95,6 +95,7 @@ impl Default for TaskInfo { #[derive(Clone)] pub struct ProcessInfo { pub energy: f64, + pub energy_delta: f64, pub tree_energy: f64, pub last_update: std::time::Instant, pub parent: Pid, @@ -114,6 +115,8 @@ pub struct EnergyService { shared_policy_frequency_ranges: Arc<RwLock<Vec<RangeInclusive<FrequencyKHZ>>>>, shared_cpu_current_frequencies: Arc<RwLock<Vec<FrequencyKHZ>>>, rapl_offset: f64, + last_energy_diff: f64, + last_time_between_measurements: Duration, old_rapl: f64, system_energy: f64, bias: f64, @@ -144,6 +147,8 @@ impl EnergyService { shared_policy_frequency_ranges, shared_cpu_current_frequencies, rapl_offset: rapl::read_package_energy().unwrap(), + last_energy_diff: 0f64, + last_time_between_measurements: Duration::new(0, 0), old_rapl: 0., system_energy: 0., bias: 1., @@ -215,6 +220,7 @@ impl EnergyService { pid, ProcessInfo { energy: 0., + energy_delta: 0., tree_energy: 0., last_update: std::time::Instant::now(), parent, @@ -255,6 +261,7 @@ impl EnergyService { continue; } if let Some(energy) = self.estimator.read_consumption(*pid as u64) { + info.energy_delta = energy * self.bias; info.energy += energy * self.bias; info.tree_energy += energy * self.bias; self.estimator.update_information( @@ -272,13 +279,16 @@ impl EnergyService { } } let elapsed = self.last_measurement.elapsed(); + self.last_time_between_measurements = elapsed; self.last_measurement = Instant::now(); + let rapl = rapl::read_package_energy().unwrap() - self.rapl_offset; + let rapl_diff = rapl - self.old_rapl; + self.last_energy_diff = rapl_diff; + self.old_rapl = rapl; + let power_comsumption_watt = rapl_diff / elapsed.as_secs_f64(); + let idle_consumption = elapsed.as_secs_f64() * IDLE_CONSUMPTION_W; if let Some(init) = self.process_info.write().unwrap().get_mut(&1) { - let rapl = rapl::read_package_energy().unwrap() - self.rapl_offset; - let rapl_diff = rapl - self.old_rapl; - let idle_consumption = elapsed.as_secs_f64() * IDLE_CONSUMPTION_W; let est_diff = init.tree_energy - old_energy + idle_consumption; - self.old_rapl = rapl; // let offset_bias = (rapl / (init.tree_energy + idle_consumption)).clamp(0.1, 2.); let current_bias = if init.tree_energy - old_energy > idle_consumption * 0.5 { (rapl_diff / est_diff).clamp(0.1, 2.) @@ -291,8 +301,8 @@ impl EnergyService { .clamp(0.1, 5.); self.system_energy += est_diff; println!( - "Energy estimation: {:.1} rapl: {:.1}, est diff: {:.1} rapl diff: {:.1}, bias: {:.1}", - self.system_energy, rapl, est_diff, rapl_diff, self.bias, + "Energy estimation: {:.1} rapl: {:.1}, est diff: {:.1} rapl diff: {:.1}, bias: {:.1}, power consumption: {:.1}", + self.system_energy, rapl, est_diff, rapl_diff, self.bias, power_comsumption_watt, ); } } @@ -336,19 +346,18 @@ impl EnergyService { .map(|info| info.energy) } - pub fn all_process_energies(&self) -> HashMap<Pid, f64> { + pub fn all_process_energy_deltas(&self) -> HashMap<Pid, f64> { self.process_info .read() .unwrap() .iter() - .map(|(&key, info)| (key, info.energy)) + .map(|(&key, info)| (key, info.energy_delta)) .collect() } } pub fn start_energy_service( use_mocking: bool, - power_cap: u64, shared_cpu_frequency_ranges: Arc<RwLock<Vec<RangeInclusive<FrequencyKHZ>>>>, shared_policy_frequency_ranges: Arc<RwLock<Vec<RangeInclusive<FrequencyKHZ>>>>, shared_cpu_current_frequencies: Arc<RwLock<Vec<FrequencyKHZ>>>, @@ -363,14 +372,16 @@ pub fn start_energy_service( Box::new(KernelDriver::default()) }; + let process_info = Arc::new(RwLock::new(HashMap::new())); + + let power_cap = socket::start_logging_socket_service("/tmp/pm-sched", process_info.clone())?; + // Create budget policy let budget_policy = Box::new(budget::SimpleCappingPolicy::new(power_cap)); // shouldn't be a problem because we are privileged // if PackageEnergy::check_paranoid().unwrap_or(3) > 0 {} - let process_info = Arc::new(RwLock::new(HashMap::new())); - // Create and start the energy service let service = EnergyService::new( estimator, @@ -384,7 +395,6 @@ pub fn start_energy_service( ); service.run(); - let budget = socket::start_logging_socket_service("/tmp/pm-sched", process_info.clone())?; Ok(request_sender) } |