我将应用程序的一些线程显式地写入由我创建的 Linux cpu
cgroup(例如,让我们现在讨论 v1,但如果您知道 v2 的方法,那就太好了)。
但是,我看到后代线程(pthread_create()
由其父线程调用创建,显式写入 cgroup 或在其父线程之后再次写入)也出现在 cgroup 中,而无需我直接编写它们。
这会对应用程序产生不好的影响。某些线程意外到达 cgroup。您需要始终注意这一警告并小心,例如线程池等。
请问您有办法解决这个问题吗?例如,也许有一种方法可以禁止后代线程自动进入其父级的 cgroup?任何帮助表示赞赏。
答案1
在手册页中clone(2)
您可以找到有关该标志的信息CLONE_INTO_CGROUP
:
CLONE_INTO_CGROUP (since Linux 5.7) By default, a child process is placed in the same version 2 cgroup as its parent. The CLONE_INTO_CGROUP flag allows the child process to be created in a different version 2 cgroup. (Note that CLONE_INTO_CGROUP has effect only for version 2 cgroups.) In order to place the child process in a different cgroup, the caller specifies CLONE_INTO_CGROUP in cl_args.flags and passes a file descriptor that refers to a version 2 cgroup in the cl_args.cgroup field. (This file descriptor can be obtained by opening a cgroup v2 directory using either the O_RDONLY or the O_PATH flag.) Note that all of the usual restrictions (described in cgroups(7)) on placing a process into a version 2 cgroup apply.
手册页下面有更多信息。
然而,pthread_create
它只是 的一个包装器clone
,它使用一组定义的旗帜无法更改的:
const int clone_flags = (CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SYSVSEM
| CLONE_SIGHAND | CLONE_THREAD
| CLONE_SETTLS | CLONE_PARENT_SETTID
| CLONE_CHILD_CLEARTID
| 0);
所以在我看来,实现目标的唯一方法是使用clone
而不是pthread_create
.我个人从未尝试过,但这似乎是你最好的选择。