gpt4 book ai didi

rust - 限制 Rust 程序中的 cpurate

转载 作者:行者123 更新时间:2023-12-03 11:37:00 25 4
gpt4 key购买 nike

关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。












想改进这个问题?将问题更新为 on-topic对于堆栈溢出。

1年前关闭。




Improve this question




我想限制我正在运行的 rust 程序的 cprate。
我找到了在命令中执行此操作的方法,但想知道是否有办法在程序内部使用内置的 rust 模块执行此操作。

最佳答案

通常,这不是单个程序的关注点。最简单和最灵活的方法通常是在运行程序时设置资源限制(例如通过 Docker 设置),并允许程序仅使用它所提供的资源。
有了这个,让我们假设你真的需要能够做到这一点。在 Linux 上,您可以使用 cgroups设置资源限制。
有几个适用于 Rust 的 cgroup crate ,它们的年龄和质量各不相同。有些是 native 的,有​​些是 C 库的包装器,但最近都没有更新。即便如此,我还是选择了一个在其文档中包含示例的文档 ( controlgroup ) 并且能够完成这项工作:

use controlgroup::v1::Builder; // controlgroup 0.3.0
use signal_hook:: register; // signal-hook 0.1.16

fn main() {
set_cpu_percent(10.0);

// Do your work here
}

fn set_cpu_percent(percent: f64) {
let mut cgroups = Builder::new("my-cgroups".into())
.cpu()
.cfs_quota_us((percent * 1000.0) as i64)
.cfs_period_us(100_000)
.done()
.build()
.unwrap();

// Add the current task to crgoups
let pid = std::process::id().into();
cgroups.add_task(pid).unwrap();

// Do some clean up, e.g. if you terminate the process with ctrl+C
unsafe {
register(signal_hook::SIGINT, {
// register handler is Fn, so cannot mutate its environment
let cgroups = std::sync::Mutex::new(cgroups);
move || {
let mut cgroups = cgroups.lock().unwrap();
cgroups.remove_task(pid).unwrap();
cgroups.delete().unwrap();
std::process::exit(0);
}
})
.unwrap()
};
}
请注意,我没有进行任何错误处理,您应该将其视为只是概念验证,而不是生产质量代码。我添加 SIGINT 的原因清理处理程序是因为我第二次运行它时出错,因为没有清理上一次运行。我不是这方面的专家,很可能还有很多其他的边缘情况需要考虑,以使其变得健壮。

关于rust - 限制 Rust 程序中的 cpurate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63850151/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com