27.2. CPU の重みの調整によるアプリケーションへの CPU 時間配分の制御
特定の cgroup ツリーの下にあるアプリケーションへの CPU 時間の配分を調整するには、cpu
コントローラーの関連ファイルに値を割り当てる必要があります。
前提条件
- システムの root 権限がある。
- CPU 時間の配分を制御するアプリケーションがある。
-
cgroups-v2
ファイルシステムをマウントしている。 次の例のように、
/sys/fs/cgroup/
root control group 内に、child control groups グループの 2 階層を作成しました。Copy to Clipboard Copied! Toggle word wrap Toggle overflow -
cgroups-v2 ファイルシステムでの cgroup の作成とコントローラーの有効化 で説明したのと同様に、親コントロールグループと子コントロールグループで
cpu
コントローラーを有効にしました。
手順
コントロールグループ内でリソース制限を達成するために必要な 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
# 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
Copy to Clipboard Copied! Toggle word wrap Toggle overflow アプリケーションの 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
# 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
Copy to Clipboard Copied! Toggle word wrap Toggle overflow これらのコマンドにより、必要なアプリケーションが
Example/g*/
子 cgroups のメンバーになり、それらの cgroups の設定に基づいて CPU 時間が分配されるようになります。実行中のプロセスを持つ子 cgroups (
g1
、g2
、g3
) の重みは、親 cgroup (Example
) のレベルで合算されます。CPU リソースは、割り当てられた重みに基づいて比例して分配されます。その結果、すべてのプロセスが同時に実行されると、カーネルは割り当てられた cgroup の
cpu.weight
ファイルに基づいて、各プロセスに比例した CPU 時間を割り当てます。Expand サブ cgroup cpu.weight
ファイルCPU 時間の割り当て g1
150
約 50% (150/300)
g2
100
約 33% (100/300)
g3
50
約 16% (50/300)
cpu.weight
コントローラーファイルの値はパーセンテージではありません。1 つのプロセスが実行を停止し、cgroup
g2
が実行中のプロセスのない状態になると、計算では cgroupg2
が省略され、cgroupsg1
およびg3
の重みだけが考慮されます。Expand サブ cgroup cpu.weight
ファイルCPU 時間の割り当て g1
150
約 75% (150/200)
g3
50
約 25% (50/200)
重要子 cgroup に複数の実行中のプロセスがある場合、cgroup に割り当てられた CPU 時間が、そのメンバープロセス間で均等に分配されます。
検証
アプリケーションが指定のコントロールグループで実行されていることを確認します。
cat /proc/33373/cgroup /proc/33374/cgroup /proc/33377/cgroup 0::/Example/g1 0::/Example/g2 0::/Example/g3
# cat /proc/33373/cgroup /proc/33374/cgroup /proc/33377/cgroup 0::/Example/g1 0::/Example/g2 0::/Example/g3
Copy to Clipboard Copied! Toggle word wrap Toggle overflow コマンド出力は、
Example/g*/
サブ cgroups で実行される指定されたアプリケーションのプロセスを示しています。スロットリングされたアプリケーションの現在の CPU 使用率を確認します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注記わかりやすくするために、すべてのプロセスを単一の CPU 上で実行しています。CPU の重みは、複数の CPU で使用される場合にも、同じ原則を適用します。
PID 33373
、PID 33374
、およびPID 33377
の CPU リソースは、子 cgroups に割り当てた 150、100、および 50 の重みに基づいて割り当てられたことに注意してください。重みは、各アプリケーションの CPU 時間の約 50%、33%、および 16% の配分に対応します。