하위 스레드가 상위 스레드의 cgroup에 자동으로 들어가는 것을 방지하는 방법이 있습니까?

하위 스레드가 상위 스레드의 cgroup에 자동으로 들어가는 것을 방지하는 방법이 있습니까?

나는 내가 만든 Linux cgroup에 애플리케이션 스레드 중 일부를 명시적으로 작성합니다. cpu예를 들어 지금은 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. 개인적으로 시도해 본 적은 없지만 최선의 방법인 것 같습니다.

관련 정보