Cpulimitでプロセスに対してCPUの使用制限をかける

Posted by 雅楽斎 on Wednesday, August 12, 2020

TOC

Linux上でのCPU制限

niceコマンド

UNIXでは古くからniceというコマンドを使って、nice値の操作を行うことで相対的なCPU使用制限をしてきました。使い方はnice コマンド名というように、単純に実行するコマンドをniceコマンドの引数に指定するだけでCPUの使用優先度を10下げるというお手軽なもので、複数の人が同時に使うホストで長時間かかるけど実行の優先度は低いような場合。具体的にはmakeが多かったですが、他のプロセスに対して優先度を下げることで、優先度の高いプロセスの邪魔をしないようにするために使っていました。

ちなみにniceで操作可能なプロセスの優先度は-20〜19の40段階1で、niceコマンドを付けて実行した場合は10で実行されます。nice -n 15 コマンド名とすることでコマンドの優先度を15下げることができます。また、優先度を上げたい場合はroot権限が必要です。

これから実行するコマンドではなく、現在実行中のプロセスのnice値を変更する場合はrenice -n 10 プロセスIDを実行することでnice値の変更は可能です。

また、niceコマンドに類似するコマンドとしてI/Oの負荷を相対的に変更するioniceというコマンドもLinuxにはあります。

nice値の変更ではなく、CPU使用を制限する

nice値の変更でもプロセスのCPU使用は制限されますが、あくまで他のプロセスに対するCPU使用率を制限するものであって、絶対的なCPU使用率を下げるものではありませんでした。2

絶対的なCPU使用率を下げたい場合の手段について、この記事ではCpulimitを紹介します。他にリソース使用を制限できるcgroupsも概要だけ紹介します。

Cpulimit

Cpulimitは特定のプロセスのCPU使用率を制限するコマンドで、「普段使いでは気にすることはないが特定のコマンドを実行するとCPU負荷が上がるのを避けたい」というユースケースに合致するコマンドです。

cgroups

cgroupsはCPU制限に限った仕組みではなく、複数のプロセスをグループ化し、グループ化したプロセスが使用するCPU、RAM、I/Oを制御する仕組みです。

Dockerをはじめとしたコンテナによるリソースの分離にも使われ、グループ化したプロセスの外に影響を及ぼさないように隔離する仕組みでもあります。

cgroupsを単体で使う場合、実行するプロセスを作成したプロセスグループに登録することでリソース制限を適用できますが、特定のプロセス実行で使用するには手順が多いため、今回は紹介のみとします。手順は以下のサイトに詳しく記載されています。

cgroupを使ってCPUとメモリの割り当てを制限する - 偏った言語信者の垂れ流し

cgroupを使ってCPUとメモリの割り当てを制限してみたけど、忘れてしまいそうなのでメモを残す。 試した環境はCentOS 6.4。 インストール CentOS6でcgroupを使うにはlibcgroupをインストール。 $ sudo yum install libcgroupcgconfigサービスを起動すると、/cgroup/ディレクトリが有効になる。自動で起動させるならchkconfigで設定。 $ sudo chkconfig cgconfig on $ sudo service cgconfig start 気にしそうなところ cpuやmemoryなど利用可能なサブシステムはOSに…

インストール&実行

それでは実際に使ってみましょう。確認環境はUbuntu 20.04 LTSです。

標準パッケージにcpulimitがあるのでインストールします。

# apt-get install cpulimit

これから実行するコマンドにCPU制限をかける(うまくいかない…)

$ cpulimit -e hoge.sh -l 80

どうやってみてもうまく行かないので、紹介のみに留めます。

実行中のプロセスID 5555にCPU制限をかける

$ cpulimit -p 5555 -l 80

この時に指定する-l上限にするCPUのパーセンテージですが、(今どきは一般的になっている)複数のCPUの場合はその上限がCPUコア数*100になります。4コアであれば上限は400です。単純にシングルスレッドのプログラムの場合は100よりも小さい数字を指定することで、使用するCPUの上限をその数字に指定できるということになります。

実際に高負荷のかかるプログラムがあるので、Cpulimitの適用有無で実行時間を計測してみます。

実測

まずCpulimitなしの場合

$ time ./hoge.sh
(中略)
real	1m45.221s
user	1m9.008s
sys	0m11.770s

続いてCpulimitでCPU制限を60にして実行した場合

$ time ./hoge.sh
(できるだけ早く別ターミナルからcpulimit -p 4129 -l 60を実行)
real	2m22.510s
user	1m7.142s
sys	0m7.734s

実行時間も当然長くなっていますが、topで表示されるCPU使用率も概ね55%〜65%で推移するようになり、全体のLoad Averageも低く抑えられるようになりました。

まとめ

CHUWIのMinibookは8インチの筐体にCore mを積んでいてパワフルではあるのですが、その分CPU負荷が高いとファンが轟音を発する為、特に図書館では使用できないレベルのうるささになります。

決まったコマンドの実行時のみ負荷が上がる3ことについてはCpulimitで対応が可能なので、使っていきたいところですね。

スポンサーリンク


  1. 数字が小さいほど優先度が上がる [return]
  2. CPUリソースに空きがあればガンガン使っていくスタイル [return]
  3. 一番顕著なのはEclipse上でmaven updateをする時 [return]

comments powered by Disqus