hydro_lang/runtime_support/
resource_measurement.rs

1#[cfg(feature = "runtime_measure")]
2use std::panic::AssertUnwindSafe;
3
4#[cfg(feature = "runtime_measure")]
5use dfir_rs::futures::FutureExt;
6use dfir_rs::scheduled::graph::Dfir;
7#[cfg(feature = "runtime_measure")]
8#[cfg(target_os = "linux")]
9use procfs::WithCurrentSystemInfo;
10
11#[cfg(not(feature = "runtime_measure"))]
12pub async fn run(flow: Dfir<'_>) {
13    dfir_rs::util::deploy::launch_flow(flow).await;
14}
15
16#[cfg(feature = "runtime_measure")]
17pub async fn run(flow: Dfir<'_>) {
18    // Make sure to print CPU even if we crash
19    let res = AssertUnwindSafe(dfir_rs::util::deploy::launch_flow(flow))
20        .catch_unwind()
21        .await;
22
23    #[cfg(target_os = "linux")]
24    {
25        let me = procfs::process::Process::myself().unwrap();
26        let stat = me.stat().unwrap();
27        let sysinfo = procfs::current_system_info();
28
29        let start_time = stat.starttime().get().unwrap();
30        let curr_time = chrono::Local::now();
31        let elapsed_time = curr_time - start_time;
32
33        let seconds_spent = (stat.utime + stat.stime) as f32 / sysinfo.ticks_per_second() as f32;
34        let run_time = chrono::Duration::milliseconds((seconds_spent * 1000.0) as i64);
35
36        let percent_cpu_use =
37            run_time.num_milliseconds() as f32 / elapsed_time.num_milliseconds() as f32;
38        let user_time = chrono::Duration::milliseconds(
39            (stat.utime as f32 / sysinfo.ticks_per_second() as f32 * 1000.0) as i64,
40        );
41        let user_cpu_use =
42            user_time.num_milliseconds() as f32 / elapsed_time.num_milliseconds() as f32;
43        let system_time = chrono::Duration::milliseconds(
44            (stat.stime as f32 / sysinfo.ticks_per_second() as f32 * 1000.0) as i64,
45        );
46        let system_cpu_use =
47            system_time.num_milliseconds() as f32 / elapsed_time.num_milliseconds() as f32;
48        println!(
49            "{} Total {:.4}%, User {:.4}%, System {:.4}%",
50            crate::internal_constants::CPU_USAGE_PREFIX,
51            percent_cpu_use,
52            user_cpu_use,
53            system_cpu_use
54        );
55    }
56
57    #[cfg(not(target_os = "linux"))]
58    {
59        // TODO(shadaj): can enable on next sysinfo release
60        // use sysinfo::{Pid, System};
61        // let system = System::new_all();
62        // let process = system.process(Pid::from_u32(std::process::id())).unwrap();
63        // let run_time = process.run_time() * 1000;
64        // let cpu_time = process.accumulated_cpu_time();
65        // let user_cpu_use = cpu_time.user() as f32 / run_time as f32;
66        let user_cpu_use = 100.0;
67
68        println!(
69            "{} Total {:.4}%, User {:.4}%, System {:.4}%",
70            crate::internal_constants::CPU_USAGE_PREFIX,
71            user_cpu_use,
72            user_cpu_use,
73            0.0
74        );
75    }
76
77    res.unwrap();
78}