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を単体で使う場合、実行するプロセスを作成したプロセスグループに登録することでリソース制限を適用できますが、特定のプロセス実行で使用するには手順が多いため、今回は紹介のみとします。手順は以下のサイトに詳しく記載されています。
インストール&実行
それでは実際に使ってみましょう。確認環境は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で対応が可能なので、使っていきたいところですね。
スポンサーリンク
comments powered by Disqus