こんにちは 北川です。
この記事はTECHSCORE Advent Calendar 2014、17日目の記事です。
ちょっとした案件で、CPUに制限をかける必要があり
cgroups を使ってみましたので紹介したいと思います。
cgroupsとは control groupsの略でプロセスグループごとにCPUやメモリ・ディスクI/Oなどの利用を制限できるLinuxカーネルの機能です。
cgroup cgred
前提としてOSはCentOS7でお話します。
また、説明簡略化のため基本 root ユーザで操作しています。
cgroup を利用するために libcgroup と libcgroup-tools パッケージをインストールする必要があります。
CentOS7(RHEL 7系)から libcgroup-toolsが追加で必要となっているので注意してください。
1 2 |
yum install libcgroup yum install libcgroup-tools |
今回はcgconfig.confを使って制限を掛けました。
cgcreate を使って設定する方法もありますが今回はcgconfig.confを使います。
1 |
vi /etc/cgconfig.conf |
cgconfig.confに下記の設定を追加します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
# test group を作成。 group test { perm { #kitagawa userが task を設定できるように。 task { uid = kitagawa; gid = kitagawa; } #その他の設定は root user が設定できるように。 admin { uid = root; gid = root; } } #CPUの割り当てが50%となるように設定。 cpu { cpu.cfs_quota_us = 500000; cpu.cfs_period_us = 1000000; } } |
今回は kitagawa ユーザに対して制限したかったためcgredを使います。
cgred は、/etc/cgrules.conf で設定に従ってタスクを cgroups に移動するデーモンです。
1 |
vi /etc/cgrules.conf |
cgrules.conf に下記の設定を追加します。
1 |
kitagawa cpu test/ |
起動と自動起動
cgconfig,cgredの起動を行います。また、合わせて自動起動の設定も行います。
1 2 3 4 5 6 7 8 9 |
# cgconfig起動 systemctl start cgconfig # cgconfigの自動起動 systemctl enable cgconfig # cgredの起動 systemctl start cgred # cgredの自動起動 systemctl enable cgred |
結果確認
今回の場合、kitagawaユーザのすべてのプロセスが対象となります。
tasks ファイルに対象となったプロセスIDが記載されますので複数のプロセスが
制限の対象であることを確認できます。
1 |
cat /sys/fs/cgroup/memory/test/tasks |
実際にCPUに負荷をかけ制限が掛かっているか確認します。
1 2 3 4 |
su - kitagawa cat /dev/zero > /dev/null & top |
1 2 |
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 12894 kitagawa 20 0 107912 620 516 R 48.2 0.1 0:19.62 cat |
ピッタシとはなりませんでしたがCPU処理が50%で制限されているのが確認できました。
まとめ
最初に記載しましたが、cgroupsはCPUの他にもメモリ・ディスクI/Oなども制限をかけることができます。
今回は
その他の設定をする場合は参照してもらえればと思います。