25.2. CPU の重みの調整によるアプリケーションへの CPU 時間配分の制御
特定の cgroup ツリーの下にあるアプリケーションへの CPU 時間の配分を調整するには、cpu
コントローラーの関連ファイルに値を割り当てる必要があります。
前提条件
- root 権限がある。
- CPU 時間の配分を制御するアプリケーションがある。
次の例のように、
/sys/fs/cgroup/
root control group 内に、child control groups グループの 2 階層を作成しました。… ├── Example │ ├── g1 │ ├── g2 │ └── g3 …
-
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
アプリケーションの 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 のメンバーになり、それらの cgroup の設定に従って CPU 時間を分散させることを保証します。実行中のプロセスを持つサブ cgroups(
g1
、g2
、g3
) の重みは、親 cgroup のレベルで合算されます (例
)。その後、CPU リソースはそれぞれの重みに基づいて相対的に配分されます。その結果、すべてのプロセスが同時に実行されると、カーネルはそれぞれの cgroup の
cpu.weight
ファイルに基づいて、それぞれのプロセスに比例配分の CPU 時間を割り当てます。サブ 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
の重みだけが考慮されます。サブ cgroup cpu.weight
ファイルCPU 時間の割り当て g1
150
~ 75% (150/200)
g3
50
~ 25% (50/200)
重要サブ cgroup に複数の実行中のプロセスがある場合は、それぞれの cgroup に割り当てられる CPU 時間は、その cgroup のメンバープロセスに均等に配分されます。
検証
アプリケーションが指定のコントロールグループで実行されていることを確認します。
# cat /proc/33373/cgroup /proc/33374/cgroup /proc/33377/cgroup 0::/Example/g1 0::/Example/g2 0::/Example/g3
コマンド出力は、
Example/g*/
サブ cgroups で実行される指定されたアプリケーションのプロセスを示しています。スロットリングされたアプリケーションの現在の 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 の重みは、複数の CPU で使用される場合にも同じ原則を適用します。
PID 33373
、PID 33374
、およびPID 33377
の CPU リソースは、対応するサブ cgroups に割り当てた重み 150、100、50 に基づいて割り当てられたことが分かります。重みは、各アプリケーションの CPU 時間の約 50%、33%、および 16% の配分に対応します。
関連情報
- コントロールグループについて
- Linux カーネルリソースコントローラーとは
- cgroups-v2 ファイルシステムでの cgroup の作成とコントローラーの有効化
- Resource Distribution Models
-
cgroups(7)
、sysfs(5)
の man ページ