diff --git a/README.md b/README.md index 6187960..e646a27 100644 --- a/README.md +++ b/README.md @@ -81,6 +81,8 @@ cd server_script/server_manager cargo test ``` +*Note: To run benchmarks, you must enable the `async_tokio` feature: `cargo bench --features async_tokio`.* + ### CLI Commands The tool provides several subcommands: diff --git a/server_manager/Cargo.lock b/server_manager/Cargo.lock index 9d73bac..b9a528a 100644 --- a/server_manager/Cargo.lock +++ b/server_manager/Cargo.lock @@ -347,6 +347,7 @@ dependencies = [ "ciborium", "clap", "criterion-plot", + "futures", "is-terminal", "itertools", "num-traits", @@ -359,6 +360,7 @@ dependencies = [ "serde_derive", "serde_json", "tinytemplate", + "tokio", "walkdir", ] diff --git a/server_manager/Cargo.toml b/server_manager/Cargo.toml index 475f80e..226c7be 100644 --- a/server_manager/Cargo.toml +++ b/server_manager/Cargo.toml @@ -26,7 +26,7 @@ time = "0.3" rand = "0.10.0" [dev-dependencies] -criterion = "0.5" +criterion = { version = "0.5", features = ["async_tokio"] } [[bench]] name = "service_benchmark" diff --git a/server_manager/src/core/hardware.rs b/server_manager/src/core/hardware.rs index 09f3ff2..9acbf31 100644 --- a/server_manager/src/core/hardware.rs +++ b/server_manager/src/core/hardware.rs @@ -31,6 +31,7 @@ impl HardwareInfo { sys.refresh_memory(); sys.refresh_cpu(); sys.refresh_disks_list(); + sys.refresh_disks(); let total_memory = sys.total_memory(); // Bytes let ram_gb = total_memory / 1024 / 1024 / 1024; diff --git a/server_manager/src/interface/web.rs b/server_manager/src/interface/web.rs index 1f677c3..12b5470 100644 --- a/server_manager/src/interface/web.rs +++ b/server_manager/src/interface/web.rs @@ -131,8 +131,12 @@ pub async fn start_server(port: u16) -> anyhow::Result<()> { .with_expiry(Expiry::OnInactivity(Duration::hours(24))); // Initialize System once - let mut sys = System::new_all(); - sys.refresh_all(); + let sys = tokio::task::spawn_blocking(|| { + let mut sys = System::new_all(); + sys.refresh_all(); + sys + }) + .await?; let initial_config = Config::load().unwrap_or_default(); let initial_config_mtime = std::fs::metadata("config.yaml") @@ -331,43 +335,59 @@ async fn dashboard(State(state): State, session: Session) -> impl I let config = state.get_config().await; // System Stats - let mut sys = state.system.lock().unwrap(); - let now = SystemTime::now(); - let mut last_refresh = state.last_system_refresh.lock().unwrap(); - - // Throttle refresh to max once every 500ms - if now - .duration_since(*last_refresh) - .unwrap_or_default() - .as_millis() - > 500 - { - sys.refresh_cpu(); - sys.refresh_memory(); - sys.refresh_disks(); - *last_refresh = now; - } - let ram_used = sys.used_memory() / 1024 / 1024; // MB - let ram_total = sys.total_memory() / 1024 / 1024; // MB - let swap_used = sys.used_swap() / 1024 / 1024; // MB - let swap_total = sys.total_swap() / 1024 / 1024; // MB - let cpu_usage = sys.global_cpu_info().cpu_usage(); - - // Simple Disk Usage (Root or fallback) - let mut disk_total = 0; - let mut disk_used = 0; - - let target_disk = sys - .disks() - .iter() - .find(|d| d.mount_point() == std::path::Path::new("/")) - .or_else(|| sys.disks().first()); - - if let Some(disk) = target_disk { - disk_total = disk.total_space() / 1024 / 1024 / 1024; // GB - disk_used = (disk.total_space() - disk.available_space()) / 1024 / 1024 / 1024; // GB - } - drop(sys); // Release lock explicitely + let state_clone = state.clone(); + let stats = tokio::task::spawn_blocking(move || { + let mut sys = state_clone.system.lock().unwrap(); + let mut last_refresh = state_clone.last_system_refresh.lock().unwrap(); + let now = SystemTime::now(); + + // Throttle refresh to max once every 500ms + if now + .duration_since(*last_refresh) + .unwrap_or_default() + .as_millis() + > 500 + { + sys.refresh_cpu(); + sys.refresh_memory(); + sys.refresh_disks(); + *last_refresh = now; + } + let ram_used = sys.used_memory() / 1024 / 1024; // MB + let ram_total = sys.total_memory() / 1024 / 1024; // MB + let swap_used = sys.used_swap() / 1024 / 1024; // MB + let swap_total = sys.total_swap() / 1024 / 1024; // MB + let cpu_usage = sys.global_cpu_info().cpu_usage(); + + // Simple Disk Usage (Root or fallback) + let mut disk_total = 0; + let mut disk_used = 0; + + let target_disk = sys + .disks() + .iter() + .find(|d| d.mount_point() == std::path::Path::new("/")) + .or_else(|| sys.disks().first()); + + if let Some(disk) = target_disk { + disk_total = disk.total_space() / 1024 / 1024 / 1024; // GB + disk_used = (disk.total_space() - disk.available_space()) / 1024 / 1024 / 1024; // GB + } + + ( + ram_used, + ram_total, + swap_used, + swap_total, + cpu_usage, + disk_used, + disk_total, + ) + }) + .await + .unwrap(); + + let (ram_used, ram_total, swap_used, swap_total, cpu_usage, disk_used, disk_total) = stats; let mut html = String::with_capacity(8192); write_html_head(&mut html, "Dashboard - Server Manager");