web-dev-qa-db-ja.com

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

私は同じ名前のプロセスをたくさん持っています-それらは私のCPU時間の100%を占めます、私はこれが50%以下であることを望みます。

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

4
unfa

このためのカーネルレベルのメカニズムについては、Linuxで調べる必要があります コントロールグループ 。これはまだ活発に開発されている領域であるため、読んだ内容が現在のカーネルと一致している(またはインストールする意思がある)ことを確認する必要があります。

追加のものをインストールしないと言ったとしても、cgredをインストールして、名前が一致するプロセスをCPUcgroupに自動移動することを検討してください。 Debianでは、これはcgroup-bin パッケージ。

4
Toby Speight

これは、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
unfa

追加のソフトウェアをインストールしなくても、Niceがあります。値の範囲は-2から19です。

Nice -20 some_command

some_commandthe 最高の優先度を与え、そして

Nice 19 some_command

some_commandthe 最低優先度を与えます。

2
jcbermu

上記のように、OOM-killerを支援したり、その使用を防止したりするためのスクリプトとして使用できます。

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
0
linuxdev2013