35.2. CPU 가중치를 조정하여 애플리케이션의 CPU 시간 분배 제어

특정 cgroup 트리의 애플리케이션에 CPU 시간 배포를 규제하려면 cpu 컨트롤러의 관련 파일에 값을 할당해야 합니다.

사전 요구 사항

  • 루트 권한이 있어야 합니다.
  • CPU 시간 분배를 제어하려는 애플리케이션이 있습니다.
  • 다음 예제와 같이 /sys/fs/cgroup/ root 제어 그룹 내에 하위 제어 그룹 의 두 가지 수준 계층을 생성했습니다.

    …​
      ├── Example
      │   ├── g1
      │   ├── g2
      │   └── g3
    …​
  • cgroup 생성에 설명된 대로 상위 제어 그룹 및 하위 제어 그룹에서 cpu 컨트롤러를 활성화하여 cgroups-v2 파일 시스템에서 컨트롤러를 활성화합니다.

절차

  1. 제어 그룹 내에서 리소스 제한을 달성하도록 원하는 CPU 가중치를 구성합니다.

    # echo "150" > /sys/fs/cgroup/Example/g1/cpu.weight
    # echo "100" > /sys/fs/cgroup/Example/g2/cpu.weight
    # echo "50" > /sys/fs/cgroup/Example/g3/cpu.weight
  2. 애플리케이션의 PID를 g1,g2, g3 하위 그룹에 추가합니다.

    # echo "33373" > /sys/fs/cgroup/Example/g1/cgroup.procs
    # echo "33374" > /sys/fs/cgroup/Example/g2/cgroup.procs
    # echo "33377" > /sys/fs/cgroup/Example/g3/cgroup.procs

    예제 명령을 사용하면 원하는 애플리케이션이 Example/g*/ 하위 cgroup의 멤버가 되고 해당 cgroups의 구성에 따라 CPU 시간을 분산시킵니다.

    프로세스를 실행 중인 하위 cgroup(g1,g2,g3)의 가중치는 상위 cgroup 수준()으로 요약됩니다. 그런 다음 CPU 리소스는 각각의 가중치에 따라 비례분산됩니다.

    결과적으로 모든 프로세스가 동시에 실행될 때 커널은 각각의 cgroup의 cpu.weight 파일에 따라 비례 CPU 시간을 할당합니다.

    하위 cgroupcpu.weight fileCPU 시간 할당

    g1

    150

    ~50% (150/300)

    g2

    100

    ~33% (100/300)

    g3

    50

    ~16% (50/300)

    cpu.weight 컨트롤러 파일의 값은 백분율이 아닙니다.

    한 프로세스가 중지되어 실행 중인 프로세스가 없는 cgroup g2 를 그대로 두면 계산으로 cgroup g2g3 의 계정 가중치만 생략됩니다.

    하위 cgroupcpu.weight fileCPU 시간 할당

    g1

    150

    ~75% (150/200)

    g3

    50

    ~25% (50/200)

    중요

    하위 cgroup에 실행 중인 프로세스가 여러 개 있는 경우 해당 cgroup에 할당된 CPU 시간이 해당 cgroup의 멤버 프로세스에 동일하게 배포됩니다.

검증

  1. 애플리케이션이 지정된 제어 그룹에서 실행되는지 확인합니다.

    # cat /proc/33373/cgroup /proc/33374/cgroup /proc/33377/cgroup
    0::/Example/g1
    0::/Example/g2
    0::/Example/g3

    명령 출력에는 Example/g*/ 하위 cgroups에서 실행되는 지정된 애플리케이션의 프로세스가 표시됩니다.

  2. 스로틀된 애플리케이션의 현재 CPU 사용량을 검사합니다.

    # top
    top - 05:17:18 up 1 day, 18:25,  1 user,  load average: 3.03, 3.03, 3.00
    Tasks:  95 total,   4 running,  91 sleeping,   0 stopped,   0 zombie
    %Cpu(s): 18.1 us, 81.6 sy,  0.0 ni,  0.0 id,  0.0 wa,  0.3 hi,  0.0 si,  0.0 st
    MiB Mem :   3737.0 total,   3233.7 free,    132.8 used,    370.5 buff/cache
    MiB Swap:   4060.0 total,   4060.0 free,      0.0 used.   3373.1 avail Mem
    
        PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
      33373 root      20   0   18720   1748   1460 R  49.5   0.0 415:05.87 sha1sum
      33374 root      20   0   18720   1756   1464 R  32.9   0.0 412:58.33 sha1sum
      33377 root      20   0   18720   1860   1568 R  16.3   0.0 411:03.12 sha1sum
        760 root      20   0  416620  28540  15296 S   0.3   0.7   0:10.23 tuned
          1 root      20   0  186328  14108   9484 S   0.0   0.4   0:02.00 systemd
          2 root      20   0       0      0      0 S   0.0   0.0   0:00.01 kthread
    ...
    참고

    더 명확한 설명을 위해 모든 예제 프로세스를 단일 CPU에서 실행하도록 강제했습니다. CPU weight는 여러 CPU에서 사용되는 경우에도 동일한 원칙을 적용합니다.

    PID 33373,PID 33374, PID 33377 의 CPU 리소스가 각 하위 cgroup에 할당한 가중치인 150, 100, 50을 기반으로 할당되었습니다. 가중치는 약 50%, 33%, 각 애플리케이션에 대한 CPU 시간이 16%에 해당합니다.