nova-shell/stats-daemon/src/main.rs

62 lines
1.6 KiB
Rust

use std::io::{self, Write};
use std::thread;
use std::time::{Duration, Instant};
mod cpu;
mod gpu;
mod mem;
mod temp;
fn parse_interval_ms() -> u64 {
let args: Vec<String> = std::env::args().collect();
let mut i = 1;
while i < args.len() {
if args[i] == "--interval" {
if let Some(ms) = args.get(i + 1).and_then(|s| s.parse().ok()) {
return ms;
}
}
i += 1;
}
1000
}
fn main() {
let interval = Duration::from_millis(parse_interval_ms());
let stdout = io::stdout();
let mut out = io::BufWriter::new(stdout.lock());
let mut prev: Vec<cpu::Sample> = vec![];
let mut freqs: Vec<f64> = vec![];
let gpu = gpu::detect_gpu();
let mut tick = 0u64;
loop {
let t0 = Instant::now();
let curr = cpu::read_stat();
if tick.is_multiple_of(2) {
freqs = cpu::read_core_freqs();
mem::emit_mem(&mut out);
}
cpu::emit_cpu(&mut out, &prev, &curr, &freqs);
prev = curr;
if tick.is_multiple_of(4) {
temp::emit_temp(&mut out);
// AMD sysfs is instant; NVIDIA calls nvidia-smi so runs less often
match &gpu {
gpu::GpuBackend::Amd { .. } => gpu::emit_gpu(&mut out, &gpu),
gpu::GpuBackend::Nvidia if tick.is_multiple_of(8) => gpu::emit_gpu(&mut out, &gpu),
_ => {}
}
}
let _ = out.flush();
tick += 1;
let elapsed = t0.elapsed();
if elapsed < interval {
thread::sleep(interval - elapsed);
}
}
}