Red Hat Training

A Red Hat training course is available for RHEL 8

24.3. CPU 帯域幅の調整によるアプリケーションへの CPU 時間配分の制御

特定の cgroup ツリーの下にあるアプリケーションへの CPU 時間の配分を調整するには、cpu コントローラーの関連ファイルに値を割り当てる必要があります。

前提条件

  • root 権限がある。
  • CPU 時間の配分を制御する 2 つ以上のアプリケーションがある。
  • CPU 時間配分のための cgroup の準備 に記載するように、該当するアプリケーションが同じ CPU の CPU 時間を取り合っていることを確認している。
  • cgroups-v2 のマウント で説明されているように、cgroups-v2 ファイルシステムをマウントしている。
  • CPU 時間配分のための cgroup の準備 で説明されているのと同様に、親コントロールグループとサブコントロールグループの両方に、cpu および cpuset コントローラーを有効にしている。
  • 以下の例のように、/sys/fs/cgroup/ ルートコントロールグループ内に 2 つのレベルの サブコントロールグループ を作成していること。

    …​
      ├── Example
      │   ├── tasks
    …​

手順

  1. コントロールグループ内のリソース制限を実現するために CPU 帯域幅を設定します。

    # echo "200000 1000000" > /sys/fs/cgroup/Example/tasks/cpu.max

    最初の値は、一定の期間にサブグループにある全プロセスをまとめて実行できる許容される時間クォータ (マイクロ秒単位) です。2 番目の値は期間の長さを指定します。

    一期間中にコントロールグループ内のプロセスが全体としてこのクォータで指定した時間を使い切ってしまうと、残りの時間がスロットルされて、次の期間まで実行できなくなります。

    このコマンドは、/sys/fs/cgroup/Example/tasks サブグループの全プロセスが 1 秒ごとに 0.2 秒間のみ CPU で実行されるように、CPU 時間の配分の制御を設定します。つまり、毎秒 5 分の 1 です。

  2. 必要に応じて、時間クォータを確認します。

    # cat /sys/fs/cgroup/Example/tasks/cpu.max
    200000 1000000
  3. アプリケーションの PID を Example/tasks サブグループに追加します。

    # echo "34578" > /sys/fs/cgroup/Example/tasks/cgroup.procs
    # echo "34579" > /sys/fs/cgroup/Example/tasks/cgroup.procs

    上記のコマンド例は、目的のアプリケーションが Example/tasks サブグループのメンバーになり、このサブグループに設定された CPU 時間の配分を超えないようにします。

検証手順

  1. アプリケーションが指定のコントロールグループで実行されていることを確認します。

    # cat /proc/34578/cgroup /proc/34579/cgroup
    0::/Example/tasks
    0::/Example/tasks

    上記の出力は、Example/tasks サブグループで実行される指定されたアプリケーションのプロセスを示しています。

  2. スロットリングされたアプリケーションの現在の CPU 使用率を確認します。

    # top
    top - 11:13:53 up 23:10,  1 user,  load average: 0.26, 1.33, 1.66
    Tasks: 104 total,   3 running, 101 sleeping,   0 stopped,   0 zombie
    %Cpu(s):  3.0 us,  7.0 sy,  0.0 ni, 89.5 id,  0.0 wa,  0.2 hi,  0.2 si,  0.2 st
    MiB Mem :   3737.4 total,   3312.6 free,    133.4 used,    291.4 buff/cache
    MiB Swap:   4060.0 total,   4060.0 free,      0.0 used.   3376.0 avail Mem
    
        PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
      34578 root      20   0   18720   1756   1468 R  10.0   0.0  37:36.13 sha1sum
      34579 root      20   0   18720   1772   1480 R  10.0   0.0  37:41.22 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 および PID 34579 の CPU 使用率が 10% に減少していることが分かります。Example/tasks サブグループは、そのプロセスをまとめて 20% の CPU 時間に調整します。コントロールグループにプロセスが 2 つあるため、各プロセスは CPU 時間の 10% を使用できます。