CPU使用率の10%を超えないようにプロセスを制限する


32

私は多くのユーザーがいるLinuxシステムを運用していますが、時には乱用が発生します。ユーザーがCPU /メモリの80%以上を使用する単一のプロセスを実行する場合。

プロセスが使用できるCPU使用量を制限することで(たとえば10%に)、これを防ぐ方法はありますか?私は知っていますがcpulimit、残念ながら、制限するように指示したプロセス(たとえば、単一のプロセス)に制限を適用します。私の質問は、実行中のすべてのプロセスと、たとえばID /パスを提供する必要なしに将来実行されるプロセスに制限を適用するにはどうすればよいですか?


パフォーマンスの問題が発生していますか?それとも単に気にするのは数字ですか?
ctrl-alt-delor 14

@richardのパフォーマンスの問題のため、CPUを大量に使用していると思われるプロセスを強制終了/制限/終了しようとしていましたが、bashスクリプトを作成することで既にそうしていました。これが役立つ場合、これも仮想マシンです
ジョヴァンニ・ムーニル14

2
非常に短い時間で100%になる可能性のあるプロセス、およびシステムプロセスを強制終了することに注意してください。cpulimit検索スクリプトと組み合わせて検討してください。ポリシーを作成し、の使用を推奨してからcpulimit、10%以上を検索してから5%に制限します(したがって、ユーザーはを使用することをお勧めしますcpulimit)。また、1人のユーザーの合計で10%を超える複数のプロセスを検出できることを確認してください。
ctrl-alt-delor 14

@richardこれらすべての非常に有用なコメントをありがとうリチャード!彼らは私を大いに助けてくれました!使用する提案cpulimitは、ユーザーが後で再起動できるため(コメントの1つに示されているように)、単にプロセスを強制終了するよりもはるかに優れています。ありがとうございました!
ジョヴァンニムニール14

回答:


20

メモリの乱用になる可能性はありますが、CPUの場合ではありません。CPUがアイドル状態のとき、実行中のプロセス(「実行」により、プロセスはI / Oまたは他の何かを待機していません)デフォルトでは100%のCPU時間。そして、制限を実施する理由はありません。

これで、のおかげで優先順位を設定できますnice。特定のユーザーのすべてのプロセスにそれらを適用する場合は、ログインシェルが実行されることを確認する必要があります。nice子プロセスはnice値を継承します。これは、ユーザーのログイン方法によって異なります。たとえば、sshログインの優先順位付け(適切)を参照してください。

または、仮想マシンをセットアップできます。実際、プロセスごとの制限を設定することは、ユーザーが多くのプロセスを開始してシステムを乱用する可能性があるため、あまり意味がありません。仮想マシンでは、すべての制限が仮想マシンに対してグローバルになります。

別の解決策は、/etc/security/limits.conf制限を設定することです。limits.conf(5)のマニュアルページを参照してください。たとえば、ログインごとの最大CPU時間および/またはログインごとのプロセスの最大数を設定できます。maxloginsユーザーごとに1に設定することもできます。


1
@GiovanniMounir意味:ユーザーごとに1つの仮想マシン。
vinc17 14

1
残念ながら、これはリソースを消費し、ユーザーがいくつかの一般的な開発パッケージの使用を必要とする可能性があるため、実際の目的にはあまり役立ちません。すべての新しいマシンにインストールするわけではありません。そのままにして、bashスクリプトで自動的に監視する方が良いと思います。
ジョヴァンニムニール14

1
@GiovanniMounir複数の仮想マシン間でパーティションを共有できます。
vinc17 14

@GiovanniMounir LXCまたはDockerを使用して、仮想化オーバーヘッドをほぼゼロに減らすことができます。また、「好き」は強い理由ではありません。たとえば、共有PHPホストを管理している場合は、LXCまたは仮想マシンを実行するために、$ 15 / $ 5のライセンスソフトウェアの書き直しが必要になるため、ソリューションを使用します。
プーヤンKhosravi 14

私の理解では、ナイスは他のプロセスと比較して相対的なCPUのみを設定します。他のプロセスがCPUを使用していない場合、プロセスは10%に制限されず、100%CPUを使用します。
ジョニー、なぜ

25

ナイス/レニス

nice システムの「ワンオフ」微調整に最適なツールです。

 nice COMMAND

cpulimit

cpulimit CPUを集中的に使用するジョブを実行する必要があり、システムの応答性のためにCPU時間を空けることが不可欠である場合。

cpulimit -l 50 COMMAND

cgroups

cgroups 1つだけではなく、一連のプロセスに制限を適用する

cgcreate -g cpu:/cpulimited
cgset -r cpu.shares=512 cpulimited
cgexec -g cpu:cpulimited COMMAND_1
cgexec -g cpu:cpulimited COMMAND_2
cgexec -g cpu:cpulimited COMMAND_3

資源

http://blog.scoutapp.com/articles/2014/11/04/restricting-process-cpu-usage-using-nice-cpulimit-and-cgroups


