나는 내가 만든 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
. 개인적으로 시도해 본 적은 없지만 최선의 방법인 것 같습니다.