다른 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) ionice
- 아마도 2세대일 것입니다 nice
. 0(최저 우선순위)부터 7(최고 우선순위)까지 우선순위별로 프로세스를 구분할 수 있습니다.또한 프로세스를 범주별로 Live(가장 높음), best-efforts
(중간), Idle(가장 낮음) 및 없음(기본값)으로 구분할 수 있습니다.
3) chrt
- 내가 본 것 중 가장 높은 것, 그것은 cpulimit
그 과정에 대한 힘과 지배력을 닮았다. 여기서는 우선순위 범주( idle
, real-time
, fifo
, 등) 도 볼 수 있으며 batch
우선순위 범위는 1에서 99까지 매우 큽니다.
예를 들어, 거대한 프로세스를 시작할 수 있습니다 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를 실행하려고 할 때 이상한 문제에 부딪혔습니다. 이로 인해 역설적으로 두 개의 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에서 테스트되었습니다. 완벽하게 작동합니다.