fixes for non linux compilation issues.
This commit is contained in:
parent
55e5c708fe
commit
56301d61fd
2
Cargo.lock
generated
2
Cargo.lock
generated
@ -2187,7 +2187,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "socktop_agent"
|
name = "socktop_agent"
|
||||||
version = "1.40.61"
|
version = "1.40.62"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"anyhow",
|
"anyhow",
|
||||||
"assert_cmd",
|
"assert_cmd",
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "socktop_agent"
|
name = "socktop_agent"
|
||||||
version = "1.40.61"
|
version = "1.40.62"
|
||||||
authors = ["Jason Witty <jasonpwitty+socktop@proton.me>"]
|
authors = ["Jason Witty <jasonpwitty+socktop@proton.me>"]
|
||||||
description = "Remote system monitor over WebSocket, TUI like top"
|
description = "Remote system monitor over WebSocket, TUI like top"
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
|
|||||||
@ -404,6 +404,12 @@ pub async fn collect_processes_all(state: &AppState) -> ProcessesPayload {
|
|||||||
/// Collect all processes (non-Linux): optimized for reduced allocations and selective updates.
|
/// Collect all processes (non-Linux): optimized for reduced allocations and selective updates.
|
||||||
#[cfg(not(target_os = "linux"))]
|
#[cfg(not(target_os = "linux"))]
|
||||||
pub async fn collect_processes_all(state: &AppState) -> ProcessesPayload {
|
pub async fn collect_processes_all(state: &AppState) -> ProcessesPayload {
|
||||||
|
// Get configurable CPU threshold
|
||||||
|
let cpu_threshold: f32 = std::env::var("SOCKTOP_AGENT_PROCESS_CPU_THRESHOLD")
|
||||||
|
.ok()
|
||||||
|
.and_then(|v| v.parse().ok())
|
||||||
|
.unwrap_or(0.1); // Default to 0.1%
|
||||||
|
|
||||||
// Adaptive TTL based on system load
|
// Adaptive TTL based on system load
|
||||||
let sys_guard = state.sys.lock().await;
|
let sys_guard = state.sys.lock().await;
|
||||||
let load = sys_guard.global_cpu_usage();
|
let load = sys_guard.global_cpu_usage();
|
||||||
@ -414,8 +420,10 @@ pub async fn collect_processes_all(state: &AppState) -> ProcessesPayload {
|
|||||||
} else {
|
} else {
|
||||||
// Adaptive TTL: longer when system is idle
|
// Adaptive TTL: longer when system is idle
|
||||||
if load < 10.0 {
|
if load < 10.0 {
|
||||||
4_000 // Light load
|
5_000 // Very light load
|
||||||
} else if load < 30.0 {
|
} else if load < 30.0 {
|
||||||
|
3_000 // Light load
|
||||||
|
} else if load < 50.0 {
|
||||||
2_000 // Medium load
|
2_000 // Medium load
|
||||||
} else {
|
} else {
|
||||||
1_000 // High load
|
1_000 // High load
|
||||||
@ -436,14 +444,16 @@ pub async fn collect_processes_all(state: &AppState) -> ProcessesPayload {
|
|||||||
// Single efficient refresh: only update processes using significant CPU
|
// Single efficient refresh: only update processes using significant CPU
|
||||||
let (total_count, procs) = {
|
let (total_count, procs) = {
|
||||||
let mut sys = state.sys.lock().await;
|
let mut sys = state.sys.lock().await;
|
||||||
let kind = ProcessRefreshKind::nothing().with_cpu().with_memory();
|
|
||||||
|
|
||||||
// Only refresh processes using >0.1% CPU
|
// Only do a deep refresh if system load is significant
|
||||||
sys.refresh_processes_specifics(
|
if load > 5.0 {
|
||||||
ProcessesToUpdate::new().with_cpu_usage_higher_than(0.1),
|
let kind = ProcessRefreshKind::nothing().with_cpu().with_memory();
|
||||||
false,
|
sys.refresh_processes_specifics(
|
||||||
kind,
|
ProcessesToUpdate::default().with_cpu_usage_higher_than(cpu_threshold),
|
||||||
);
|
false,
|
||||||
|
kind,
|
||||||
|
);
|
||||||
|
}
|
||||||
sys.refresh_cpu_usage();
|
sys.refresh_cpu_usage();
|
||||||
|
|
||||||
let total_count = sys.processes().len();
|
let total_count = sys.processes().len();
|
||||||
@ -455,7 +465,7 @@ pub async fn collect_processes_all(state: &AppState) -> ProcessesPayload {
|
|||||||
// Filter and collect processes with meaningful CPU usage
|
// Filter and collect processes with meaningful CPU usage
|
||||||
for p in sys.processes().values() {
|
for p in sys.processes().values() {
|
||||||
let raw = p.cpu_usage();
|
let raw = p.cpu_usage();
|
||||||
if raw > 0.1 {
|
if raw > cpu_threshold {
|
||||||
// Skip negligible CPU users
|
// Skip negligible CPU users
|
||||||
let pid = p.pid().as_u32();
|
let pid = p.pid().as_u32();
|
||||||
|
|
||||||
@ -477,11 +487,22 @@ pub async fn collect_processes_all(state: &AppState) -> ProcessesPayload {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Clean up old process names periodically
|
// Clean up old process names cache when it grows too large
|
||||||
if total_count > proc_cache.names.len() + 100 {
|
let cache_cleanup_threshold = std::env::var("SOCKTOP_AGENT_NAME_CACHE_CLEANUP_THRESHOLD")
|
||||||
|
.ok()
|
||||||
|
.and_then(|v| v.parse().ok())
|
||||||
|
.unwrap_or(100); // Default cleanup threshold
|
||||||
|
|
||||||
|
if total_count > proc_cache.names.len() + cache_cleanup_threshold {
|
||||||
|
let now = std::time::Instant::now();
|
||||||
proc_cache
|
proc_cache
|
||||||
.names
|
.names
|
||||||
.retain(|pid, _| sys.processes().contains_key(&sysinfo::Pid::from_u32(*pid)));
|
.retain(|pid, _| sys.processes().contains_key(&sysinfo::Pid::from_u32(*pid)));
|
||||||
|
tracing::debug!(
|
||||||
|
"Cleaned up {} stale process names in {}ms",
|
||||||
|
proc_cache.names.capacity() - proc_cache.names.len(),
|
||||||
|
now.elapsed().as_millis()
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
(total_count, proc_cache.reusable_vec.clone())
|
(total_count, proc_cache.reusable_vec.clone())
|
||||||
|
|||||||
@ -1,6 +1,5 @@
|
|||||||
//! Shared agent state: sysinfo handles and hot JSON cache.
|
//! Shared agent state: sysinfo handles and hot JSON cache.
|
||||||
|
|
||||||
#[cfg(target_os = "linux")]
|
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
use std::sync::atomic::{AtomicBool, AtomicUsize};
|
use std::sync::atomic::{AtomicBool, AtomicUsize};
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user