有没有办法阻止后代线程自动进入其祖先线程的cgroup?

有没有办法阻止后代线程自动进入其祖先线程的cgroup?

我将应用程序的一些线程显式地写入由我创建的 Linux cpucgroup(例如,让我们现在讨论 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.我个人从未尝试过,但这似乎是你最好的选择。

相关内容