24.2. CPU 시간 분배를 위해 cgroup 준비
애플리케이션의 CPU 사용을 제어하려면 특정 CPU 컨트롤러를 활성화하고 전용 제어 그룹을 생성해야 합니다. cgroup
파일의 조직의 명확성을 유지하기 위해 /sys/fs/cgroup/
root 제어 그룹 내에 두 개 이상의 하위 제어 그룹을 생성하는 것이 좋습니다.
사전 요구 사항
- 루트 권한이 있습니다.
- 제어하려는 프로세스의 PID를 확인했습니다.
-
cgroups-v2
파일 시스템을 마운트했습니다. 자세한 내용은 cgroups-v2 마운트 를 참조하십시오.
절차
제한하려는 CPU 소비 애플리케이션의 PID(프로세스 ID)를 식별합니다.
# top Tasks: 104 total, 3 running, 101 sleeping, 0 stopped, 0 zombie %Cpu(s): 17.6 us, 81.6 sy, 0.0 ni, 0.0 id, 0.0 wa, 0.8 hi, 0.0 si, 0.0 st MiB Mem : 3737.4 total, 3312.7 free, 133.3 used, 291.4 buff/cache MiB Swap: 4060.0 total, 4060.0 free, 0.0 used. 3376.1 avail Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 34578 root 20 0 18720 1756 1468 R 99.0 0.0 0:31.09 sha1sum 34579 root 20 0 18720 1772 1480 R 99.0 0.0 0:30.54 sha1sum 1 root 20 0 186192 13940 9500 S 0.0 0.4 0:01.60 systemd 2 root 20 0 0 0 0 S 0.0 0.0 0:00.01 kthreadd 3 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 rcu_gp 4 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 rcu_par_gp ...
예제 출력은
PID 34578 및 34
579
(sha1sum
의 설명 애플리케이션 2개)가 CPU라는 많은 리소스를 사용한다는 것을 알 수 있습니다. 두 애플리케이션 모두cgroups-v2
기능 관리를 시연하는 데 사용되는 예제 애플리케이션입니다.cpu 및 cpu
set
컨트롤러를/sys/fs/cgroup/cgroup.controllers 파일에서 사용할 수 있는지 확인합니다.
# cat /sys/fs/cgroup/cgroup.controllers cpuset cpu io memory hugetlb pids rdma
CPU 관련 컨트롤러를 활성화합니다.
# echo "+cpu" >> /sys/fs/cgroup/cgroup.subtree_control # echo "+cpuset" >> /sys/fs/cgroup/cgroup.subtree_control
이러한 명령을 사용하면
/sys/fs/cgroup/
루트 제어 그룹의 즉시 하위 그룹에 대해cpu
및 cpuset
컨트롤러를 사용할 수 있습니다. 하위 그룹은 기준에 따라 프로세스를 지정하고 각 프로세스에 제어 검사를 적용할 수 있는 위치입니다.사용자는 모든 수준에서
cgroup.subtree_control
파일의 내용을 읽고 즉시 하위 그룹에서 활성화에 사용할 수 있는 컨트롤러를 파악할 수 있습니다.참고기본적으로 root 제어 그룹의
/sys/fs/cgroup/cgroup.subtree_control
파일에는메모리
및 Pids컨트롤러
가 포함되어 있습니다./sys/fs/cgroup/Example/
디렉토리를 생성합니다.# mkdir /sys/fs/cgroup/Example/
/sys/fs/cgroup/Example/
디렉토리는 하위 그룹을 정의합니다. 또한 이전 단계에서 이 하위 그룹에 대해cpu
및 cpuset
컨트롤러를 활성화했습니다./sys/fs/cgroup/Example/
디렉터리를 생성하면 일부cgroups-v2
인터페이스 파일과cpu
및 cpuset
컨트롤러별 파일이 디렉터리에 자동으로 생성됩니다./sys/fs/cgroup/Example/
디렉터리에는메모리
및pids
컨트롤러에 대한 컨트롤러별 파일도 포함되어 있습니다.선택적으로 새로 생성된 하위 제어 그룹을 검사합니다.
# ll /sys/fs/cgroup/Example/ -r—r—r--. 1 root root 0 Jun 1 10:33 cgroup.controllers -r—r—r--. 1 root root 0 Jun 1 10:33 cgroup.events -rw-r—r--. 1 root root 0 Jun 1 10:33 cgroup.freeze -rw-r—r--. 1 root root 0 Jun 1 10:33 cgroup.max.depth -rw-r—r--. 1 root root 0 Jun 1 10:33 cgroup.max.descendants -rw-r—r--. 1 root root 0 Jun 1 10:33 cgroup.procs -r—r—r--. 1 root root 0 Jun 1 10:33 cgroup.stat -rw-r—r--. 1 root root 0 Jun 1 10:33 cgroup.subtree_control … -rw-r—r--. 1 root root 0 Jun 1 10:33 cpuset.cpus -r—r—r--. 1 root root 0 Jun 1 10:33 cpuset.cpus.effective -rw-r—r--. 1 root root 0 Jun 1 10:33 cpuset.cpus.partition -rw-r—r--. 1 root root 0 Jun 1 10:33 cpuset.mems -r—r—r--. 1 root root 0 Jun 1 10:33 cpuset.mems.effective -r—r—r--. 1 root root 0 Jun 1 10:33 cpu.stat -rw-r—r--. 1 root root 0 Jun 1 10:33 cpu.weight -rw-r—r--. 1 root root 0 Jun 1 10:33 cpu.weight.nice … -r—r—r--. 1 root root 0 Jun 1 10:33 memory.events.local -rw-r—r--. 1 root root 0 Jun 1 10:33 memory.high -rw-r—r--. 1 root root 0 Jun 1 10:33 memory.low … -r—r—r--. 1 root root 0 Jun 1 10:33 pids.current -r—r—r--. 1 root root 0 Jun 1 10:33 pids.events -rw-r—r--. 1 root root 0 Jun 1 10:33 pids.max
예제 출력에는
cpuset.cpus 및
와 같은 파일이 표시됩니다. 이러한 파일은cpu.
maxcpuset 및 cpu
컨트롤러에 따라 다릅니다.
cpuset
및cpu
컨트롤러는/sys/fs/cgroup/cgroup
) 직접 하위 제어 그룹에 대해 수동으로 활성화됩니다._control 파일을 사용하여 루트의(/
sys/fs/cgroup/cgroup_control디렉터리에는 활성화된 컨트롤러에 관계없이 모든
제어
그룹에 공통된cgroup.procs
또는cgroup.controllers
와 같은 일반적인 cgroup 제어 인터페이스 파일도 포함되어 있습니다.memory.high 및
와 같은 파일은 루트 제어 그룹(pids.
max/sys/fs/cgroup/
)에 있으며 항상 기본적으로 활성화되는메모리
및pids
컨트롤러와 관련이 있습니다.기본적으로 새로 생성된 하위 그룹은 제한 없이 모든 시스템의 CPU 및 메모리 리소스에 대한 액세스를 상속합니다.
/sys/fs/cgroup/Example/
에서 CPU 관련 컨트롤러를 활성화하여 CPU와만 관련된 컨트롤러를 가져옵니다.# echo "+cpu" >> /sys/fs/cgroup/Example/cgroup.subtree_control # echo "+cpuset" >> /sys/fs/cgroup/Example/cgroup.subtree_control
이러한 명령을 사용하면 즉시 하위 제어 그룹에는
메모리
또는 피드 컨트롤러가 아닌 CPU 시간 배포를 규제하는 것과 관련된 컨트롤러 만사용할 수
있습니다./sys/fs/cgroup/Example/tasks/
디렉터리를 생성합니다.# mkdir /sys/fs/cgroup/Example/tasks/
/sys/fs/cgroup/Example/tasks/
디렉터리는cpu 및 cpu
set
컨트롤러에만 관련된 파일이 있는 하위 그룹을 정의합니다.선택적으로 다른 하위 제어 그룹을 검사합니다.
# ll /sys/fs/cgroup/Example/tasks -r—r—r--. 1 root root 0 Jun 1 11:45 cgroup.controllers -r—r—r--. 1 root root 0 Jun 1 11:45 cgroup.events -rw-r—r--. 1 root root 0 Jun 1 11:45 cgroup.freeze -rw-r—r--. 1 root root 0 Jun 1 11:45 cgroup.max.depth -rw-r—r--. 1 root root 0 Jun 1 11:45 cgroup.max.descendants -rw-r—r--. 1 root root 0 Jun 1 11:45 cgroup.procs -r—r—r--. 1 root root 0 Jun 1 11:45 cgroup.stat -rw-r—r--. 1 root root 0 Jun 1 11:45 cgroup.subtree_control -rw-r—r--. 1 root root 0 Jun 1 11:45 cgroup.threads -rw-r—r--. 1 root root 0 Jun 1 11:45 cgroup.type -rw-r—r--. 1 root root 0 Jun 1 11:45 cpu.max -rw-r—r--. 1 root root 0 Jun 1 11:45 cpu.pressure -rw-r—r--. 1 root root 0 Jun 1 11:45 cpuset.cpus -r—r—r--. 1 root root 0 Jun 1 11:45 cpuset.cpus.effective -rw-r—r--. 1 root root 0 Jun 1 11:45 cpuset.cpus.partition -rw-r—r--. 1 root root 0 Jun 1 11:45 cpuset.mems -r—r—r--. 1 root root 0 Jun 1 11:45 cpuset.mems.effective -r—r—r--. 1 root root 0 Jun 1 11:45 cpu.stat -rw-r—r--. 1 root root 0 Jun 1 11:45 cpu.weight -rw-r—r--. 1 root root 0 Jun 1 11:45 cpu.weight.nice -rw-r—r--. 1 root root 0 Jun 1 11:45 io.pressure -rw-r—r--. 1 root root 0 Jun 1 11:45 memory.pressure
CPU 시간을 제어할 프로세스가 동일한 CPU에서 경쟁하는지 확인합니다.
# echo "1" > /sys/fs/cgroup/Example/tasks/cpuset.cpus
이전 명령을 실행하면
Example/tasks
하위 제어 그룹에 배치할 프로세스가 동일한 CPU에서 경쟁합니다. 이 설정은cpu
컨트롤러가 활성화하는 데 중요합니다.중요cpu
컨트롤러는 관련 하위 제어 그룹에 단일 CPU에서 시간을 위해 경쟁하는 최소 2개의 프로세스가 있는 경우에만 활성화됩니다.
검증
선택사항: 즉시 하위 cgroups에 대해 CPU 관련 컨트롤러가 활성화되었는지 확인합니다.
# cat /sys/fs/cgroup/cgroup.subtree_control /sys/fs/cgroup/Example/cgroup.subtree_control cpuset cpu memory pids cpuset cpu
선택사항: CPU 시간을 제어할 프로세스가 동일한 CPU에서 경쟁할지 확인합니다.
# cat /sys/fs/cgroup/Example/tasks/cpuset.cpus 1
추가 리소스
- 제어 그룹 정의
- 커널 리소스 컨트롤러란
- cgroups-v2 마운트
-
cgroups(7)
,sysfs(5)
도움말 페이지