Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

more ergonomic parent/child cgroups #142

Open
gtrak opened this issue Jan 23, 2025 · 0 comments
Open

more ergonomic parent/child cgroups #142

gtrak opened this issue Jan 23, 2025 · 0 comments

Comments

@gtrak
Copy link

gtrak commented Jan 23, 2025

Is your feature request related to a problem? Please describe.
I couldn't find a direct way to create a parent cgroup, which was required for threaded cgroups to work properly. This was my first experience using cgroups, and it was mostly smooth besides this issue. Without the parent/child relationship, I got a 'operation not supported' error when writing to cgroup.threads, and tracked it down to this requirement with some help from ChatGPT.

The official docs say:

Once threaded, the cgroup can’t be made a domain again. To enable the thread mode, the following conditions must be met. As the cgroup will join the parent’s resource domain. The parent must either be a valid (threaded) domain or a threaded cgroup.

Initially, I just created the final cgroup off the root, which isn't a threaded parent.

Describe the solution you'd like
A more intentional and discoverable method to do what I did.

Describe alternatives you've considered
It could be covered in documentation or tests.

Additional context
Sample code of my work around:

// You can't actually control threads in subprocesses unless there's a threaded parent cgroup
    let parent_cgroup = CgroupBuilder::new("load_test_parent").build(hierarchies::auto())?;

    parent_cgroup
        .set_cgroup_type(cgroup::CGROUP_MODE_THREADED)
        .expect("Failed to set Threaded mode");

    // This is the part I think could be more ergonomic
    let child = "load_test_parent/".to_owned() + cgroup_name;

    let cgroup = CgroupBuilder::new(child.as_str())
        .cpu()
        .cpus("0-3".to_owned())
        .done()
        .pid()
        .maximum_number_of_processes(MaxValue::Value(thread_limit))
        .done()
        .build(hierarchies::auto())?;

    cgroup
        .set_cgroup_type(cgroup::CGROUP_MODE_THREADED)
        .expect("Failed to set Threaded mode");

    // Start subprocess within the cgroup
    let subprocess = Command::new("mycommand")
        .args(&["-v"])
        .spawn()
        .expect("Failed to start subprocess");

    // These add_task functions were also unclear from looking at the impls. 
    // The parent group should receive the pid to cgroup.procs, and the child should receive it to cgroup.threads. 
    // If I do add_task here, I get 'Operation not supported'.
    parent_cgroup
        .add_task_by_tgid(CgroupPid::from(&subprocess))
        .expect("Failed to add subprocess to parent cgroup");

    cgroup
        .add_task(CgroupPid::from(&subprocess))
        .expect("Failed to add Jetty process threads to child cgroup");
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant