標準の GNU/Linux ツールを使用してプロセス グループの CPU 消費を制限するにはどうすればよいでしょうか?

標準の GNU/Linux ツールを使用してプロセス グループの CPU 消費を制限するにはどうすればよいでしょうか?

同じ名前のプロセスが多数あり、CPU 時間の 100% を占めています。これを 50% 以下に抑えたいです。

追加のソフトウェアをインストールせずにこれを実行するにはどうすればよいですか?

答え1

これを実現するカーネルレベルのメカニズムについては、Linuxについて調べる必要があります。コントロールグループこれはまだ活発に開発が行われている分野なので、読んだ内容が現在使用しているカーネル(またはインストールしようとしているカーネル)と一致していることを確認する必要があります。

追加のインストールは不要とおっしゃっていますが、cgred名前が一致するプロセスを CPU cgroup に自動的に移動するには、インストールすることを検討してください。Debian では、これはパッケージに含まれていますcgroup-bin

答え2

STOP および CONT シグナルを使用して、bash shell、sleep、pgrep、pkill コマンドでこれを行うことができます。

次のワンライナーにより、プロセスは利用可能な CPU 時間の合計の最大 50% を使用するようになります。100 ミリ秒ごとに実行され、その後 100 ミリ秒間停止します。

while [ True ]; do pkill -STOP processname; sleep 0.1s; pkill -CONT processname; sleep 0.1s; done

読みやすくするために同じコードを複数行に分割したものを次に示します。

while [ True ]
     do pkill -STOP processname
     sleep 0.1s
     pkill -CONT processname
     sleep 0.1s
done

プロセス名パターンに一致するプロセスがいくつ存在しても、それらはすべて同時に停止および再開されるため、CPU 使用率が 50% を超えることはできません。つまり、アクティブなときに、利用可能な CPU 時間をそれらの間で共有する必要があるということです。これにより、制限が満たされることが保証されます。

ほぼ同じことを実行する cpulimit というプログラムがあります。

答え3

追加のソフトウェアをインストールしなくてもnice、値の範囲は-2019

nice -20 some_command

与えるsome_command最優先事項、 そして

nice 19 some_command

与えるsome_command最低優先度

答え4

上記のように、OOMキラーを支援するスクリプトとして、またはその使用を防ぐこともできます。

たとえば、CPU 全体が x 分間 75% に達したら、pkill.sh を実行します。

 ../scripts/boottime/OOMkiller.sh

while [ true] ; 
    do  inxi -tcm5 > ~/cpu.log 
    sleep 0.5s 
    inxi -tcm5 >> ~/cpu/log | diff -m > ~/offender.log
done

for i in offender.log ;
    do ./scripts/pkill.sh
done

 ../scripts/pkill.sh
while [true] 
    do pgrep $(i) -STOP $PID
    pkill -STOP $PID
    sleep 0.5s 
    pkill -CONT $PID
done

関連情報