From 79655269f583ad2141c6b14e6a0697c67f49a2dc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tero=20Laxstr=C3=B6m?= Date: Sun, 16 Mar 2025 21:14:46 +0000 Subject: [PATCH] Add process cpu/memory usage to SystemInformationDiagnosticsPlugin (#18279) # Objective - Adding process specific cpu/mem usages to SystemInformationDiagnosticsPlugin - Fixes #18135 ## Solution - Adding two new stats by using code provided in #18135 ## Testing - Tested by adding SystemInformationDiagnosticsPlugin into enabling_disabling_diagnostics example - Tested only on Linux (Ubuntu 24.04.2 LTS) --- ## Showcase Example output: > 2025-03-12T18:20:45.355206Z INFO bevy diagnostic: fps : 144.139984 (avg 143.968838) > 2025-03-12T18:20:45.355229Z INFO bevy diagnostic: system/cpu_usage : 17.299578% (avg 16.410863%) > 2025-03-12T18:20:45.355235Z INFO bevy diagnostic: frame_time : 6.939720ms (avg 6.953508ms) > 2025-03-12T18:20:45.355239Z INFO bevy diagnostic: frame_count : 1271.000000 > 2025-03-12T18:20:45.355243Z INFO bevy diagnostic: process/cpu_usage: 172.151901% (avg 165.337555%) > 2025-03-12T18:20:45.355247Z INFO bevy diagnostic: process/mem_usage: 400.472656% (avg 400.478516%) > 2025-03-12T18:20:45.355250Z INFO bevy diagnostic: system/mem_usage : 34.244571% (avg 34.356289%) --- .../system_information_diagnostics_plugin.rs | 80 ++++++++++++++----- 1 file changed, 59 insertions(+), 21 deletions(-) diff --git a/crates/bevy_diagnostic/src/system_information_diagnostics_plugin.rs b/crates/bevy_diagnostic/src/system_information_diagnostics_plugin.rs index 55616fca4b..5fef2a4f25 100644 --- a/crates/bevy_diagnostic/src/system_information_diagnostics_plugin.rs +++ b/crates/bevy_diagnostic/src/system_information_diagnostics_plugin.rs @@ -29,9 +29,13 @@ impl Plugin for SystemInformationDiagnosticsPlugin { impl SystemInformationDiagnosticsPlugin { /// Total system cpu usage in % - pub const CPU_USAGE: DiagnosticPath = DiagnosticPath::const_new("system/cpu_usage"); + pub const SYSTEM_CPU_USAGE: DiagnosticPath = DiagnosticPath::const_new("system/cpu_usage"); /// Total system memory usage in % - pub const MEM_USAGE: DiagnosticPath = DiagnosticPath::const_new("system/mem_usage"); + pub const SYSTEM_MEM_USAGE: DiagnosticPath = DiagnosticPath::const_new("system/mem_usage"); + /// Process cpu usage in % + pub const PROCESS_CPU_USAGE: DiagnosticPath = DiagnosticPath::const_new("process/cpu_usage"); + /// Process memory usage in % + pub const PROCESS_MEM_USAGE: DiagnosticPath = DiagnosticPath::const_new("process/mem_usage"); } /// A resource that stores diagnostic information about the system. @@ -90,15 +94,26 @@ pub mod internal { } fn setup_system(mut diagnostics: ResMut) { - diagnostics - .add(Diagnostic::new(SystemInformationDiagnosticsPlugin::CPU_USAGE).with_suffix("%")); - diagnostics - .add(Diagnostic::new(SystemInformationDiagnosticsPlugin::MEM_USAGE).with_suffix("%")); + diagnostics.add( + Diagnostic::new(SystemInformationDiagnosticsPlugin::SYSTEM_CPU_USAGE).with_suffix("%"), + ); + diagnostics.add( + Diagnostic::new(SystemInformationDiagnosticsPlugin::SYSTEM_MEM_USAGE).with_suffix("%"), + ); + diagnostics.add( + Diagnostic::new(SystemInformationDiagnosticsPlugin::PROCESS_CPU_USAGE).with_suffix("%"), + ); + diagnostics.add( + Diagnostic::new(SystemInformationDiagnosticsPlugin::PROCESS_MEM_USAGE) + .with_suffix("GiB"), + ); } struct SysinfoRefreshData { - current_cpu_usage: f64, - current_used_mem: f64, + system_cpu_usage: f64, + system_mem_usage: f64, + process_cpu_usage: f64, + process_mem_usage: f64, } #[derive(Resource, Default)] @@ -135,18 +150,31 @@ pub mod internal { let sys = Arc::clone(sysinfo); let task = thread_pool.spawn(async move { let mut sys = sys.lock().unwrap(); + let pid = sysinfo::get_current_pid().expect("Failed to get current process ID"); + sys.refresh_processes(sysinfo::ProcessesToUpdate::Some(&[pid]), true); sys.refresh_cpu_specifics(CpuRefreshKind::nothing().with_cpu_usage()); sys.refresh_memory(); - let current_cpu_usage = sys.global_cpu_usage().into(); - // `memory()` fns return a value in bytes - let total_mem = sys.total_memory() as f64 / BYTES_TO_GIB; - let used_mem = sys.used_memory() as f64 / BYTES_TO_GIB; - let current_used_mem = used_mem / total_mem * 100.0; + let system_cpu_usage = sys.global_cpu_usage().into(); + let total_mem = sys.total_memory() as f64; + let used_mem = sys.used_memory() as f64; + let system_mem_usage = used_mem / total_mem * 100.0; + + let process_mem_usage = sys + .process(pid) + .map(|p| p.memory() as f64 * BYTES_TO_GIB) + .unwrap_or(0.0); + + let process_cpu_usage = sys + .process(pid) + .map(|p| p.cpu_usage() as f64 / sys.cpus().len() as f64) + .unwrap_or(0.0); SysinfoRefreshData { - current_cpu_usage, - current_used_mem, + system_cpu_usage, + system_mem_usage, + process_cpu_usage, + process_mem_usage, } }); tasks.tasks.push(task); @@ -160,12 +188,22 @@ pub mod internal { return true; }; - diagnostics.add_measurement(&SystemInformationDiagnosticsPlugin::CPU_USAGE, || { - data.current_cpu_usage - }); - diagnostics.add_measurement(&SystemInformationDiagnosticsPlugin::MEM_USAGE, || { - data.current_used_mem - }); + diagnostics.add_measurement( + &SystemInformationDiagnosticsPlugin::SYSTEM_CPU_USAGE, + || data.system_cpu_usage, + ); + diagnostics.add_measurement( + &SystemInformationDiagnosticsPlugin::SYSTEM_MEM_USAGE, + || data.system_mem_usage, + ); + diagnostics.add_measurement( + &SystemInformationDiagnosticsPlugin::PROCESS_CPU_USAGE, + || data.process_cpu_usage, + ); + diagnostics.add_measurement( + &SystemInformationDiagnosticsPlugin::PROCESS_MEM_USAGE, + || data.process_mem_usage, + ); false }); }