extract cpu service from system stats, add --types filter to nova-stats
This commit is contained in:
parent
8628b4b27b
commit
29e06eadb5
7 changed files with 227 additions and 189 deletions
|
|
@ -1,3 +1,4 @@
|
|||
use std::collections::HashSet;
|
||||
use std::io::{self, Write};
|
||||
use std::thread;
|
||||
use std::time::{Duration, Instant};
|
||||
|
|
@ -21,36 +22,69 @@ fn parse_interval_ms() -> u64 {
|
|||
1000
|
||||
}
|
||||
|
||||
fn parse_types() -> HashSet<String> {
|
||||
let args: Vec<String> = std::env::args().collect();
|
||||
let mut i = 1;
|
||||
while i < args.len() {
|
||||
if args[i] == "--types" {
|
||||
if let Some(list) = args.get(i + 1) {
|
||||
return list.split(',').map(|s| s.trim().to_string()).collect();
|
||||
}
|
||||
}
|
||||
i += 1;
|
||||
}
|
||||
HashSet::new() // empty = all types
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let interval = Duration::from_millis(parse_interval_ms());
|
||||
let types = parse_types();
|
||||
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 mut gpu = gpu::detect_gpu();
|
||||
let mut tick = 0u64;
|
||||
|
||||
let emit_cpu = types.is_empty() || types.contains("cpu");
|
||||
let emit_mem = types.is_empty() || types.contains("mem");
|
||||
let emit_temp = types.is_empty() || types.contains("temp");
|
||||
let emit_graphics = types.is_empty() || types.contains("gpu");
|
||||
|
||||
let mut gpu = if emit_graphics {
|
||||
gpu::detect_gpu()
|
||||
} else {
|
||||
gpu::GpuBackend::None
|
||||
};
|
||||
|
||||
loop {
|
||||
let t0 = Instant::now();
|
||||
|
||||
let curr = cpu::read_stat();
|
||||
if tick.is_multiple_of(2) {
|
||||
freqs = cpu::read_core_freqs();
|
||||
if emit_cpu {
|
||||
let curr = cpu::read_stat();
|
||||
if tick.is_multiple_of(2) {
|
||||
freqs = cpu::read_core_freqs();
|
||||
}
|
||||
cpu::emit_cpu(&mut out, &prev, &curr, &freqs);
|
||||
prev = curr;
|
||||
}
|
||||
|
||||
if emit_mem && tick.is_multiple_of(2) {
|
||||
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/Intel read sysfs (instant); NVIDIA shells out so runs less often
|
||||
let emit = match &gpu {
|
||||
gpu::GpuBackend::Amd { .. } | gpu::GpuBackend::Intel { .. } => true,
|
||||
gpu::GpuBackend::Nvidia => tick.is_multiple_of(8),
|
||||
gpu::GpuBackend::None => false,
|
||||
};
|
||||
if emit {
|
||||
gpu::emit_gpu(&mut out, &mut gpu);
|
||||
if emit_temp {
|
||||
temp::emit_temp(&mut out);
|
||||
}
|
||||
if emit_graphics {
|
||||
let emit = match &gpu {
|
||||
gpu::GpuBackend::Amd { .. } | gpu::GpuBackend::Intel { .. } => true,
|
||||
gpu::GpuBackend::Nvidia => tick.is_multiple_of(8),
|
||||
gpu::GpuBackend::None => false,
|
||||
};
|
||||
if emit {
|
||||
gpu::emit_gpu(&mut out, &mut gpu);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue