提交 7b766986 authored 作者: Serhij S's avatar Serhij S

CpuGovernor

上级 4948fe67
......@@ -671,9 +671,10 @@ impl SystemConfig {
pub fn apply(mut self) -> Result<SystemConfigGuard> {
if is_realtime() {
for (key, value) in &self.values {
let prev_value = fs::read_to_string(format!("/proc/sys/{}", key))?;
let fname = format!("/proc/sys/{}", key);
let prev_value = fs::read_to_string(&fname)?;
self.prev_values.insert(key, prev_value);
fs::write(format!("/proc/sys/{}", key), value)?;
fs::write(fname, value)?;
}
}
Ok(SystemConfigGuard { config: self })
......@@ -696,6 +697,56 @@ impl Drop for SystemConfigGuard {
}
}
/// Configure CPU governors for the given CPUs
pub struct CpuGovernor {
prev_governor: BTreeMap<usize, String>,
}
impl CpuGovernor {
/// Set performance governor for the given CPUs. This sets the maximum frequency for the CPUs,
/// increasing the power consumption but lowering their latency. It is enough to specify a
/// single logical core number per physical core. The governor is restored when the returned
/// guard object is dropped.
pub fn performance<I>(performance_cpus: I) -> Result<CpuGovernor>
where
I: IntoIterator<Item = usize>,
{
let mut prev_governor = BTreeMap::new();
for cpu in performance_cpus {
let fname = format!(
"/sys/devices/system/cpu/cpu{}/cpufreq/scaling_governor",
cpu
);
let prev_value = fs::read_to_string(fname)?;
prev_governor.insert(cpu, prev_value.trim().to_string());
}
for cpu in prev_governor.keys() {
let fname = format!(
"/sys/devices/system/cpu/cpu{}/cpufreq/scaling_governor",
cpu
);
fs::write(fname, "performance")?;
}
Ok(CpuGovernor { prev_governor })
}
}
impl Drop for CpuGovernor {
fn drop(&mut self) {
for (cpu, governor) in &self.prev_governor {
if let Err(error) = fs::write(
format!(
"/sys/devices/system/cpu/cpu{}/cpufreq/scaling_governor",
cpu
),
governor,
) {
warn!(cpu, %error, "Failed to restore governor");
}
}
}
}
/// Get absolute number of CPUs, including isolated
pub fn num_cpus() -> Result<usize> {
let f = std::fs::File::open("/proc/cpuinfo")?;
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论