fixes for non linux compilation issues.

This commit is contained in:
jasonwitty 2025-08-27 16:11:17 -07:00
parent 55e5c708fe
commit 56301d61fd
4 changed files with 34 additions and 14 deletions

2
Cargo.lock generated
View File

@ -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",

View File

@ -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"

View File

@ -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
if load > 5.0 {
let kind = ProcessRefreshKind::nothing().with_cpu().with_memory();
sys.refresh_processes_specifics( sys.refresh_processes_specifics(
ProcessesToUpdate::new().with_cpu_usage_higher_than(0.1), ProcessesToUpdate::default().with_cpu_usage_higher_than(cpu_threshold),
false, false,
kind, 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())

View File

@ -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;