我可以手动限制进程使用的%CPU吗?


52

我想限制专用于某些进程(例如Firefox,Safari等)的CPU时间。

我不明白为什么这样的程序,即使不使用(没有加载,没有动画,在后台运行等),却如此耗费资源。为什么浏览器必须占用我50%或更多的CPU?我可以限制为10%吗?


这不是您问题的直接答案,但是Safari和Firefox通常不占用CPU。您可能想研究他们可能在做什么。扩展程序/插件可能是造成过多资源消耗的原因,并且您可以禁用它(或者如果不再使用它,则将其删除。)
Tim Campbell

Answers:


7

它不完全是您想要的,但是,就Google Drive和Chrome而言,这对我有用的是:

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现在,该怎么办?
Peter Samokhin

@PeterSamokhin对不起,我不知道其他选择。但是我最近也没有搜索过。
卡西米尔

15

你确实可以!有CPUThrottle,它允许指定要限制的PID。

请注意,由于某种原因,他们正在尝试使用该工具,这是一个有用的工具,但是您会发现它每天会变得更好或更坏。


1
有趣。但是,使用该实用程序,我必须启动一个程序,找到其PID,然后手动使用cputhrottle。每次我启动它。有什么可以让我告诉系统的:“从今天开始,始终以最多25%的CPU运行该程序”?
Pietro

据我所知,我只遇到过CPUThrottle。
尼古拉斯·史密斯,

404文件未找到
安德烈·利维

11

尽管这不是OP问题的直接答案,但是如果您遇到某个特定进程的问题,该进程占用了过多的CPU时间,并使计算机无法使用,并且您不介意该进程需要多长时间才能完成它正在处理的任务,您可以使用renice更改该进程的优先级,使其表现良好(因此得名)。

首先,您需要找到正在消耗CPU资源的进程的PID。您可以在“活动监视器”中或使用以下ps命令在Terminal.app中执行此操作-例如,找到Safari浏览器的PID,请键入:

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

上面的第二行是输出,在此特定情况下,PID为17452。

然后,下一个任务是更改进程的优先级(假设我们要使Safari表现良好)。为此,请在Terminal.app中输入:

MacBook:~😈  renice -n 10 -p 17452

-n选项通过将10加到当前值(默认为0)来更改漂亮级别。值的范围是-20到20,最小值表示最高优先级。作为普通用户,您可以使用0到20的值。要分配负值,您需要具有root特权(例如use sudo命令)。了解更多关于nicerenice通过打字man niceman renice在Terminal.app。

nice并且renice不限制给定应用程序本身可用的CPU百分比,但是,它们确实允许更改调度优先级,换句话说,一个进程将获得多少CPU时间。这都是与系统上的CPU负载有关的,因此,如果系统未充分利用,您很可能看不到任何区别。


有没有办法查看流程的当前优先级?
theonlygusti

使用top或htop查看当前的流程价值。(brew install htop),(sudo apt安装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 &'。但是,我不确定macOS是否pgrep已安装。
bigsweater '18 -10-1

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兼容。
John Mark Mitchell

哦,我的天哪。刚刚安装了AppTamer。高兴地报告了出色的作品。当我按住Alt键跳出时,可以使用它来使新版《星际争霸》保持原样。哦,我忘了提,我正在运行macOS Sierra 10.12.6。谢谢你的建议!
cavalcade

定位已停止。
LаngLаngС

但是仍然可以正常工作。
菲尔·皮罗

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.