1
0
mirror of https://github.com/containers/youki synced 2026-01-20 07:21:33 +01:00
youki/crates/libcgroups/examples/systemd_io.rs
Gokulakrishnan D P 9109758fa5
feat: add io limits controller for systemd (#3235)
* 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>
2025-12-30 13:16:14 +09:00

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(())
}