特定のプロセス(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制限を追加でき、アプリケーションごとに1回だけ実行されることです。すべての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日に自作から削除された、それはもう動作しません。Yosemiteは、サポートするmacOSの最後のバージョンでしたcputhrottle
。
本当にできます!CPUThrottleがあり、制限するPIDを指定できます。
注意してください、彼らは理由のためにそれを多く使用しようとしています、それは便利なツールですが、それが日々あなたのために良くなるか悪くなるかはあなたが発見するものです。
OPの質問に対する直接的な答えではありませんが、特定のプロセスがCPU時間を大量に消費し、コンピューターを使用できなくする問題がある場合、そのプロセスが完了するまでにかかる時間は気にしません作業中のタスクでは、を使用しrenice
てそのプロセスの優先度を変更し、適切に動作させることができます(そのため)。
まず、CPUリソースを使い果たしているプロセスのPIDを見つける必要があります。アクティビティモニターまたは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
上記の2行目は出力であり、この特定のケースではPIDは17452です。
次に、次のタスクはプロセスの優先度を変更することです(Safariでうまく動作させたいとしましょう)。これを行うには、Terminal.appで次のように入力します。
MacBook:~😈 renice -n 10 -p 17452
この-n
オプションは、現在の値に10を追加することにより、ナイスレベルを変更します(デフォルトでは0)。値の範囲は-20〜20で、値が最も低いと優先度が最も高くなります。通常のユーザーとして、0〜20の値を使用できます。負の値を割り当てるには、root権限が必要です(たとえば、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が投稿したリンクはもう機能しません。それで、私はそれをもう一度検索している人々のためにトリックをする1つの他のアプリを見つけました。アプリは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
このshは私のために働いた
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