web-dev-qa-db-ja.com

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

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

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

33
Giovanni Mounir

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

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

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

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

20
vinc17

ニース/レニス

Niceは、システムへの「1回限りの」微調整に最適なツールです。

 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
http://manpages.ubuntu.com/manpages/xenial/man1/cpulimit.1.html

27
RafaSashi

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

11
Paul Schyska

メモリについては、あなたが探しているのはulimit -vulimitは子プロセスによって継承されるため、ログイン時にユーザーのログインシェルにそれを適用すると、ユーザーのすべてのプロセスに適用されます。

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

ulimit -vH 1000000

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

他のシェルの場合は、代わりに読み取る初期化ファイル(およびulimitの代わりに使用する他のコマンド)を調べる必要があります。

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

4
celtschk

あなたの場合、cpulimitは実用的ではないと述べているので、 Nicerenice 、および taskset を確認することをお勧めします。タスクセットではプロセスのCPUアフィニティを設定できるため、達成したいことに近づくため、すぐには役に立たない場合があります。

3
R J

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

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

Sudo systemctl edit --force user-1234.slice

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

[Slice] CPUQuota=10%

次回ユーザーがログインしたときに影響があります。

マニュアルページ:systemctlsystemd.slicesystemd.resource-control...

既に開始されているプロセスを制限する場合は、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'
0