多くのユーザーがいるLinuxシステムを操作していますが、場合によっては乱用が発生します。ユーザーがCPU /メモリの80%以上を使用する単一のプロセスを実行する可能性がある場合。
それで、プロセスが使用できるCPU使用量を(たとえば、10%に)制限することで、これを防ぐ方法はありますか?私はcpulimit
を知っていますが、残念ながら、制限するように指示したプロセス(たとえば、単一プロセス)に制限を適用します。したがって、私の質問は、実行中のすべてのプロセスと、たとえば、ID /パスを指定する必要なしに将来実行されるプロセスに制限を適用するにはどうすればよいですか?
それはメモリの乱用になる可能性がありますが、CPUの場合ではありません。CPUがアイドル状態の場合、実行中のプロセス(「実行中」とは、プロセスがI/Oやその他を待機していないことを意味します)はデフォルトでは100%のCPU時間。そして、制限を強制する理由はありません。
これで、Nice
のおかげで優先度を設定できます。特定のユーザーのすべてのプロセスに適用する場合は、ログインシェルがNice
で実行されていることを確認するだけです。子プロセスはNice
の値を継承します。これは、ユーザーのログイン方法によって異なります。たとえば、 Prioritise ssh logins(Nice) を参照してください。
または、仮想マシンをセットアップすることもできます。実際、ユーザーがシステムを悪用して多くのプロセスを開始できるため、プロセスごとの制限を設定してもあまり意味がありません。仮想マシンでは、すべての制限が仮想マシンに対してグローバルになります。
別の解決策は、/etc/security/limits.conf
制限; limits.conf(5)のマニュアルページを参照してください。たとえば、ログインごとの最大CPU時間やログインごとの最大プロセス数を設定できます。ユーザーごとにmaxlogins
を1に設定することもできます。
ニース/レニス
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
Cgroupsを見ましたか?それらについて Arch Wiki にいくつかの情報があります。 cpu.shares
に関するセクションをお読みください。必要なことを行っているようで、ユーザーレベルで操作できるため、すべてのユーザープロセスを一度に制限できます。
メモリについては、あなたが探しているのはulimit -v
。 ulimit
は子プロセスによって継承されるため、ログイン時にユーザーのログインシェルにそれを適用すると、ユーザーのすべてのプロセスに適用されます。
すべてのユーザーがログインシェルとしてbash
を使用している場合は、次の行を/etc/profile
により、すべてのユーザープロセスに1ギガバイト(正確には100万キロバイト)のハード制限が設定されます。
ulimit -vH 1000000
オプションH
は、ハードリミットであることを確認します。つまり、ユーザーが後で設定することはできません。もちろん、ユーザーは一度に十分な数のプロセスを開始することにより、依然としてメモリを満たすことができます。
他のシェルの場合は、代わりに読み取る初期化ファイル(およびulimit
の代わりに使用する他のコマンド)を調べる必要があります。
CPUに関しては、あなたが望むことは私には意味をなさないようです。 1つのプロセスだけが実行されているときに、CPUの90%を未使用にしておくとどうなるでしょうか。あなたが本当に欲しいのはNice
(そしておそらくionice
)だと思います。 ulimit
と同様に、Nice
の値は子プロセスによって継承されるため、ログイン時にログインシェルに適用すれば十分です。これはionice
にも当てはまると思いますが、よくわかりません。
タグにはcentos
があるため、systemd
を使用できます。
たとえば、IDが1234
のユーザーを制限する場合:
Sudo systemctl edit --force user-1234.slice
次に、これを入力して保存します。
[Slice] CPUQuota=10%
次回ユーザーがログインしたときに影響があります。
マニュアルページ:systemctl
、systemd.slice
、systemd.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'