cgroups: cgroup에서 프로세스를 분리하는 방법

cgroups: cgroup에서 프로세스를 분리하는 방법

mygroup시스템에 cgroup을 생성하고 그 아래에서 프로세스를 실행했습니다.

cgexec -g memory,cpu:groupname/mygroup someprocess

이제 얼마 후 CPU와 메모리에 대해 걱정할 필요가 없다고 느낄 때 내 앱의 cgroup에서 프로세스를 어떻게 분리할 수 있습니까?

답변1

한 번그룹하위 시스템을 설치하여 사용할 수 있으며 프로세스는 항상 하위 시스템의 일부입니다.그룹해당 하위 시스템의 계층 구조에는 처음에는 루트가 있습니다.그룹, 다른 곳으로 이동하지 않는 한그룹, 해당 하위 항목도 거기에 나타납니다. 프로세스를 "분리"한다는 것은 일반적으로 프로세스를 루트로 이동(뒤로)하는 것을 의미합니다.그룹특정 하위 시스템의

/sys/fs/cgroup하위 시스템이 충분히 설치되었다고 가정하면 일반적으로 아래 설명 과 같이 의사 디렉터리를 생성/삭제하거나 해당 디렉터리에 있는 의사 파일에 충분한 값을 읽고 쓰는 방식으로 모든 것을 사용할 수 있습니다.man cgroups.7그렇지 않으면 제공된 전용 명령 cgexec은 다음과 같습니다.cgclassify.

다음은 예입니다(사용cgroupv1) bash 쉘의 지침:

# ls /sys/fs/cgroup/{memory,cpu}/groupname/mygroup
ls: cannot access '/sys/fs/cgroup/memory/groupname/mygroup': No such file or directory
ls: cannot access '/sys/fs/cgroup/cpu/groupname/mygroup': No such file or directory

# cgcreate -g memory,cpu:groupname/mygroup

# ls -d /sys/fs/cgroup/{memory,cpu}/groupname/mygroup
/sys/fs/cgroup/cpu/groupname/mygroup  /sys/fs/cgroup/memory/groupname/mygroup

물론, 위의 cgroup을 생성한 후 몇 가지 특수한 설정을 적용하는 것이 가능할 수도 있습니다.

# cgexec -g memory,cpu:groupname/mygroup sh -c 'echo $$; exec sleep 999'
14682

기타 터미널:

# grep -w 14682 /sys/fs/cgroup/{memory,cpu}/groupname/mygroup/cgroup.procs 
/sys/fs/cgroup/memory/groupname/mygroup/cgroup.procs:14682
/sys/fs/cgroup/cpu/groupname/mygroup/cgroup.procs:14682
# grep -w 14682 /sys/fs/cgroup/{memory,cpu}/cgroup.procs
#

# cgclassify -g memory,cpu:/ 14682

# grep -w 14682 /sys/fs/cgroup/{memory,cpu}/groupname/mygroup/cgroup.procs
# grep -w 14682 /sys/fs/cgroup/{memory,cpu}/cgroup.procs
/sys/fs/cgroup/memory/cgroup.procs:14682
/sys/fs/cgroup/cpu/cgroup.procs:14682

위의 세 가지 특수 명령은 다음과 같은 간단한 셸 명령으로 대체될 수 있습니다.

# mkdir -p /sys/fs/cgroup/{memory,cpu}/groupname/mygroup
# bash -c 'echo $$ | tee /sys/fs/cgroup/{memory,cpu}/groupname/mygroup/cgroup.procs; exec sleep 999'
15533

그리고 ("분리"):

# echo 15533 | tee /sys/fs/cgroup/{memory,cpu}/cgroup.procs
15533

실제로 전용 명령에 주의하십시오 cgclassify. 적어도cgroup.../tasksv1은 프로세스 자체( 사용)가 아닌 프로세스 스레드( 사용)에서 작동합니다 .../cgroup.procs. 단순 프로세스의 경우 pid(프로세스 ID)가 유일한 스레드이므로 작업 그룹 ID(tgid=pid)는 두 의사 파일 모두에서 동일하며 차이가 없습니다. 다중 스레드 프로세스의 경우 전체 프로세스를 이동하려면 .../tasks사용 시 또는 단순히 사용할 때 모든 스레드를 인식 해야 합니다 .../cgroup.procs. 남성의 경우:

PID가 기록되면 cgroup.procs프로세스의 모든 스레드가 즉시 새 cgroup으로 이동됩니다.

taskscgroups v1에서는 스레드 ID(즉, clone(2) 및 gettid(2)에서 반환된 커널 스레드 ID)를 cgroup 디렉터리의 파일에 기록하여 개별 스레드를 다른 cgroup으로 이동할 수 있었습니다 . 이 파일을 읽어 cgroup의 구성원인 스레드 집합을 검색할 수 있습니다.

그래서 .../cgroup.procs나중에 보여주고 사용하기로 결정했습니다. 이는 이러한 상황에 대한 모든 작업을 제공 pgrep --lightweight하는 데 사용할 수 있는 Firefox, Java 애플리케이션 등과 같은 다중 스레드 프로세스를 이동할 cgclassify때 중요합니다 (단, 경쟁에 유의하세요).

관련 정보