sysfsを使用したcgroups v2の管理

この項では、sysfsインタフェースを使用して、システムで実行されているプロセス間でのリソースの配分を管理するためのcgroupsを作成および構成する方法を示します。

重要:

systemdを使用してすべてのリソース管理を処理することをお薦めします。詳細は、『Oracle Linux 8: systemdでのシステムの管理』を参照してください。ここに示す例では、systemdがシステムで実行するアクションのコンテキストを示し、systemdの外部の機能を示します。提供される情報は、cgroupsの問題をデバッグするときに役立ちます。

この手順の例では、それぞれに異なるアプリケーションPIDが割り当てられているcgroups間でCPU時間を割り当てます。CPU時間およびアプリケーションPID値は、各グループのCPU.weightおよびcgroup.procsファイルに設定されています。

この例には、/sys/fs/cgroupの下に作成する必要があるcgroupsで、cpuコントローラおよびそれに関連付けられたファイル(cpu.weightファイルを含む)を使用できるようにするために必要なステップも含まれています。

CPU時間の配分のための制御グループの準備

この手順では、CPU時間の配分を管理する制御グループを手動で準備する方法について説明します。制御グループの構成には、systemdを使用することをお薦めします。

  1. cpuコントローラが、ルート制御グループの階層の最上位にあることを確認します。

    /sys/fs/cgroup/cgroup.controllersファイルの内容を画面に出力します:

    sudo cat /sys/fs/cgroup/cgroup.controllers
    cpuset cpu io memory hugetlb pids rdma misc

    cgroup.controllersファイルにリストされているコントローラを同じディレクトリのcgroup.subtree_controlファイルに追加して、グループの直下の子cgroupsで使用できるようにすることができます。

  2. cpuコントローラをcgroup.subtree_controlファイルに追加して、ルートの直下の子cgroupsで使用できるようにします。

    デフォルトでは、memoryおよびpidsコントローラのみがファイルに含まれます。cpuコントローラを追加するには、次のように入力します。

    echo "+cpu" | sudo tee /sys/fs/cgroup/cgroup.subtree_control
    
  3. オプションで、cpuコントローラが期待どおりに追加されたことを確認します。
    sudo cat /sys/fs/cgroup/cgroup.subtree_control
    cpu memory pids
  4. ルート制御グループの下に、アプリケーションのCPUリソースを管理するための新しい制御グループになる子グループを作成します。
    sudo mkdir /sys/fs/cgroup/MyGroups
  5. 必要に応じて、新しいサブディレクトリまたは子グループの内容をリストし、cpuコントローラが期待どおりに存在することを確認します。
    ls -l /sys/fs/cgroup/MyGroups
    -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
    …​
    -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
  6. MyGroupsディレクトリのcgroup.subtree_controlファイルでcpuコントローラを有効にして、その直下の子cgroupsで使用できるようにします。
    echo "+cpu" | sudo tee /sys/fs/cgroup/MyGroups/cgroup.subtree_control
  7. 必要に応じて、cpuコントローラがMyGroupsの子グループに対して有効になっていることを確認します。
    sudo cat /sys/fs/cgroup/MyGroups/cgroup.subtree_control
    cpu

CPU時間の配分を制御するためのCPUの重みの設定

この手順では、制御グループを使用してCPU時間の配分を管理することによって、3つの異なるプロセスのCPUの重みを設定する方法について説明します。制御グループの構成には、systemdを使用することをお薦めします。

この手順は、次の仮定に基づいています。

  • 次のtopコマンドの出力例に示すように、CPUリソースを過度に消費しているアプリケーションはsha1sumです:

    sudo top
    ...
    PID   USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
    33301 root      20   0   18720   1756   1468 R  99.0   0.0   0:31.09 sha1sum
    33302 root      20   0   18720   1772   1480 R  99.0   0.0   0:30.54 sha1sum
    33303 root      20   0   18720   1772   1480 R  99.0   0.0   0:30.54 sha1sum
    1 root      20   0  109724  17196  11032 S   0.0   0.1   0:03.28 systemd                     
    2 root      20   0       0      0      0 S   0.0   0.0   0:00.00 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                  
              ...
  • 前述のサンプル出力に示されているように、sha1sumプロセスには、PID 33301、33302および33303があります。

重要:

以降の手順の前提条件として、CPU時間の配分のための制御グループの準備の説明に従って、cgroup-v2の準備を完了する必要があります。これらの準備をスキップした場合、この手順は完了できません。

  1. MyGroupsサブディレクトリに3つの子グループを作成します。
    sudo mkdir /sys/fs/cgroup/MyGroups/g1
    sudo mkdir /sys/fs/cgroup/MyGroups/g2
    sudo mkdir /sys/fs/cgroup/MyGroups/g3
  2. 子グループごとにCPUの重みを構成します。
    echo "150" | sudo tee /sys/fs/cgroup/MyGroups/g1/cpu.weight
    echo "100" | sudo tee /sys/fs/cgroup/MyGroups/g2/cpu.weight
    echo "50" | sudo tee /sys/fs/cgroup/MyGroups/g3/cpu.weight
  3. アプリケーションPIDを対応する子グループに適用します。
    echo "33301" | sudo tee /sys/fs/cgroup/Example/g1/cgroup.procs
    echo "33302" | sudo tee /sys/fs/cgroup/Example/g2/cgroup.procs
    echo "33303" | sudo /sys/fs/cgroup/Example/g3/cgroup.procs

    これらのコマンドは、選択したアプリケーションをMyGroups/g*/制御グループのメンバーになるように設定します。各sha1sumプロセスのCPU時間は、各グループに対して構成されたCPU時間配分によって異なります。

    実行中のプロセスを持つg1g2およびg3グループの重みは、親制御グループであるMyGroupsのレベルで合計されます。

    この構成では、すべてのプロセスが同時に実行されると、カーネルは、次のように、それぞれのcgroupcpu.weightファイルに基づいて比例するCPU時間を各sha1sumプロセスに割り当てます。

    子グループ cpu.weight設定 CPU時間割当ての割合
    g1 150 ~50% (150/300)
    g2 100 ~33% (100/300)
    g3 50 ~16% (50/300)

    ある子グループに実行中のプロセスがない場合、実行中のプロセスのCPU時間割当ては、実行中のプロセスを持つ残りの子グループの合計の重みに基づいて再計算されます。たとえば、g2子グループに実行中のプロセスがない場合、合計の重みはg1+g3の重みである200になります。この場合、g1のCPU時間は150/200 (~75%)になり、g3の場合は50/200 (~25%)になります。

  4. 指定した制御グループでアプリケーションが実行されていることを確認します。
    sudo cat /proc/33301/cgroup /proc/33302/cgroup /proc/33303/cgroup
    0::/MyGroups/g1
    0::/MyGroups/g2
    0::/MyGroups/g3
  5. CPUの重みを設定した後で、現在のCPU消費を確認します。
    top
    ...
    PID   USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
    33301 root      20   0   18720   1748   1460 R  49.5   0.0 415:05.87 sha1sum
    33302 root      20   0   18720   1756   1464 R  32.9   0.0 412:58.33 sha1sum
    33303 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
    ...