cgroupsのcpuサブシステムのcpu.sharesを使用して、
コントロールグループのタスクのCPU使用時間の優先度を設定します。
※CPU使用時間の優先度(配分)を設定するのであって上限を設定するものでないことに注意
異なる2つのコントロールグループ作成
groupAとgroupBの2つのコントロールグループを作成します。
# mount -t cgroup -o cpu none /cgroup/
# mkdir /cgroup/groupA
# mkdir /cgroup/groupB
タスクをコントロールグループに移動
CPU時間を浪費する2つのタスクtaskAとtaskBをバックグラウンド実行し、それぞれをgroupAとgroupBに登録します。
taskA、taskBの実体はCPU時間を浪費させるyesコマンドです。
$ ln -s /usr/bin/yes taskA
$ ln -s /usr/bin/yes taskB
$ ./taskA > /dev/null &
[1] 2249
# echo 2249 > /cgroup/groupA/tasks
$ ./taskB > /dev/null &
[2] 2263
# echo 2263 > /cgroup/groupB/tasks
CPU使用優先度設定をしない場合
topコマンドでtaskAとtaskBのCPU使用率を確認します。
$ top
top - 01:01:49 up 5 min, 1 user, load average: 1.85, 0.89, 0.36
Tasks: 65 total, 3 running, 62 sleeping, 0 stopped, 0 zombie
%Cpu(s): 99.0 us, 0.6 sy, 0.0 ni, 0.0 id, 0.0 wa, 0.0 hi, 0.3 si, 0.0 st
KiB Mem: 447284 total, 54608 used, 392676 free, 8560 buffers
KiB Swap: 102396 total, 0 used, 102396 free, 24340 cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
2249 pi 20 0 3192 528 456 R 49.3 0.1 1:44.16 taskA
2263 pi 20 0 3192 528 456 R 49.3 0.1 1:01.97 taskB
(以下略)
taskAとtaskBが半々の割合でCPU時間を消費しています。
CPU使用優先度設定をする場合
今回はgroupA(taskA)とgroupB(taskB)のCPU使用割合を3:1に設定します。
# echo 768 > /cgroup/groupA/cpu.shares
# echo 256 > /cgroup/groupB/cpu.shares
期待された割合になっているか確認します。
$ top
top - 01:03:08 up 6 min, 1 user, load average: 2.02, 1.18, 0.50
Tasks: 64 total, 3 running, 61 sleeping, 0 stopped, 0 zombie
%Cpu(s): 98.4 us, 1.3 sy, 0.0 ni, 0.0 id, 0.0 wa, 0.0 hi, 0.3 si, 0.0 st
KiB Mem: 447284 total, 54724 used, 392560 free, 8612 buffers
KiB Swap: 102396 total, 0 used, 102396 free, 24340 cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
2249 pi 20 0 3192 528 456 R 73.8 0.1 2:27.39 taskA
2263 pi 20 0 3192 528 456 R 24.7 0.1 1:35.26 taskB
(以下略)
設定した割合でCPU時間が配分されました。