다른 명령을 실행하는 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
Cgroup은 기본적으로 자식 프로세스를 제한하는 수단을 제공하지 않지만 제공되는 cg 규칙 엔진 데몬 (cgred)을 사용할 수 있습니다. libcgroup에 의해; libcgroup 패키지에서 제공되는 cgexec
및 cgclassify
명령은 --sticky
를 제공합니다. 규칙을 자식 프로세스에도 적용 할 수 있도록 플래그를 지정합니다.
(적어도 이론적으로는) 일부 자식 프로세스가 올바르게 제한되지 않도록 할 수있는 경합 조건이 있다는 점에 유의하세요. . 그러나 “어쨌든 사용자 공간에서 실행되는 cpulimit
를 현재 사용하고 있기 때문에 이미 100 % 신뢰할 수있는 CPU limi가 없습니다. 이 경쟁 조건이 “당신에게 거래를 깨뜨리지 말아야합니다.
저는 여기 내 셀프 답변에서 cg 규칙 엔진 데몬에 대해 상당히 광범위하게 썼습니다.
답변
아마도 그럴 수 없습니다.
cpulimit
“의 논리는 매우 간단합니다. 프로세스의 pid를 취하고 단순히 그 신호 kill -STOP $PID
, 그 이후 kill -CONT $PID
, 반복해서 반복해서 …
그리고 CPU 사용량을 측정하여 STOP과 CONT 사이의 지연을 계산합니다.
귀하의 경우 복잡한 bash-script의 pstree
는 N * x를 사용합니다. 콘솔 화면.
배쉬 스크립트 또는 바이너리 실행 파일의 CPU 사용량을 다운 그레이드하는 또 다른 방법을 제안 할 수 있습니다.
1) nice
-프로세스를 취하고 우선 순위를 -20 (가장 높은 우선 순위)에서 20 (가장 낮은 우선 순위)으로 높이거나 낮 춥니 다. 아마도 너무 낮은 diapason 일 것입니다. 그래서 또 다른 두 가지 유틸리티와 커널 후크가 나타납니다.
2) ionice
–nice
. 0 (가장 낮은 우선 순위)에서 7 (가장 높은 우선 순위)까지 우선 순위에 따라 프로세스를 분리 할 수 있습니다. 또한, 실시간 (최고), best-efforts
(중간), 유휴 (최저) 및 없음 (기본값) 클래스별로 프로세스를 분리 할 수 있습니다.
3) chrt
-지금까지 만난 것 중 가장 높은 것으로, 그 힘은 cpulimit
와 비슷합니다. 프로세스에 대한 지배. 여기에서도 우선 순위 클래스 인 idle
, real-time
, fifo
,
등 … 그리고 1부터 99까지 매우 큰 우선 순위의 diapason.
예를 들어, -모든 자원을 소모합니다.
같은 방식으로 모든 거대한 데몬은 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 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를 실행하려고했을 때 이상한 문제가 발생했습니다. 이것은 역설적으로 cpulimit “ing을 거의 u로 만드는 두 개의 ffmpeg 인스턴스를 생성했습니다. seless. 문제가 무엇인지에 대한 답을 찾을 수 없습니다. 따라서 “단지 for-loop”인 경우에도 스크립트를 작성해야 할 수 있습니다. 이.)
Answer
-P
매개 변수를 사용하고 절대 경로를 실행 가능합니다.
Answer
iv에서 cpulimit -l 50 ffmpeg
의 별칭을 설정하려고했습니다. id = “36a9bc86fe”>
alias ffmpegl = "cpulimit -l 50 ffmpeg"
그런 다음 다음 코드를 사용하여 내 스크립트에서 별칭을 사용했습니다.
shopt -s expand_aliases source /home/your_user/.bashrc
이제 별칭을 사용하는 여러 명령에 대해 스크립트 내에서 ffmpeg와 함께 cpulimit를 사용할 수 있습니다. 과학 용 Linux 6.5에서 테스트되었습니다. 완벽하게 작동합니다.
댓글
- 안타깝게도 cpulimit 명령이 백그라운드로 전환되어 반복 스크립팅이 불가능합니다.
- 또한이 문제를 만났습니다. 반복이 매우 복잡하지 않은 경우 해결 방법으로 '<에 파이프 된 ' find ' 조합을 사용합니다. / div> xargs '가 저를 위해 일했습니다.
답글 남기기