프로세스에서 사용하는 % CPU를 수동으로 제한 할 수 있습니까?


52

특정 프로세스 (예 : Firefox, Safari 등) 전용 CPU 시간을 제한하고 싶습니다.

이러한 프로그램을 사용하지 않을 때 (로드 없음, 애니메이션 없음, 백그라운드에서 실행되는 등) 왜 그렇게 많은 리소스가 필요한지 이해할 수 없습니다. 브라우저가 내 CPU의 50 % 이상을 먹어야하는 이유는 무엇입니까? 10 %로 제한 할 수 있습니까?


이것은 귀하의 질문에 대한 직접적인 대답은 아니지만 Safari와 Firefox는 일반적으로 CPU 배고프지 않습니다. 그들이하고있는 일을 조사하고 싶을 수도 있습니다. 확장 / 플러그인이 과도한 리소스 소비를 초래할 수 있으며이를 비활성화 할 수 있습니다 (또는 더 이상 사용하지 않는 경우 제거).
Tim Campbell

답변:


7

그것은 정확히 당신이 원하는 것이 아니라, 구글 드라이브와 크롬과 관련하여 나를 위해 속임수를 쓴 것입니다.

Google 드라이브 ( "백업 및 동기화")

  • 우선 순위를 낮추십시오 :

    for f in $(pgrep 'Backup and Sync'; pgrep 'FinderSyncAPIExtension'); do renice +20 -p $f; done
    
  • 다시 정상으로 설정 :

    for f in $(pgrep 'Backup and Sync'; pgrep 'FinderSyncAPIExtension'); do renice 0 -p $f; done
    

크롬

  • 모든 현재 프로세스의 우선 순위를 해제하십시오.

    for f in $(pgrep 'Chrome'); do renice +20 -p $f; done
    
  • 모든 현재 프로세스를 정상으로 되 돌리십시오.

    for f in $(pgrep 'Chrome'); do renice 0 -p $f; done
    

44

cputhrottle필요한 도구입니다. Homebrew로 설치할 수 있습니다 .

아래 Bash 스크립트를 실행하여 이름으로 일련의 프로세스를 모니터링 할 수 있습니다. cputhrottle수퍼 유저 권한이 필요하기 때문에 이것을 로그인 항목으로 바꾸는 방법을 잘 모르겠습니다 . 다음과 같이 Automator 워크 플로우에서 스크립트로 실행하십시오.

# Get the Process/App names from Activity Monitor and put them here
apps=("AppOne" "AppTwo" "AppThree")
# Set the respective limits here
limits={30 40 50)

while true; do
  for app in ${apps}; do
    for limit in ${limits}; do
      for pid in $(pgrep ${app}); do
        sudo /path/to/cputhrottle ${pid} ${limit}
      done
    done
  done
done

[편집]

이 스크립트 ( bash스크립트)에 다른 버전을 추가했습니다.이 버전 은 여러 응용 프로그램의 CPU를 제한하려는 사람들에게 유용 할 수 있습니다.

이 새로운 스크립트를 사용하면 응용 프로그램 이름과 CPU 제한이 포함 된 목록을 지정할 수도 있습니다.

주요 차이점은 응용 프로그램 당 CPU 제한을 추가 할 수 있으며 응용 프로그램 당 한 번만 실행된다는 것입니다. 또한 모든 cputhrottle프로세스 를 종료하는 옵션을 추가했습니다 .

이 스크립트는 모두 있다고 가정 cputhrottle하고 pidof그것을 실행하기 전에 설치됩니다.

#!/bin/bash

if [[ $EUID > 0 ]]; then
  echo "Please run this script as root/sudo"
  exit 1
fi

# Pass --kill as argument to kill all running cputhrottles
if [ $1 = "--kill" ]; then  
  echo "Looking for running cputhrottles..."
  pids=`pidof cputhrottle`
  for pid in ${pids}; do
    echo "> Killing PID ${pid}"
    sudo kill ${pid}
  done
  echo "Done!"
  exit 0
fi

declare -a applications

# Syntax='application;max-cpu'
applications[0]='Chrome;40'
applications[1]='Firefox;50'
applications[2]='pycharm;40'
applications[3]='webstorm;40'
applications[4]='Safari;35'

