Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down
2 changes: 2 additions & 0 deletions server_manager/Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion server_manager/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down
1 change: 1 addition & 0 deletions server_manager/src/core/hardware.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
98 changes: 59 additions & 39 deletions server_manager/src/interface/web.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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")
Expand Down Expand Up @@ -331,43 +335,59 @@ async fn dashboard(State(state): State<SharedState>, 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");
Expand Down