我创建了两个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 的进程。这些子进程应该出现在pyexecutor
cgroup 中。
运行sudo cgclassify <pid of a python-executor>
确实会将进程放入正确的pyexecutor
cgroup 中。
答案1
这是我当前的解决方案:
watch -n 5 'sudo cgclassify $(pgrep -x python-executor | tr "\n" " ")'
每 5 秒执行一次 cgclassify,将 python-executor 添加到基于etc/cgrules.conf
.