プロセスが使用する%CPUを手動で制限できますか?


52

特定のプロセス(Firefox、Safariなど)専用のCPU時間を制限したいと思います。

このようなプログラムが、使用されていない場合(読み込みなし、アニメーションなし、バックグラウンドで実行中など)でも、リソースが非常に空いている理由がわかりません。ブラウザがCPUの50%以上を消費する必要があるのはなぜですか?10%に制限できますか?


これはあなたの質問への直接的な答えではありませんが、SafariとFirefoxは通常CPUに飢えていません。あなたは彼らが何をしているのかを調べたいかもしれません。おそらく拡張/プラグインは、過度のリソース消費の原因である可能性と、あなたはそれを無効にすることができるかもしれ(または、あなたは、もはやそれを使用しない場合は、それを削除します。)
ティム・キャンベル

回答:


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制限を追加でき、アプリケーションごとに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."

ソース:


3
別のコメントで指摘したようにcputhrottleためのforumulaは2019年2月17日に自作から削除された、それはもう動作しません。Yosemiteは、サポートするmacOSの最後のバージョンでしたcputhrottle
カシミール

@Casimirそして今、何をすべきか?
ピーターサモヒン

@PeterSamokhin申し訳ありませんが、代替手段がわかりません。しかし、最近も検索していません。
カシミール

15

本当にできます!CPUThrottleがあり、制限するPIDを指定できます。

注意してください、彼らは理由のためにそれを多く使用しようとしています、それは便利なツールですが、それが日々あなたのために良くなるか悪くなるかはあなたが発見するものです。


1
面白い。しかし、このユーティリティでは、プログラムを起動し、そのPIDを見つけてcputhrottleを手動で使用する必要があります。起動するたびに。「今日から常にこのプログラムを最大25%のCPUで実行してください」とシステムに伝えることができるものはありますか?
ピエトロ

私の知る限り、CPUThrottleに出くわしたことはありません。
ニコラススミス

404ファイルが見つかりません
アンドレ・レヴィ

11

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 niceman reniceTerminal.appで。

niceまたrenice、特定のアプリケーション自体で使用できるCPUの割合を制限しないでください。ただし、スケジューリングの優先順位、つまりプロセスが取得するCPU時間を変更することはできます。これはすべてシステムのCPU負荷に関連するため、システムが十分に活用されていない場合、ほとんど違いは見られません。


プロセスの現在の優先順位を確認する方法はありますか?
-theonlygusti

topまたはhtopを使用して、プロセスの現在のnice値を表示します。(brew install htop)、(sudo apt install htop)。値を含む列の1つが表示されます。
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が投稿したリンクはもう機能しません。それで、私はそれをもう一度検索している人々のためにトリックをする1つの他のアプリを見つけました。アプリはApppoliceを呼び出します。

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


2
AppPoliceと同様に、AppTamer(stclairsw.com/AppTamer)があります。注意の一言:このコメントを書いている時点で、AppTamerはまだOSX Sierraと互換性がありません。
ジョンマークミッチェル

なんてことだ。AppTamerをインストールしました。うまく作品を報告できてうれしいです。Altキーを押しながらタブを外したときに、新しいStarCraftをリマスターするために使用します。言及するのを忘れて、macOS Sierra 10.12.6を実行しています。提案をありがとう!
cavalcade

Apppoliceは廃止されました。
ロングラング

しかし、それでもかなりうまくいきます。
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

この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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.