for i in "${applications[@]}"; do
  app=(${i//;/ })
  app_name=${app[0]}
  cpu_limit=${app[1]}

  printf "\nLooking for ${app_name}...\n"
  pids=`pidof ${app}`
  for pid in ${pids}; do
    echo "> PID=${pid}, CPU=${cpu_limit}"
    sudo cputhrottle ${pid} ${cpu_limit} &
  done
done

printf "\nDone!\n"
echo "Run this script passing '--kill' as argument to remove all cputhrottles."

출처:


3
또 다른 의견에서 지적한 바와 같이 , cputhrottle때문에의 forumula는 2019년 2월 17일에 브루에서 제거 가 더 이상 작동하지 않습니다 . 요세미티는 macOS의 마지막 버전을 지원했다 cputhrottle.
카시미르

@Casimir와 지금, 무엇을해야합니까?
피터 사모 킨

@PeterSamokhin 죄송합니다. 대안을 모르겠습니다. 그러나 나는 또한 최근에 검색하지 않았습니다.
카시미르

15

당신은 실제로 할 수 있습니다! 제한 할 PID를 지정할 수있는 CPUThrottle 이 있습니다.

그들은 그 이유를 위해 많은 것을 사용하려고 노력하고 있습니다. 유용한 도구이지만 매일 매일 더 나아질 지 여부는 당신이 발견하는 것입니다.


1
흥미 롭군 그러나이 유틸리티를 사용하면 프로그램을 시작하고 PID를 찾아 수동으로 cputhrottle을 사용해야합니다. 시작할 때마다 "오늘부터 항상 최대 25 % CPU로이 프로그램을 실행하십시오"라고 시스템에 알려주는 것이 있습니까?
Pietro

내가 아는 한, 나는 CPUThrottle을 만난 적이 있습니다.
니콜라스 스미스

404 파일을 찾을 수 없음
André Levy

11

OP의 질문에 대한 직접적인 대답은 아니지만 특정 프로세스에서 문제가 발생하여 CPU 시간을 너무 많이 사용하여 컴퓨터를 사용할 수 없게 만드는 경우 프로세스가 완료되는 데 시간이 얼마나 걸리는지 신경 쓰지 마십시오 작업중 인 작업에서를 사용하여 renice해당 프로세스의 우선 순위를 변경하여 잘 작동하게합니다 (따라서 이름).

먼저 CPU 리소스를 사용하고있는 프로세스의 PID를 찾아야합니다. Activity Monitor 또는 Terminal.app에서 ps명령을 사용하여이를 수행 할 수 있습니다. 예를 들어 Safari 브라우저의 PID를 찾으려면 다음을 입력하십시오.

MacBook:~😈  ps -ef | grep Safari
  501 17452   263   0 11:36pm ??         4:15.60 /Applications/Safari.app/Contents/MacOS/Safari

위의 두 번째 줄은 출력이며,이 경우 PID는 17452입니다.

그런 다음 다음 작업은 프로세스의 우선 순위를 변경하는 것입니다 (사파리라고 가정하겠습니다). 이렇게하려면 Terminal.app에 다음을 입력하십시오.

MacBook:~😈  renice -n 10 -p 17452

-n옵션은 현재 값에 10을 추가하여 기본 수준을 변경합니다 (기본적으로 0). 값의 범위는 -20 ~ 20이며 가장 낮은 값은 가장 높은 우선 순위를 의미합니다. 일반 사용자는 0에서 20 사이의 값을 사용할 수 있습니다. 음수 값을 지정하려면 루트 권한이 있어야합니다 (예 : use sudo명령). 에 대한 자세한 읽기 nicerenice입력 man niceman reniceTerminal.app에 있습니다.

nicerenice자체 주어진 애플리케이션에 사용할 수있는 CPU의 비율을 제한하지 않는, 그들은 그러나 스케줄링 우선 순위를 변경할 수 있습니다, 또는 프로세스가 얻을 것이다 CPU 시간의 양 즉 않습니다. 이는 모두 시스템의 CPU로드와 관련이 있으므로 시스템을 충분히 사용하지 않으면 차이가 없을 것입니다.


프로세스의 현재 우선 순위를 볼 수있는 방법이 있습니까?
theonlygusti

프로세스의 현재 멋진 값을 보려면 top 또는 htop을 사용하십시오. (brew install htop), (sudo apt install htop). 값이 포함 된 열 중 하나가 표시됩니다.
Tmanok

6

모든 작업을 수행 할 수있는 간단한 단일 라이너가 있습니다.

ps axu | grep Chromium | grep -v grep | awk '{print $2}' | sudo xargs -n 1 -I'{}' sh -c 'cputhrottle {} 10 &'

Chromium 대신 앱 이름을 작성하고 10 대신 원하는 비율을 작성하면 좋습니다.


다음과 같이 줄일 수는 있지만 잘 작동했습니다 pgrep Dropbox | sudo xargs -n 1 -I'{}' sh -c 'cputhrottle {} 10 &'. pgrep그러나 macOS가 설치되어 있는지 확실하지 않습니다 .
bigsweater

5

이것은 이전 답변을 기반으로하지만 ctrl + c에 대한 트랩을 추가하여 조절중인 프로세스가 계속 상태를 유지 set -e하도록 하고 추가 하면 프로세스 자체가 종료되면이 스크립트가 깨끗하게 종료됩니다.

trap ctrl_c_fn INT

function ctrl_c_fn() {
    echo "caught CTRL-C, exiting"
    kill -SIGCONT $pid
    exit
}

echo "enter process id"
read pid
echo "press Ctrl-C to exit"

set -e

while true; do
    kill -SIGSTOP $pid
    sleep 0.009
    kill -SIGCONT $pid
    sleep 0.001
done

3

Nicholas Smith가 게시 한 링크는 더 이상 작동하지 않습니다. 그래서 다시 검색하는 사람들을 위해 트릭을 수행하는 다른 앱을 찾았습니다. 앱이 Apppolice를 호출합니다.

http://www.macupdate.com/app/mac/49836/apppolice


2
AppPolice와 마찬가지로 AppTamer ( stclairsw.com/AppTamer )가 있습니다. 주의 할 점 :이 의견을 작성하는 시점에서 AppTamer는 아직 OSX Sierra와 호환되지 않습니다.
존 마크 미첼

오 마이 AppTamer를 설치했습니다. 작품이 훌륭하게보고되어 기쁘게 생각합니다. Alt-Tab 아웃 할 때 새로운 스타 크래프트를 리마스터링하기 위해 사용합니다. 아, 나는 언급을 잊었다. 나는 macOS Sierra 10.12.6을 실행 중이다. 제안 해 주셔서 감사합니다!
cavalcade

Apppolice가 중단되었습니다.
LаngLаngС

그러나 여전히 잘 작동합니다.
phil pirozhkov

3

이것은 내 최종 스크립트입니다 .cputhrottle 명령이 없으면 새로 실행하십시오.

#!/bin/bash

###
# setup cputhrottle if doesn't exists
###
set_service_cpu_limit(){
    service_pid=$(pgrep $1)
    limit=$2
    if [[ ! -z $service_pid  ]]; then
        service_cpu=$(ps aux | grep "sudo cputhrottle $service_pid $limit" | grep -v grep | wc -l)
        if [[ ! $service_cpu -gt 0 ]]; then
            sudo cputhrottle $service_pid $limit &
        fi
    fi
}

###
# main loop
###
while true; do
    set_service_cpu_limit bzfilelist 2
    set_service_cpu_limit bztransmit 2
    sleep 0.5
done

3

Dimitri가 작성한 스크립트는 잘 작동하지만 (macOS에서는) 응용 프로그램을 닫은 후에도 오류가 계속 발생합니다. 완료하지 않도록 변경했습니다 (PID를 찾을 수 없다는 오류 메시지와 함께).

echo "enter process id"
read pid
echo "press Ctrl-C to exit"

while kill -SIGSTOP $pid; do
    sleep 0.009
    kill -SIGCONT $pid
    sleep 0.001
done

이것은 아마도 기본적으로 동일한 정보를 가진 별도의 답변이 아니라 답변을 개선하기 위해 Dimitri의 원래 답변을 수정 한 것일 수 있습니다.
fsb

2

이것은 나를 위해 일했다

echo "enter process id"
read pid
echo "press Ctrl-C to exit"

while true; do
    kill -SIGSTOP $pid
    sleep 0.009
    kill -SIGCONT $pid
    sleep 0.001
done
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.