cgexec 未将子进程放入正确的 cgroup 中

cgexec 未将子进程放入正确的 cgroup 中

我创建了两个cgroup:

sudo cgcreate -g cpu,memory:rustserver
sudo cgset -r memory.max=150000000 rustserver
sudo cgset -r cpu.max=25000 rustserver

sudo cgcreate -g cpu,memory:pyexecutor
sudo cgset -r memory.max=150000000 pyexecutor
sudo cgset -r cpu.max=25000 pyexecutor

这是我的/etc/cgrules.conf文件:

*:target/debug/python-executor cpu,memory pyexecutor
*:target/debug/rust-api cpu,memory rustserver

我执行以下命令: sudo cgexec target/debug/rust-api

由于文档的cgexex命令

-g :定义将在其中运行任务的控制组。 controllers 是控制器列表,path 是给定控制器列表中控制组的相对路径。该标志可以多次使用来定义多对控制器列表和相对路径。可以使用通配符 b"*b" 来代替所有已安装控制器的列表。

如果不使用此选项,则 cgexec 将根据 /etc/cgrules.conf 自动将任务放置到正确的 cgroup 中。

--sticky 如果使用此选项运行任务命令,服务 cgred 的守护进程(cgrulesengd 进程)不会更改 命令和孩子们的任务。如果没有此选项,守护进程不会更改命令的任务,但会自动根据 /etc/cgrules.conf 将子任务更改为正确的 cgroup。

我希望将target/debug/python-executor其执行的子进程rust-api放置在它自己的 cgroup 中。但这个子进程也出现在 cgroup 中rustserver

我希望我的主应用程序(rust-api)拥有自己的 cgroup。 rust-api 会生成多个名为 python-executor 的进程。这些子进程应该出现在pyexecutorcgroup 中。

运行sudo cgclassify <pid of a python-executor>确实会将进程放入正确的pyexecutorcgroup 中。

答案1

这是我当前的解决方案:

watch -n 5 'sudo cgclassify $(pgrep -x python-executor | tr "\n" " ")'

每 5 秒执行一次 cgclassify,将 python-executor 添加到基于etc/cgrules.conf.

相关内容