他のコマンドを実行するbashスクリプトのcpulimit
On 2月 10, 2021 by admin他のcpuを多用するコマンドを実行するbashスクリプトがあります。
適用する場合bashスクリプトのcpulimit
で、top
の出力は、スクリプト内のコマンドのプロセスが。 bashスクリプト内のコマンドのCPU使用率を制限するにはどうすればよいですか?
回答
cpulimit --help
によると:
-i, --include-children limit also the children processes
これが子の子に適用されるかどうかはテストしておらず、実装方法も調べていません。
または、cgroups
」。
Cgroupsは、子プロセスを制限する手段もネイティブに提供しませんが、提供されているcgルールエンジンデーモン(cgred)を使用できます。 libcgroupによる; libcgroupパッケージからのcgexec
およびcgclassify
コマンドは、--sticky
を提供します。ルールを子プロセスにも適用するためのフラグ。
(少なくとも理論的には)一部の子プロセスが正しく制限されない可能性があるレース条件が関係していることに注意してください。 。ただし、とにかくユーザースペースで実行されるcpulimit
を現在使用しているため、100%信頼できるCPUリミはすでにありません。
ここでの自己回答で、cgルールエンジンデーモンについてかなり広範囲に記述しました:
回答
おそらく、できません。
cpulimit
のロジックは非常に単純で、プロセスのpidと単純な送信が必要です。その信号kill -STOP $PID
、その後kill -CONT $PID
、そして何度も何度も何度も何度も……
そしてcpu-usageを測定してSTOPとCONTの間の遅延を計算します。
あなたの場合、複雑なbashスクリプトのpstree
はN * xを取りますコンソールの画面。
bashスクリプトまたはバイナリ実行可能ファイルのCPU使用率をダウングレードする別の1つの方法を提案できます。
1)nice
-取得プロセスと優先度を-20(最高の優先度)から20(最低の優先度)に増減します。おそらく低すぎるダイアパソンでは、そのため、別の2つのユーティリティとカーネルフックが表示されます:
2)ionice
-おそらく第2世代のnice
。プロセスは、0(最低の優先度)から7(最高の優先度)までの優先度で分けることができます。 さらに、プロセスをクラス、リアルタイム(最高)、best-efforts
(中)、アイドル(最低)、なし(デフォルト)で区切ることができます。
3)chrt
-私が今まで出会った中で最高のもので、その力とcpulimit
に似ています。プロセスの支配。ここでは、優先度のクラスidle
、real-time
、fifo
、
など…そして優先度のダイアパソンは1から99まで非常に大きいです。
たとえば、-そしてそれはあなたのすべてのリソースを消費します。
同様に、巨大なデーモンはchrt -r -p 0 process
を使用して「バックグラウンド」でソフトに動作する可能性があります。システムのリソースがビジーの間、他のすべてのデーモンを待機します。
とにかく、始める前にman chrt
とman ionice
を読むことを強くお勧めします。
たとえば、p2pにrtorrent
を使用しています。これは私のシステムにとって最も優先度の低いタスクであり、次のように起動します:
nice -n 20 chrt -i 0 ionice -c3 /usr/bin/rtorrent
または、フックを取ることができます&方法があります。独自のcpulimit_wrapperスクリプトを作成します。例:
# cat bash_script.sh #!/bin/bash while sleep 0; do find / dd if=/dev/random of=/tmp/random.bin bs=1M count=1000 done
plus
# cat cpulimit.sh #!/bin/bash TARGET=$1 [ -z "$TARGET" ] && echo "Usage bash cpulimit.sh command" && exit 1 cpulimit -l 1 bash $TARGET while sleep 0;do lsof -n -t $TARGET | xargs pstree -p | sed -e "s/(/(\n/g" | sed -e "s/)/\n)/g" | egrep -v "\(|\)" | while read i; do echo $i; cpulimit -l 1 -b -p $i; done done
回答
今、私にとって最善の方法は、 cpulimit <を許可するスクリプトを実行することでした。 / em> Askubuntu からバックグラウンドでプロセスを制御します:
#!/bin/bash #The first variable is to set the number of cores in your processor. The reason that the number of cores is important is that you need to take it into consideration when setting cpulimit"s -l option. This is explained on the cpulimit project page (see http://cpulimit.sourceforge.net/): "If your machine has one processor you can limit the percentage from 0% to 100%, which means that if you set for example 50%, your process cannot use more than 500 ms of cpu time for each second. But if your machine has four processors, percentage may vary from 0% to 400%, so setting the limit to 200% means to use no more than half of the available power." NUM_CPU_CORES=$(nproc --all) #Automatically detects your system"s number of CPU cores. cpulimit -e "ffmpeg" -l $((50 * $NUM_CPU_CORES))& #Limit "ffmpeg" process to 50% CPU usage. cpulimit -e "zero-k" -l $((50 * $NUM_CPU_CORES))& #Limit "zero-k" process to 50% CPU usage. cpulimit -e "mlnet" -l $((50 * $NUM_CPU_CORES))& #Limit "mlnet" process to 50% CPU usage. cpulimit -e "transmission-gtk" -l $((50 * $NUM_CPU_CORES))& #Limit "transmission-gtk" process to 50% CPU usage. cpulimit -e "chrome" -l $((40 * $NUM_CPU_CORES))& #Limit "chrome" process to 40% CPU usage.
プロセスを編集しますスクリプトで使用され、実行されます。 cpulimit はバックグラウンドで実行され、要求されたプロセスを監視してその使用を制限します。いずれかのプロセスが終了しても、 cpulimit はそのまま残ります。プロセスが再び稼働する場合は、プロセスを制限します。
(ターミナルのforループでffmpegを実行しようとすると、奇妙な問題が発生しました。これにより、逆説的に2つのffmpegインスタンスが生成され、cpulimitがほぼuになりました。セレス。 問題の答えが見つかりませんでした。したがって、「単なるforループ」であっても、次のスクリプトを作成する必要がある場合があります。この。)
回答
-P
パラメーターを使用し、絶対パスを実行可能ファイル。
回答
ivでcpulimit -l 50 ffmpeg
のエイリアスを設定してみましたid = “36a9bc86fe”>
alias ffmpegl = "cpulimit -l 50 ffmpeg"
次に、次のコードを使用してスクリプトでエイリアスを取得するために使用しました
shopt -s expand_aliases source /home/your_user/.bashrc
これで、エイリアスを使用する複数のコマンドに対して、スクリプト内の任意の場所でffmpegとともにcpulimitを使用できます。 Scientific Linux6.5でテスト済み。完全に機能します。
。