summaryrefslogtreecommitdiff
path: root/src/energy.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/energy.rs')
-rw-r--r--src/energy.rs34
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)
}