mirror of
https://github.com/containers/youki
synced 2026-01-20 07:21:33 +01:00
* feat: add io limits controller for systemd Signed-off-by: gokulmaxi <gokulakams@gmail.com> * refactor: removed unreachable and fixed use statement Signed-off-by: gokulmaxi <gokulakams@gmail.com> * [refactor] Removed unwanted comments Signed-off-by: gokulmaxi <gokulakams@gmail.com> * refactr: fix linting Signed-off-by: gokulmaxi <gokulakams@gmail.com> * fix: added new asserts in io Signed-off-by: gokulmaxi <gokulakams@gmail.com> * chore: added systemd io example for libcgroups crate Signed-off-by: gokulmaxi <gokulakams@gmail.com> * refactor: lint fix for io.rs in libcgroup crate Signed-off-by: gokulmaxi <gokulakams@gmail.com> * refactor: set legible name for a(st) Signed-off-by: gokulmaxi <gokulakams@gmail.com> * refactor: set legible name for u64 struct Signed-off-by: gokulmaxi <gokulakams@gmail.com> * chore: added deserialise for a(st) Signed-off-by: gokulmaxi <gokulakams@gmail.com> * refactor: fix lint issues Signed-off-by: gokulmaxi <gokulakams@gmail.com> * refactor: moved import for lint Signed-off-by: gokulmaxi <gokulakams@gmail.com> * chore: moved apply limits to anonymous function Signed-off-by: gokulmaxi <gokulakams@gmail.com> * chore:resolved nitpicks from copilot Signed-off-by: gokulmaxi <gokulakams@gmail.com> * chore: move from for to map in apply limits Signed-off-by: gokulmaxi <gokulakams@gmail.com> --------- Signed-off-by: gokulmaxi <gokulakams@gmail.com>
63 lines
2.1 KiB
Rust
63 lines
2.1 KiB
Rust
use std::path::PathBuf;
|
|
use std::process::{Command, Stdio};
|
|
|
|
use anyhow::Result;
|
|
use libcgroups::common::{CgroupConfig, CgroupManager, ControllerOpt, create_cgroup_manager};
|
|
use nix::unistd::Pid;
|
|
use oci_spec::runtime::{
|
|
LinuxBlockIoBuilder, LinuxMemoryBuilder, LinuxResourcesBuilder, LinuxThrottleDeviceBuilder,
|
|
};
|
|
fn main() -> Result<()> {
|
|
let cfg = CgroupConfig {
|
|
cgroup_path: PathBuf::from("system.slice:youki:test"),
|
|
systemd_cgroup: true,
|
|
container_name: "test".to_owned(),
|
|
};
|
|
let manager = create_cgroup_manager(cfg)?;
|
|
let mem_limit = 256 * 1024 * 1024;
|
|
// Throttle rate in bytes per second (Bps) for the block IO device
|
|
const THROTTLE_RATE_BPS: u64 = 1000;
|
|
let rate: u64 = THROTTLE_RATE_BPS;
|
|
let memory_resource = LinuxMemoryBuilder::default().limit(mem_limit).build()?;
|
|
let device = LinuxThrottleDeviceBuilder::default()
|
|
.major(259)
|
|
.minor(0)
|
|
.rate(rate)
|
|
.build()?;
|
|
let blkio = LinuxBlockIoBuilder::default()
|
|
.throttle_read_bps_device(vec![device])
|
|
.build()?;
|
|
let resources = LinuxResourcesBuilder::default()
|
|
.memory(memory_resource)
|
|
.block_io(blkio)
|
|
.build()?;
|
|
let opts = ControllerOpt {
|
|
resources: &resources,
|
|
disable_oom_killer: false,
|
|
oom_score_adj: None,
|
|
freezer_state: None,
|
|
};
|
|
|
|
let pid = Pid::from_raw(std::process::id() as i32);
|
|
manager.add_task(pid)?;
|
|
manager.apply(&opts)?;
|
|
|
|
println!("Cgroup created and properties applied.");
|
|
println!("Launching interactive shell... (type exit to continue)");
|
|
// use 'dd if=/dev/zero of=/tmp/test.bin bs=1M count=1024 oflag=direct' to test the read write speed
|
|
// or check using 'systemctl --show youki-test.scope'
|
|
Command::new("sh")
|
|
.stdin(Stdio::inherit())
|
|
.stdout(Stdio::inherit())
|
|
.stderr(Stdio::inherit())
|
|
.spawn()
|
|
.expect("Failed to spawn shell")
|
|
.wait()
|
|
.expect("Shell process failed");
|
|
|
|
println!("Shell exited. Removing cgroup...");
|
|
|
|
manager.remove()?;
|
|
Ok(())
|
|
}
|