add set cpu.max, cgroup option

This commit is contained in:
Masato Imai
2024-10-21 03:02:58 +00:00
parent 09179c92a0
commit d2078107a1
4 changed files with 33 additions and 9 deletions

View File

@ -1,6 +1,6 @@
use izolilib::{
cgroup::cgroup::CGroup,
izolibox::{CGroupOption, IzoliBox},
cgroup::{cgroup::CGroup, cgroup_option::CGroupOption, cpu_limit::CpuLimit},
izolibox::IzoliBox,
};
fn main() {
@ -21,7 +21,15 @@ fn main() {
.add_subtree_control(cgroup.get_controllers().unwrap())
.unwrap();
let izolibox = IzoliBox::new(1, Some(CGroupOption {}));
let izolibox = IzoliBox::new(
1,
Some(CGroupOption {
cpu_max: Some(CpuLimit {
max: izolilib::cgroup::limit_value::CGroupLimitValue::Value(1000),
period: 100000,
}),
}),
);
let pid = izolibox
.enter(Box::new(|| {
println!("Isolated process: {}", std::process::id());

View File

@ -7,8 +7,8 @@ use std::{
};
use super::{
cgroup_stat::CGroupStat, controller::Controller, cpu_limit::CpuLimit,
limit_value::CGroupLimitValue,
cgroup_option::CGroupOption, cgroup_stat::CGroupStat, controller::Controller,
cpu_limit::CpuLimit, limit_value::CGroupLimitValue,
};
pub struct CGroup {
@ -41,6 +41,14 @@ impl CGroup {
fs::create_dir_all(root)
}
pub fn apply_options(&self, option: &CGroupOption) -> Result<(), std::io::Error> {
if let Some(cpu_max) = &option.cpu_max {
self.set_cpu_max(cpu_max)?;
}
Ok(())
}
pub fn enter(&self) -> Result<(), std::io::Error> {
let pid = std::process::id();
@ -178,6 +186,14 @@ impl CGroup {
Ok(CpuLimit::from_str(&max).unwrap())
}
// cpu write
pub fn set_cpu_max(&self, cpu_limit: &CpuLimit) -> Result<(), std::io::Error> {
let to_write = cpu_limit.to_string();
self.write("cpu.max", &to_write)
}
fn write_value<T>(&self, name: &str, value: T) -> Result<(), std::io::Error>
where
T: fmt::Display,

View File

@ -1,4 +1,5 @@
pub mod cgroup;
pub mod cgroup_option;
pub mod cgroup_stat;
pub mod controller;
pub mod cpu_limit;

View File

@ -4,12 +4,10 @@ use nix::{
unistd::Pid,
};
use crate::cgroup::cgroup::CGroup;
use crate::cgroup::{cgroup::CGroup, cgroup_option::CGroupOption};
const STACK_SIZE: usize = 8192;
pub struct CGroupOption {}
pub struct IzoliBox {
pub id: usize,
pub cgroup_option: Option<CGroupOption>,
@ -27,8 +25,9 @@ impl IzoliBox {
| CloneFlags::CLONE_NEWIPC
| CloneFlags::CLONE_NEWPID;
if let Some(_cgroup_option) = &self.cgroup_option {
if let Some(cgroup_option) = &self.cgroup_option {
let cgroup = CGroup::new(&format!("izoli/box_{}", self.id)).unwrap();
cgroup.apply_options(cgroup_option).unwrap();
cgroup.enter().unwrap();
}