他のCPU集約命令を実行するbashスクリプトがあります。
cpulimit
bashスクリプトに適用すると、top
スクリプト内のコマンドを表示するプロセスの出力は影響を受けずに実行され続けますcpulimit
。 bashスクリプト内でコマンドのCPU使用量を制限する方法を知りたいです。
答え1
によるとcpulimit --help
:
-i, --include-children limit also the children processes
私はこれが子供たちに働くかどうかをテストしませんでした。
cgroups
あるいは、カーネル関数であるものを使用することもできます。
Cgroup自体は子プロセスを制限する方法を提供しませんが、libcgroupが提供するcgルールエンジンデーモン(cgred)を使用できます。cgexec
libcgroupパッケージのコマンドとコマンドは、ルールが子プロセスにも適用されるフラグを提供します。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-time
fifo
batch
たとえば、巨大なプロセスを開始できますchrt -r -p 99 process
。このプロセスはすべてのリソースを消費します。
同様に、大規模なデーモンプロセスは「バックグラウンドで」ソフト実行できます。chrt -r -p 0 process
つまり、システムリソースが使用中の場合は別のプロセスを待ちます。
それにもかかわらず、始める前にお読みくださいman chrt
。man ionice
たとえば、私はrtorrent
p2pを使用します。私のシステムでは、優先順位が最も低いタスクで、次のように起動します。
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でテストされました。完璧に動作します。