diff options
author | Simon Sapin <simon.sapin@exyr.org> | 2020-06-04 13:54:09 +0200 |
---|---|---|
committer | Simon Sapin <simon.sapin@exyr.org> | 2020-06-04 16:39:08 +0200 |
commit | 0abe90647f4548d0e35c8d9107b81e45ea739226 (patch) | |
tree | 158d2623f4d8cdf53ce1e3e03e004092e29f221d | |
parent | d4f1f4641dbb4b44f7d2b507f4fb4a5ae875626d (diff) | |
download | servo-0abe90647f4548d0e35c8d9107b81e45ea739226.tar.gz servo-0abe90647f4548d0e35c8d9107b81e45ea739226.zip |
Remove support for energy profiling
-rw-r--r-- | Cargo.lock | 45 | ||||
-rw-r--r-- | components/layout_thread/lib.rs | 2 | ||||
-rw-r--r-- | components/metrics/lib.rs | 2 | ||||
-rw-r--r-- | components/profile/README.md | 28 | ||||
-rw-r--r-- | components/profile/time.rs | 36 | ||||
-rw-r--r-- | components/profile/trace_dump.rs | 9 | ||||
-rw-r--r-- | components/profile_traits/Cargo.toml | 5 | ||||
-rw-r--r-- | components/profile_traits/energy.rs | 62 | ||||
-rw-r--r-- | components/profile_traits/lib.rs | 2 | ||||
-rw-r--r-- | components/profile_traits/time.rs | 27 | ||||
-rw-r--r-- | components/servo/Cargo.toml | 1 | ||||
-rw-r--r-- | ports/libsimpleservo/api/Cargo.toml | 1 | ||||
-rw-r--r-- | ports/libsimpleservo/capi/Cargo.toml | 1 | ||||
-rw-r--r-- | ports/libsimpleservo/jniapi/Cargo.toml | 1 | ||||
-rw-r--r-- | ports/winit/Cargo.toml | 1 |
15 files changed, 8 insertions, 215 deletions
diff --git a/Cargo.lock b/Cargo.lock index 1354dbb1d7b..4c6921b4845 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1378,49 +1378,6 @@ dependencies = [ ] [[package]] -name = "energy-monitor" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe872d0664f1cc60db36349af245d892ee67d3c8f78055df0ebc43271fd4e05c" - -[[package]] -name = "energymon" -version = "0.3.0" -source = "git+https://github.com/energymon/energymon-rust.git#89daf8f37858eab96ad8eec7cc81accb17b2411e" -dependencies = [ - "energy-monitor", - "energymon-default-sys", - "libc", -] - -[[package]] -name = "energymon-builder" -version = "0.3.0" -source = "git+https://github.com/energymon/energymon-sys.git#f8d77ea2906b25f9c0fd358aa9d300a46dc3e97c" -dependencies = [ - "cmake", - "pkg-config", -] - -[[package]] -name = "energymon-default-sys" -version = "0.3.0" -source = "git+https://github.com/energymon/energymon-sys.git#f8d77ea2906b25f9c0fd358aa9d300a46dc3e97c" -dependencies = [ - "energymon-builder", - "energymon-sys", - "libc", -] - -[[package]] -name = "energymon-sys" -version = "0.3.0" -source = "git+https://github.com/energymon/energymon-sys.git#f8d77ea2906b25f9c0fd358aa9d300a46dc3e97c" -dependencies = [ - "libc", -] - -[[package]] name = "enum-iterator" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -4241,8 +4198,6 @@ name = "profile_traits" version = "0.0.1" dependencies = [ "crossbeam-channel", - "energy-monitor", - "energymon", "ipc-channel", "log", "serde", diff --git a/components/layout_thread/lib.rs b/components/layout_thread/lib.rs index 82da02d1ce3..920345cbd47 100644 --- a/components/layout_thread/lib.rs +++ b/components/layout_thread/lib.rs @@ -1456,8 +1456,6 @@ impl LayoutThread { &self.time_profiler_chan, 0, text_shaping_time as u64, - 0, - 0, ); // Retrieve the (possibly rebuilt) root flow. diff --git a/components/metrics/lib.rs b/components/metrics/lib.rs index 1165c8f45ca..ad6ef52e3ca 100644 --- a/components/metrics/lib.rs +++ b/components/metrics/lib.rs @@ -81,8 +81,6 @@ fn set_metric<U: ProgressiveWebMetric>( &pwm.get_time_profiler_chan(), time, time, - 0, - 0, ); // Print the metric to console if the print-pwm option was given. diff --git a/components/profile/README.md b/components/profile/README.md index cc98292c03f..85cd0747b6d 100644 --- a/components/profile/README.md +++ b/components/profile/README.md @@ -62,31 +62,3 @@ Time is measured in nanoseconds and energy is measured in microjoules. `Work`, `Time`, and `Energy` also have `Global` and `Window` values which are the summed over the entire runtime and sliding window period, respectively. `Perf` (performance) and `Pwr` (power) have `Global`, `Window`, and `Instant` values as described above. - - -# Energy Profiling - -Energy monitoring is hardware and platform-specific, so it is only enabled with the `energy-profiling` feature. - -To use energy profiling, you must have a compatible `energymon-default` implementation installed to your system as `energymon-default-static` when building Servo. -Otherwise a default dummy implementation is used. -The library is linked through a chain of dependencies: - -* servo::profile_traits - * energymon - Rust abstractions - * energymon-default-sys - Rust bindings to `energymon-default.h` - * energymon-default-static: A statically linked C library installed to the system that implements `energymon.h` and `energymon-default.h` - -For instructions on building existing native libraries, visit the [energymon project source](https://github.com/energymon/energymon). -You may also write your own implementation of `energymon.h` and `energymon-default.h` and install it as `energymon-default-static` where pkg-config can find it. - -Once you install the proper library, you will need to rebuild the `energymon-default-sys` crate. -The most straightforward way to do this is to do a clean build of Servo. - -To build Servo with the `energy-profiling` feature enabled, pass `--features "energy-profiling"` to the `mach` command, e.g.: - -```sh -./mach build -r --features "energy-profiling" -``` - -When running Servo, you will want to enable the desired Heartbeats to record the results. diff --git a/components/profile/time.rs b/components/profile/time.rs index 59cc376acab..178d0473370 100644 --- a/components/profile/time.rs +++ b/components/profile/time.rs @@ -7,14 +7,12 @@ use crate::heartbeats; use crate::trace_dump::TraceDump; use ipc_channel::ipc::{self, IpcReceiver}; -use profile_traits::energy::{energy_interval_ms, read_energy_uj}; use profile_traits::time::{ ProfilerCategory, ProfilerChan, ProfilerData, ProfilerMsg, TimerMetadata, }; use profile_traits::time::{TimerMetadataFrameType, TimerMetadataReflowType}; use servo_config::opts::OutputOptions; use std::borrow::ToOwned; -use std::cmp::Ordering; use std::collections::{BTreeMap, HashMap}; use std::fs::File; use std::io::{self, Write}; @@ -253,22 +251,15 @@ impl Profiler { }; if run_ap_thread() { let profiler_chan = profiler_chan.clone(); - // min of 1 heartbeat/sec, max of 20 should provide accurate enough power/energy readings + // min of 1 heartbeat/sec, max of 20 should provide accurate enough readings // waking up more frequently allows the thread to end faster on exit const SLEEP_MS: u32 = 10; - const MIN_ENERGY_INTERVAL_MS: u32 = 50; - const MAX_ENERGY_INTERVAL_MS: u32 = 1000; - let interval_ms = enforce_range( - MIN_ENERGY_INTERVAL_MS, - MAX_ENERGY_INTERVAL_MS, - energy_interval_ms(), - ); + let interval_ms = 200; let loop_count: u32 = (interval_ms as f32 / SLEEP_MS as f32).ceil() as u32; thread::Builder::new() .name("Application heartbeat profiler".to_owned()) .spawn(move || { let mut start_time = precise_time_ns(); - let mut start_energy = read_energy_uj(); loop { for _ in 0..loop_count { if run_ap_thread() { @@ -278,7 +269,6 @@ impl Profiler { } } let end_time = precise_time_ns(); - let end_energy = read_energy_uj(); // send using the inner channel // (using ProfilerChan.send() forces an unwrap // and sometimes panics for this background profiler) @@ -286,12 +276,10 @@ impl Profiler { if let Err(_) = c.send(ProfilerMsg::Time( (ProfilerCategory::ApplicationHeartbeat, None), (start_time, end_time), - (start_energy, end_energy), )) { return; } start_time = end_time; - start_energy = end_energy; } }) .expect("Thread spawning failed"); @@ -331,10 +319,10 @@ impl Profiler { fn handle_msg(&mut self, msg: ProfilerMsg) -> bool { match msg.clone() { - ProfilerMsg::Time(k, t, e) => { - heartbeats::maybe_heartbeat(&k.0, t.0, t.1, e.0, e.1, self.profile_heartbeats); + ProfilerMsg::Time(k, t) => { + heartbeats::maybe_heartbeat(&k.0, t.0, t.1, 0, 0, self.profile_heartbeats); if let Some(ref mut trace) = self.trace { - trace.write_one(&k, t, e); + trace.write_one(&k, t); } let ms = (t.1 - t.0) as f64 / 1000000f64; self.find_or_insert(k, ms); @@ -475,20 +463,6 @@ impl Profiler { } } -fn enforce_range<T>(min: T, max: T, value: T) -> T -where - T: Ord, -{ - assert!(min <= max); - match value.cmp(&max) { - Ordering::Equal | Ordering::Greater => max, - Ordering::Less => match value.cmp(&min) { - Ordering::Equal | Ordering::Less => min, - Ordering::Greater => value, - }, - } -} - pub fn duration_from_seconds(secs: f64) -> Duration { pub const NANOS_PER_SEC: u32 = 1_000_000_000; diff --git a/components/profile/trace_dump.rs b/components/profile/trace_dump.rs index 896bce9cb63..2833e3bd26d 100644 --- a/components/profile/trace_dump.rs +++ b/components/profile/trace_dump.rs @@ -25,12 +25,6 @@ struct TraceEntry { #[serde(rename = "endTime")] end_time: u64, - - #[serde(rename = "startEnergy")] - start_energy: u64, - - #[serde(rename = "endEnergy")] - end_energy: u64, } impl TraceDump { @@ -50,15 +44,12 @@ impl TraceDump { &mut self, category: &(ProfilerCategory, Option<TimerMetadata>), time: (u64, u64), - energy: (u64, u64), ) { let entry = TraceEntry { category: category.0, metadata: category.1.clone(), start_time: time.0, end_time: time.1, - start_energy: energy.0, - end_energy: energy.1, }; serde_json::to_writer(&mut self.file, &entry).unwrap(); writeln!(&mut self.file, ",").unwrap(); diff --git a/components/profile_traits/Cargo.toml b/components/profile_traits/Cargo.toml index 118d60caa17..519170dc0c7 100644 --- a/components/profile_traits/Cargo.toml +++ b/components/profile_traits/Cargo.toml @@ -10,13 +10,8 @@ publish = false name = "profile_traits" path = "lib.rs" -[features] -energy-profiling = ["energy-monitor", "energymon"] - [dependencies] crossbeam-channel = "0.4" -energy-monitor = { version = "0.2.0", optional = true } -energymon = { git = "https://github.com/energymon/energymon-rust.git", optional = true } ipc-channel = "0.14" log = "0.4" serde = "1.0" diff --git a/components/profile_traits/energy.rs b/components/profile_traits/energy.rs deleted file mode 100644 index 1753531b940..00000000000 --- a/components/profile_traits/energy.rs +++ /dev/null @@ -1,62 +0,0 @@ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ - -#[cfg(feature = "energy-profiling")] -pub fn read_energy_uj() -> u64 { - energymon::read_energy_uj() -} - -#[cfg(not(feature = "energy-profiling"))] -pub fn read_energy_uj() -> u64 { - 0 -} - -#[cfg(feature = "energy-profiling")] -pub fn energy_interval_ms() -> u32 { - energymon::get_min_interval_ms() -} - -#[cfg(not(feature = "energy-profiling"))] -pub fn energy_interval_ms() -> u32 { - 1000 -} - -#[cfg(feature = "energy-profiling")] -mod energymon { - extern crate energy_monitor; - extern crate energymon; - - use self::energy_monitor::EnergyMonitor; - use self::energymon::EnergyMon; - use std::sync::{Once, ONCE_INIT}; - - static mut EM: Option<*mut EnergyMon> = None; - - fn init() { - // can't use lazy_static macro for EM (no Sync trait for EnergyMon) - static ONCE: Once = ONCE_INIT; - ONCE.call_once(|| { - if let Ok(em) = EnergyMon::new() { - println!("Started energy monitoring from: {}", em.source()); - unsafe { - EM = Some(Box::into_raw(Box::new(em))); - } - } - }); - } - - /// Read energy from the energy monitor, otherwise return 0. - pub fn read_energy_uj() -> u64 { - init(); - unsafe { - // EnergyMon implementations of EnergyMonitor always return a value - EM.map_or(0, |em| (*em).read_uj().unwrap()) - } - } - - pub fn get_min_interval_ms() -> u32 { - init(); - unsafe { EM.map_or(0, |em| ((*em).interval_us() as f64 / 1000.0).ceil() as u32) } - } -} diff --git a/components/profile_traits/lib.rs b/components/profile_traits/lib.rs index c1e94fa8641..7e0ce8166d0 100644 --- a/components/profile_traits/lib.rs +++ b/components/profile_traits/lib.rs @@ -13,8 +13,6 @@ extern crate log; #[macro_use] extern crate serde; -#[allow(unsafe_code)] -pub mod energy; pub mod ipc; pub mod mem; pub mod time; diff --git a/components/profile_traits/time.rs b/components/profile_traits/time.rs index 91a99fe18c4..043c0c4cb21 100644 --- a/components/profile_traits/time.rs +++ b/components/profile_traits/time.rs @@ -2,7 +2,6 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ -use crate::energy::read_energy_uj; use ipc_channel::ipc::IpcSender; use servo_config::opts; use time::precise_time_ns; @@ -34,11 +33,7 @@ pub enum ProfilerData { #[derive(Clone, Debug, Deserialize, Serialize)] pub enum ProfilerMsg { /// Normal message used for reporting time - Time( - (ProfilerCategory, Option<TimerMetadata>), - (u64, u64), - (u64, u64), - ), + Time((ProfilerCategory, Option<TimerMetadata>), (u64, u64)), /// Message used to get time spend entries for a particular ProfilerBuckets (in nanoseconds) Get( (ProfilerCategory, Option<TimerMetadata>), @@ -142,26 +137,16 @@ where if opts::get().signpost { signpost::start(category as u32, &[0, 0, 0, (category as usize) >> 4]); } - let start_energy = read_energy_uj(); let start_time = precise_time_ns(); let val = callback(); let end_time = precise_time_ns(); - let end_energy = read_energy_uj(); if opts::get().signpost { signpost::end(category as u32, &[0, 0, 0, (category as usize) >> 4]); } - send_profile_data( - category, - meta, - &profiler_chan, - start_time, - end_time, - start_energy, - end_energy, - ); + send_profile_data(category, meta, &profiler_chan, start_time, end_time); val } @@ -171,12 +156,6 @@ pub fn send_profile_data( profiler_chan: &ProfilerChan, start_time: u64, end_time: u64, - start_energy: u64, - end_energy: u64, ) { - profiler_chan.send(ProfilerMsg::Time( - (category, meta), - (start_time, end_time), - (start_energy, end_energy), - )); + profiler_chan.send(ProfilerMsg::Time((category, meta), (start_time, end_time))); } diff --git a/components/servo/Cargo.toml b/components/servo/Cargo.toml index e7bcc1f352f..1cb332e3da9 100644 --- a/components/servo/Cargo.toml +++ b/components/servo/Cargo.toml @@ -14,7 +14,6 @@ crate-type = ["rlib"] [features] debugmozjs = ["script/debugmozjs"] egl = ["mozangle/egl"] -energy-profiling = ["profile_traits/energy-profiling"] googlevr = ["webxr/googlevr"] jitspew = ["script/jitspew"] js_backtrace = ["script/js_backtrace"] diff --git a/ports/libsimpleservo/api/Cargo.toml b/ports/libsimpleservo/api/Cargo.toml index eb5234dc05e..9fd37846f8e 100644 --- a/ports/libsimpleservo/api/Cargo.toml +++ b/ports/libsimpleservo/api/Cargo.toml @@ -35,7 +35,6 @@ gl_generator = "0.14" debugmozjs = ["libservo/debugmozjs"] default = ["webdriver", "max_log_level"] egl = ["libservo/egl"] -energy-profiling = ["libservo/energy-profiling"] googlevr = ["libservo/googlevr"] jitspew = ["libservo/jitspew"] js_backtrace = ["libservo/js_backtrace"] diff --git a/ports/libsimpleservo/capi/Cargo.toml b/ports/libsimpleservo/capi/Cargo.toml index db54c674e14..ff481da0672 100644 --- a/ports/libsimpleservo/capi/Cargo.toml +++ b/ports/libsimpleservo/capi/Cargo.toml @@ -31,7 +31,6 @@ cbindgen = "0.14" debugmozjs = ["simpleservo/debugmozjs"] default = ["webdriver", "max_log_level"] egl = ["simpleservo/egl"] -energy-profiling = ["simpleservo/energy-profiling"] googlevr = ["simpleservo/googlevr"] jitspew = ["simpleservo/jitspew"] js_backtrace = ["simpleservo/js_backtrace"] diff --git a/ports/libsimpleservo/jniapi/Cargo.toml b/ports/libsimpleservo/jniapi/Cargo.toml index c86f68a9ac2..748653e1894 100644 --- a/ports/libsimpleservo/jniapi/Cargo.toml +++ b/ports/libsimpleservo/jniapi/Cargo.toml @@ -30,7 +30,6 @@ cc = "1.0" debugmozjs = ["simpleservo/debugmozjs"] default = ["webdriver", "max_log_level"] egl = ["simpleservo/egl"] -energy-profiling = ["simpleservo/energy-profiling"] googlevr = ["simpleservo/googlevr"] js_backtrace = ["simpleservo/js_backtrace"] layout-2013 = ["simpleservo/layout-2013"] diff --git a/ports/winit/Cargo.toml b/ports/winit/Cargo.toml index 03ec4b4e2ae..1850f8acbdd 100644 --- a/ports/winit/Cargo.toml +++ b/ports/winit/Cargo.toml @@ -30,7 +30,6 @@ ProductName = "Servo" debugmozjs = ["libservo/debugmozjs"] default = ["webdriver", "max_log_level"] egl = ["libservo/egl"] -energy-profiling = ["libservo/energy-profiling"] jitspew = ["libservo/jitspew"] js_backtrace = ["libservo/js_backtrace"] layout-2013 = ["libservo/layout-2013"] |