24.2. CPU 시간 배포를 위한 cgroup 준비


애플리케이션의 CPU 사용을 제어하려면 특정 CPU 컨트롤러를 활성화하고 전용 제어 그룹을 생성해야 합니다. cgroup 파일을 조직의 명확성을 유지하기 위해 /sys/fs/cgroup/ 루트 제어 그룹 내에 두 개 이상의 하위 제어 그룹을 생성하는 것이 좋습니다.

사전 요구 사항

  • root 권한이 있습니다.
  • 제어하려는 프로세스의 PID를 식별했습니다.
  • cgroups-v2 파일 시스템을 마운트했습니다. 자세한 내용은 cgroups-v2 마운트 를 참조하십시오.

프로세스

  1. 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 3457834579 ( sha1sum의 2개의 예시 애플리케이션)에서 CPU라는 대량의 리소스를 사용한다는 것을 보여줍니다. 둘 다 cgroups-v2 기능 관리를 시연하는 데 사용되는 애플리케이션의 예입니다.

  2. /sys/fs/cgroup/cgroup.controllers 파일에서 cpucpuset 컨트롤러를 사용할 수 있는지 확인합니다.

    # cat /sys/fs/cgroup/cgroup.controllers
    cpuset cpu io memory hugetlb pids rdma
  3. CPU 관련 컨트롤러를 활성화합니다.

    # echo "+cpu" >> /sys/fs/cgroup/cgroup.subtree_control
    # echo "+cpuset" >> /sys/fs/cgroup/cgroup.subtree_control

    이러한 명령은 /sys/fs/cgroup/ root 제어 그룹의 즉시 하위 그룹에 대해 cpucpuset 컨트롤러를 활성화합니다. 하위 그룹은 기준을 기반으로 프로세스를 지정하고 각 프로세스에 제어 검사를 적용할 수 있는 위치입니다.

    모든 수준에서 cgroup.subtree_control 파일을 검토하여 즉시 하위 그룹에서 활성화할 수 있는 컨트롤러를 식별할 수 있습니다.

    참고

    기본적으로 루트 제어 그룹의 /sys/fs/cgroup/cgroup.subtree_control 파일에는 메모리pids 컨트롤러가 포함되어 있습니다.

  4. /sys/fs/cgroup/Example/ 디렉터리를 생성합니다.

    # mkdir /sys/fs/cgroup/Example/

    /sys/fs/cgroup/Example/ 디렉터리는 하위 그룹을 정의합니다. 또한 이전 단계에서 이 하위 그룹에 대해 cpucpuset 컨트롤러를 활성화했습니다.

    /sys/fs/cgroup/Example/ 디렉터리를 생성하면 일부 cgroups-v2 인터페이스 파일과 cpucpuset 컨트롤러별 파일이 디렉터리에 자동으로 생성됩니다. /sys/fs/cgroup/Example/ 디렉터리는 메모리pids 컨트롤러에 대한 컨트롤러별 파일도 제공합니다.

  5. 선택 사항: 새로 생성된 하위 제어 그룹을 검사합니다.

    # 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.cpuscpu.max 와 같은 파일이 표시되어 있습니다. 이러한 파일은 cpusetcpu 컨트롤러에 따라 다릅니다. cpusetcpu 컨트롤러는 /sys/fs/cgroup/cgroup_ control 파일을 사용하여 루트(/sys/fs/cgroup/cgroup/cgroup/cgroup/cgroup /cgroup/cgroup/cgroup/cgroup/cgroup_control )에 대해 수동으로 활성화됩니다.

    디렉터리에는 활성화된 컨트롤러와 관계없이 모든 제어 그룹에 공통인 cgroup.procs 또는 cgroup.controllers 와 같은 일반 cgroup 제어 인터페이스 파일도 포함되어 있습니다.

    memory.highpids.max 와 같은 파일은 루트 제어 그룹(/sys/fs/cgroup/)에 있는 메모리pids 컨트롤러와 관련이 있으며 항상 기본적으로 활성화됩니다.

    기본적으로 새로 생성된 하위 그룹은 제한 없이 모든 시스템의 CPU 및 메모리 리소스에 대한 액세스를 상속합니다.

  6. /sys/fs/cgroup/Example/ 에서 CPU 관련 컨트롤러를 활성화하여 CPU와 관련된 컨트롤러를 가져옵니다.

    # echo "+cpu" >> /sys/fs/cgroup/Example/cgroup.subtree_control
    # echo "+cpuset" >> /sys/fs/cgroup/Example/cgroup.subtree_control

    이러한 명령을 사용하면 즉시 하위 제어 그룹에 메모리 또는 pid 컨트롤러가 아닌 CPU 시간 분배를 규제하는 컨트롤러 사용할 있습니다.

  7. /sys/fs/cgroup/Example/tasks/ 디렉터리를 생성합니다.

    # mkdir /sys/fs/cgroup/Example/tasks/

    /sys/fs/cgroup/Example/tasks/ 디렉터리는 cpucpuset 컨트롤러와 순전히 관련된 파일이 있는 하위 그룹을 정의합니다.

  8. 선택 사항: 다른 하위 제어 그룹을 검사합니다.

    # 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
  9. 동일한 CPU에서 CPU 시간을 제어하려는 프로세스가 경쟁해야 합니다.

    # echo "1" > /sys/fs/cgroup/Example/tasks/cpuset.cpus

    이렇게 하면 Example/tasks 하위 제어 그룹에 배치한 프로세스가 동일한 CPU에서 경쟁하게 됩니다. 이 설정은 cpu 컨트롤러가 활성화되는 데 중요합니다.

    중요

    cpu 컨트롤러는 관련 하위 제어 그룹에 단일 CPU에서 시간 동안 경쟁할 최소 2개의 프로세스가 있는 경우에만 활성화됩니다.

검증

  1. 선택 사항: 즉시 하위 cgroup에 대해 CPU 관련 컨트롤러가 활성화되어 있는지 확인합니다.

    # cat /sys/fs/cgroup/cgroup.subtree_control /sys/fs/cgroup/Example/cgroup.subtree_control
    cpuset cpu memory pids
    cpuset cpu
  2. 선택 사항: 동일한 CPU에서 CPU 시간을 제어하려는 프로세스가 경쟁해야 합니다.

    # cat /sys/fs/cgroup/Example/tasks/cpuset.cpus
    1

추가 리소스

Red Hat logoGithubRedditYoutubeTwitter

자세한 정보

평가판, 구매 및 판매

커뮤니티

Red Hat 문서 정보

Red Hat을 사용하는 고객은 신뢰할 수 있는 콘텐츠가 포함된 제품과 서비스를 통해 혁신하고 목표를 달성할 수 있습니다.

보다 포괄적 수용을 위한 오픈 소스 용어 교체

Red Hat은 코드, 문서, 웹 속성에서 문제가 있는 언어를 교체하기 위해 최선을 다하고 있습니다. 자세한 내용은 다음을 참조하세요.Red Hat 블로그.

Red Hat 소개

Red Hat은 기업이 핵심 데이터 센터에서 네트워크 에지에 이르기까지 플랫폼과 환경 전반에서 더 쉽게 작업할 수 있도록 강화된 솔루션을 제공합니다.

© 2024 Red Hat, Inc.