5
他のプロセスが実行されていない場合でも、CPU使用率のハード制限を設定するためにお探しの方、見ためのcpu.cfs_quota_usパラメータ(参照マニュアル
ディエゴ・

cgroupは... systemdにディレクティブに感謝を使用し、最良の選択肢である、そのためのユニットシステムまたはユーザーのいずれかを作成するのが容易である
イヴ・マーティン

実行中のプロセスの例:sudo cgclassify -g cpu:cpulimited 2315444
Aquarius Power

1
私の理解では、ナイスは他のプロセスと比較して相対的なCPUのみを設定します。他のプロセスがCPUを使用していない場合、プロセスは10%に制限されず、100%CPUを使用します。
ジョニー、なぜ

10

cgroupsを見ましたか?にいくつかの情報がありますArch Wikiにはそれらについてのます。についてのセクションを読むと、cpu.shares必要なことを実行しているように見え、ユーザーレベルで操作できるため、すべてのユーザープロセスを一度に制限できます。


ただし、CGroupsを使用する方法です。また、(多くの)共有コンピューターサーバーを実行し、cgroupを使用して、ログインセッション全体が使用できるコアの最大数を制限します。このようにして、その人が新しいプロセスを開始し続けると、それぞれがより小さなスライスを取得します。メモリ使用についても同じです。pam_cgroupsおよびcgrulesengdサービスを使用して、ユーザーを自動的にcgroupに入れることができます。cgconfigファイルで「テンプレート」を使用して、各ユーザーを独自のcgroupに入れることができます。cgrulesengdは、プロセスを強制終了する代わりに、各プロセスが正しいcgroupにあることを確認する以外は、スクリプトのように動作します。
jsbillings

リソースの使用を制限するためにcgroupsを使用しない場合でも、各リソースの「stat」ファイルを確認することにより、個人が使用しているリソースの量を評価し、5分間のスクリプトにその情報を使用できます。
jsbillings 14

3

メモリについては、探しているのはulimit -vです。注ulimitログイン時のユーザーのログインシェルにそれを適用した場合、それは彼のすべてのプロセスに適用されるので、子プロセスに継承されます。

すべてのユーザーがbashログインシェルとして使用する場合、次の行を/etc/profileすると、すべてのユーザープロセスに1ギガバイト(厳密には100万キロバイト)のハード制限が設定されます。

ulimit -vH 1000000

このオプションHは、ハードリミットであることを確認します。つまり、ユーザーは後でそれを設定することはできません。もちろん、十分な数のプロセスを一度に開始することで、ユーザーはメモリをいっぱいにすることができます。

他のシェルの場合は、代わりに読み取る初期化ファイル(および、 ulimit、使用する)。

CPUについては、あなたが望むものは私には意味がないようです。1つのプロセスのみが実行されている場合、CPUの90%を未使用にするとどうなりますか?あなたが本当に欲しいのはnice(そしておそらくionice)だと思います。のようにulimitnice値は子プロセスに継承されるため、ログイン時にログインシェルに値を適用するだけで十分です。これも当てはまると思いますがionice、よくわかりません。


メモリの提案をありがとう!ログイン時にユーザーのログインシェルにこれを適用する例を示すことができますか?私はこれをどうやってやるかわからない。また、十分に明確でないことも残念です。私がやろうとしているのは、CPUの10%以上をプロセスが使用できないようにすることです。だから、これを行うのにnice十分だと思いますか?もしそうなら、あなたは私にこれを達成するための例を示すことができると思いますか?
ジョヴァンニムニール14

1つのプロセスのみが実行されている場合、CPUを90%アイドル状態に維持する意味はまだありません。
celtschk 14

1
現在同時に実行されているプロセスが10未満の場合(実行することは、ユーザー入力やディスクI / Oを待つだけでなく、実際に実行することを意味します)、それらの1つがCPUの10%を超えることが事実上保証されます。そうしないと、CPUは実質的にアイドル状態になります。また、10%を超えるプロセスを強制終了する場合は、強制終了する多くのユーザーがいるはずです。または、少なくとも、あなたはそうではないので、それらの数字が何を意味するかについての手掛かりを持っている誰かにあなたを置き換えさせようとします。
celtschk 14

@celtschkのコメントとは対照的に、11個以上のプロセスが実行されている場合(cpuバウンド)、それらは9.09%未満になります。したがって、CPU使用率が10%を超えるシステムのユーザーであれば、11以上のプロセスを実行し、レーダーの下に隠れることができます。
ctrl-alt-delor 14

@richardあなたは正しいです、おそらくスクリプトがユーザーが使用するメモリ/ CPUの合計量を合計し、パーセンテージが特定の量に達するとこのユーザーのすべてのプロセスを終了するのが良いでしょうout)
ジョヴァンニ・ムーニル14

3

cpulimitはあなたのケースでは実用的ではないと述べているので、nicerenice、およびtasksetを確認することをお勧めします。これは、達成したいものに近いかもしれませんが、tasksetではプロセスのCPUアフィニティを設定できます。あなたの場合、すぐには役に立たないかもしれません。


1
niceそしてrenice?それはすばらしい!私は彼らのマニュアルページを見ましたが、あなたはまだプロセスIDを設定しなければならないので、彼らがこれを助けることができるとはまだ思いません。ただし、実行中のすべてのプロセス/将来のプロセスに制限を適用するためにこれらのパッケージを使用する例を挙げてください!
ジョヴァンニムニール14

1

タグにはがあるため、centos使用できますsystemd

たとえば、次のIDのユーザーを制限する場合1234

sudo systemctl edit --force user-1234.slice

次に、これを入力して保存します。

[Slice] CPUQuota=10%

次回ユーザーがログインすると、影響を受けます。

manページ:systemctlsystemd.slicesystemd.resource-control...


0

既に開始されているプロセスを制限する場合は、PIDごとに1つずつ行う必要がありますが、以下のようなバッチスクリプトを使用してそれを行うことができます。

#!/bin/bash
LIMIT_PIDS=$(pgrep tesseract)   # PIDs in queue replace tesseract with your name
echo $LIMIT_PIDS
for i in $LIMIT_PIDS
do
    cpulimit -p $i -l 10 -z &   # to 10 percent processes
done

私の場合pypdfocr、欲張りを起動しますtesseractます。

また、CPUが非常に優れている場合には、次のreniceように使用できます。

watch -n5 'pidof tesseract | xargs -L1 sudo renice +19'
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.