mirror of
https://codeberg.org/icewind/palantir.git
synced 2026-06-03 10:14:09 +02:00
drm gpu power
This commit is contained in:
parent
6144739770
commit
8d3e3e33a5
3 changed files with 56 additions and 2 deletions
|
|
@ -1,7 +1,13 @@
|
||||||
use crate::sensors::Memory;
|
use crate::sensors::Memory;
|
||||||
use std::fmt::Write;
|
use std::fmt::Write;
|
||||||
use std::fs::read_to_string;
|
use std::fs::{read_to_string, File};
|
||||||
|
use std::io::{Read, Seek};
|
||||||
|
use std::path::Path;
|
||||||
use std::str::FromStr;
|
use std::str::FromStr;
|
||||||
|
use std::sync::atomic::{AtomicU64, Ordering};
|
||||||
|
use std::sync::Mutex;
|
||||||
|
use std::thread::sleep;
|
||||||
|
use std::time::{Duration, Instant};
|
||||||
|
|
||||||
pub mod nvidia;
|
pub mod nvidia;
|
||||||
|
|
||||||
|
|
@ -81,3 +87,47 @@ pub fn utilization() -> impl Iterator<Item = GpuUsage> {
|
||||||
});
|
});
|
||||||
drm.chain(nv_usage)
|
drm.chain(nv_usage)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static GPU_POWER_UJ: AtomicU64 = AtomicU64::new(0);
|
||||||
|
static GPU_POWER_LAST_READ: Mutex<Option<Instant>> = Mutex::new(None);
|
||||||
|
|
||||||
|
fn read_gpu_power() -> Option<u64> {
|
||||||
|
read_num("/sys/class/drm/card0/device/hwmon/hwmon0/power1_average")
|
||||||
|
}
|
||||||
|
|
||||||
|
fn get_gpu_power_elapsed() -> Option<Duration> {
|
||||||
|
let mut last_read = GPU_POWER_LAST_READ.lock().unwrap();
|
||||||
|
let now = Instant::now();
|
||||||
|
let elapsed = last_read.as_ref().map(|last_read| now - *last_read);
|
||||||
|
*last_read = Some(now);
|
||||||
|
elapsed
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn update_gpu_power() {
|
||||||
|
let mut buff = String::with_capacity(16);
|
||||||
|
if let Ok(mut file) = File::open("/sys/class/drm/card0/device/hwmon/hwmon0/power1_average") {
|
||||||
|
loop {
|
||||||
|
if let Some(elapsed) = get_gpu_power_elapsed() {
|
||||||
|
buff.clear();
|
||||||
|
file.rewind().ok();
|
||||||
|
let current_power: u64 = match file.read_to_string(&mut buff) {
|
||||||
|
Ok(_) => buff.trim().parse().unwrap_or_default(),
|
||||||
|
Err(_) => {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
let elapsed_milli = elapsed.as_millis() as u64;
|
||||||
|
|
||||||
|
let power = current_power * elapsed_milli / 1000;
|
||||||
|
|
||||||
|
GPU_POWER_UJ.fetch_add(power, Ordering::SeqCst);
|
||||||
|
}
|
||||||
|
sleep(Duration::from_millis(500));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn gpu_power() -> u64 {
|
||||||
|
GPU_POWER_UJ.load(Ordering::SeqCst)
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,7 @@ use libmdns::Responder;
|
||||||
use palantir::disk::zfs::arcstats;
|
use palantir::disk::zfs::arcstats;
|
||||||
use palantir::docker::{get_docker, stat, Container};
|
use palantir::docker::{get_docker, stat, Container};
|
||||||
use palantir::get_metrics;
|
use palantir::get_metrics;
|
||||||
use palantir::gpu::gpu_metrics;
|
use palantir::gpu::{gpu_metrics, update_gpu_power};
|
||||||
use palantir::power::power_usage;
|
use palantir::power::power_usage;
|
||||||
use std::time::Duration;
|
use std::time::Duration;
|
||||||
use tokio::runtime::Handle;
|
use tokio::runtime::Handle;
|
||||||
|
|
@ -84,6 +84,8 @@ async fn main() -> Result<()> {
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::thread::spawn(update_gpu_power);
|
||||||
|
|
||||||
let metrics = warp::path!("metrics").and(docker).and_then(serve_metrics);
|
let metrics = warp::path!("metrics").and(docker).and_then(serve_metrics);
|
||||||
|
|
||||||
warp::serve(metrics).run(([0, 0, 0, 0], host_port)).await;
|
warp::serve(metrics).run(([0, 0, 0, 0], host_port)).await;
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,4 @@
|
||||||
|
use crate::gpu::gpu_power;
|
||||||
use color_eyre::{Report, Result};
|
use color_eyre::{Report, Result};
|
||||||
use std::fmt::Write;
|
use std::fmt::Write;
|
||||||
use std::fs::{read_dir, read_to_string};
|
use std::fs::{read_dir, read_to_string};
|
||||||
|
|
@ -84,6 +85,7 @@ pub fn power_usage() -> Result<Option<PowerUsage>> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
usage.gpu_uj = gpu_power();
|
||||||
if let Some(nvidia_power) = crate::gpu::nvidia::power() {
|
if let Some(nvidia_power) = crate::gpu::nvidia::power() {
|
||||||
usage.gpu_uj = nvidia_power;
|
usage.gpu_uj = nvidia_power;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue