他のコマンドを実行するbashスクリプトのcpulimit

他のコマンドを実行するbashスクリプトのcpulimit

他のCPU集約命令を実行するbashスクリプトがあります。

cpulimitbashスクリプトに適用すると、topスクリプト内のコマンドを表示するプロセスの出力は影響を受けずに実行され続けますcpulimit。 bashスクリプト内でコマンドのCPU使用量を制限する方法を知りたいです。

答え1

によるとcpulimit --help

-i, --include-children limit also the children processes

私はこれが子供たちに働くかどうかをテストしませんでした。


cgroupsあるいは、カーネル関数であるものを使用することもできます。

Cgroup自体は子プロセスを制限する方法を提供しませんが、libcgroupが提供するcgルールエンジンデーモン(cgred)を使用できます。cgexeclibcgroupパッケージのコマンドとコマンドは、ルールが子プロセスにも適用されるフラグを提供します。cgclassify--sticky

競合状態が関連していることに注意してください。できる(少なくとも理論的には)いくつかのサブプロセスが正しく調整されないようにします。しかし、現在cpulimitユーザースペースで実行されているコマンドを使用しているので、すでに100%信頼できるCPU制限はないため、この競争条件は取引を妨げてはいけません。

私はここで私自身の答えでCGルールエンジンデーモンを詳しく扱っています。

答え2

おそらくそれはできません。

cpulimitロジックは簡単です。プロセスのpidを取得し、単に信号を送信しkill -STOP $PID、再kill -CONT $PID、再、再、再送信します。

そして、CPU使用量を測定してSTOPとCONTの間の遅延を計算します。

あなたの場合、pstree複雑なbashスクリプトはコンソール画面のN * xを占めます。

Bashスクリプトやバイナリ実行可能ファイルのCPU使用率を減らす別の方法を提案します。

1)nice- プロセスをインポートし、優先順位を-20(最も高い優先順位)から20(最も低い優先順位)に上げ下げします。おそらくあまりにも低音です。そのため、2つのユーティリティとカーネルフックがさらに登場しました。

2) ionice- おそらく第2世代でしょうnice。 0(最低優先順位)から7(最高優先順位)まで、優先順位別にプロセスを区別できます。また、プロセスをカテゴリ別にLive(最も高い)、best-efforts(中)、Idle(最も低い)、およびなし(デフォルト)に分割できます。

3)chrt- 私が見たものの中で最も高いもの、それはそのプロセスの力cpulimitと支配力に似ています。ここでは、優先順位カテゴリ(idle、、、、など)も表示され、優先順位の範囲は1から99まで非常に大きいです。real-timefifobatch

たとえば、巨大なプロセスを開始できますchrt -r -p 99 process。このプロセスはすべてのリソースを消費します。

同様に、大規模なデーモンプロセスは「バックグラウンドで」ソフト実行できます。chrt -r -p 0 processつまり、システムリソースが使用中の場合は別のプロセスを待ちます。

それにもかかわらず、始める前にお読みくださいman chrtman ionice

たとえば、私はrtorrentp2pを使用します。私のシステムでは、優先順位が最も低いタスクで、次のように起動します。

nice -n 20 chrt -i 0 ionice -c3 /usr/bin/rtorrent

あるいは、Hooks&haksアプローチを使用することもできます。そして、独自の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

追加する

# 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

答え3

今私にとって最善の方法は、次のようなスクリプトを実行することです。CPU制限バックグラウンド制御プロセスアクベント:

#!/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.

スクリプトで使用されているプロセスを編集して実行してみてください。CPU制限バックグラウンドで実行され、調査されたプロセスを監視し、使用を制限します。プロセスが完了したらCPU制限再度有効にすると、残りのプロセスが制限されます。

(ターミナルでforループを介してffmpegを実行しようとしたときに奇妙な問題に遭遇しました。これにより、逆説的に2つのffmpegインスタンスが作成され、CPUlimit'ingがほとんど役に立たなくなりました。私の質問に対する答えが見つかりません。したがって、「ただ for ループ」であっても、そのためのスクリプトを書きたいと思うかもしれません。 )

答え4

cpulimit -l 50 ffmpegエイリアスを設定してみました。.bashrc

alias ffmpegl = "cpulimit -l 50 ffmpeg"

次に、私のスクリプトで使用し、次のコードを使用してエイリアスを取得します。

shopt -s expand_aliases
source /home/your_user/.bashrc

これで、cpulimitとffmpegを使用して、スクリプト内のどこでもエイリアスを使用して複数のコマンドを実行できます。 Scientific Linux 6.5でテストされました。完璧に動作します。

関連情報