특정 프로세스 (예 : Firefox, Safari 등) 전용 CPU 시간을 제한하고 싶습니다.
이러한 프로그램을 사용하지 않을 때 (로드 없음, 애니메이션 없음, 백그라운드에서 실행되는 등) 왜 그렇게 많은 리소스가 필요한지 이해할 수 없습니다. 브라우저가 내 CPU의 50 % 이상을 먹어야하는 이유는 무엇입니까? 10 %로 제한 할 수 있습니까?
특정 프로세스 (예 : Firefox, Safari 등) 전용 CPU 시간을 제한하고 싶습니다.
이러한 프로그램을 사용하지 않을 때 (로드 없음, 애니메이션 없음, 백그라운드에서 실행되는 등) 왜 그렇게 많은 리소스가 필요한지 이해할 수 없습니다. 브라우저가 내 CPU의 50 % 이상을 먹어야하는 이유는 무엇입니까? 10 %로 제한 할 수 있습니까?
답변:
그것은 정확히 당신이 원하는 것이 아니라, 구글 드라이브와 크롬과 관련하여 나를 위해 속임수를 쓴 것입니다.
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
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."
출처:
cputhrottle
때문에의 forumula는 2019년 2월 17일에 브루에서 제거 가 더 이상 작동하지 않습니다 . 요세미티는 macOS의 마지막 버전을 지원했다 cputhrottle
.
당신은 실제로 할 수 있습니다! 제한 할 PID를 지정할 수있는 CPUThrottle 이 있습니다.
그들은 그 이유를 위해 많은 것을 사용하려고 노력하고 있습니다. 유용한 도구이지만 매일 매일 더 나아질 지 여부는 당신이 발견하는 것입니다.
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
명령). 에 대한 자세한 읽기 nice
및 renice
입력 man nice
과 man renice
Terminal.app에 있습니다.
nice
및 renice
자체 주어진 애플리케이션에 사용할 수있는 CPU의 비율을 제한하지 않는, 그들은 그러나 스케줄링 우선 순위를 변경할 수 있습니다, 또는 프로세스가 얻을 것이다 CPU 시간의 양 즉 않습니다. 이는 모두 시스템의 CPU로드와 관련이 있으므로 시스템을 충분히 사용하지 않으면 차이가 없을 것입니다.
모든 작업을 수행 할 수있는 간단한 단일 라이너가 있습니다.
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가 설치되어 있는지 확실하지 않습니다 .
이것은 이전 답변을 기반으로하지만 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
Nicholas Smith가 게시 한 링크는 더 이상 작동하지 않습니다. 그래서 다시 검색하는 사람들을 위해 트릭을 수행하는 다른 앱을 찾았습니다. 앱이 Apppolice를 호출합니다.
이것은 내 최종 스크립트입니다 .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
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
이것은 나를 위해 일했다
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