ฉันสามารถ จำกัด % CPU ที่กระบวนการใช้ด้วยตนเองได้หรือไม่?


52

ฉันต้องการ จำกัด จำนวนเวลา CPU ที่ทุ่มเทให้กับกระบวนการบางอย่าง (เช่น Firefox, Safari, ... )

ฉันไม่สามารถเข้าใจได้ว่าทำไมโปรแกรมดังกล่าวถึงแม้ว่าไม่ได้ใช้งาน (ไม่มีการโหลดไม่มีภาพเคลื่อนไหวทำงานในพื้นหลัง ... ) เป็นทรัพยากรที่หิวมาก ทำไมเบราว์เซอร์ต้องกินซีพียูของฉัน 50% ขึ้นไป ฉันสามารถ จำกัด ไว้ที่ 10% ได้หรือไม่


นี่ไม่ใช่คำตอบสำหรับคำถามของคุณโดยตรง แต่โดยทั่วไป Safari และ Firefox จะไม่ใช่ CPU หิว คุณอาจต้องการตรวจสอบสิ่งที่พวกเขาอาจจะทำ อาจเป็นส่วนขยาย / ปลั๊กอินอาจรับผิดชอบการใช้ทรัพยากรมากเกินไปและคุณอาจปิดการใช้งาน (หรือลบออกหากคุณไม่ได้ใช้งาน)
Tim Campbell

คำตอบ:


7

มันไม่ได้เป็นอย่างที่คุณต้องการ แต่ในส่วนของ google ไดรฟ์และโครเมี่ยมนี่เป็นเคล็ดลับอะไรสำหรับฉัน:

Google Drive ("สำรองและซิงค์")

  • de-จัดลำดับความสำคัญ:

    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 ต่อแอปพลิเคชันและมันจะทำงานเพียงครั้งเดียวต่อแอปพลิเคชัน ฉันได้เพิ่มตัวเลือกสำหรับการฆ่า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's forumula ถูกลบออกจาก Homebrew บน 17 กุมภาพันธ์ 2019 เพราะมันไม่ได้ทำงานอีกต่อไป โยเซมิตีเป็นรุ่นสุดท้ายของ MacOS cputhrottleที่ให้การสนับสนุน
เมียร์

@ Casimir และตอนนี้จะทำอย่างไร?
Peter Samokhin

@PeterSamokhin ขออภัยฉันไม่รู้ทางเลือก แต่ฉันยังไม่ได้ค้นหาเมื่อเร็ว ๆ นี้
เมียร์

15

คุณสามารถแน่นอน! มี CPUThrottleซึ่งอนุญาตให้ระบุ PID เพื่อ จำกัด

หมายเหตุพวกเขากำลังพยายามใช้สิ่งเหล่านั้นด้วยเหตุผลหลายอย่างมันเป็นเครื่องมือที่มีประโยชน์ แต่ไม่ว่ามันจะทำให้ดีขึ้นหรือแย่ลงสำหรับคุณในแต่ละวันจะเป็นสิ่งที่คุณค้นพบ


1
น่าสนใจ แต่ด้วยยูทิลิตี้นี้ฉันต้องเปิดโปรแกรมค้นหา PID (s) และใช้ cputhrottle ด้วยตนเอง ทุกครั้งที่ฉันเปิดตัว มีบางอย่างที่ทำให้ฉันสามารถบอกระบบได้หรือไม่:“ ตั้งแต่วันนี้ให้รันโปรแกรมนี้ด้วย CPU สูงสุด 25% เสมอ” หรือไม่?
เปียโตร

เท่าที่ฉันรู้ไม่ฉันเพิ่งเจอ CPUThrottle เท่านั้น
Nicholas Smith

ไม่พบไฟล์ 404
André Levy

11

แม้ว่าจะไม่ใช่คำตอบที่ตรงกับคำถามของ OP หากคุณมีปัญหากับกระบวนการเฉพาะซึ่งใช้เวลา CPU มากเกินไปและทำให้คอมพิวเตอร์ของคุณใช้งานไม่ได้และคุณไม่ต้องกังวลว่ากระบวนการนั้นจะใช้เวลานานเท่าใด งานมันทำงานคุณสามารถใช้reniceเพื่อเปลี่ยนลำดับความสำคัญของกระบวนการที่ทำให้มันทำงานได้ดี (ชื่อจึง)

ก่อนอื่นคุณต้องค้นหา PID ของกระบวนการที่ใช้ทรัพยากร CPU คุณสามารถทำเช่นนั้นได้ใน Activity Monitor หรือใน Terminal.app ด้วยpsคำสั่งเช่นเพื่อค้นหา PID ของเบราว์เซอร์ Safari ให้พิมพ์:

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 ในการกำหนดค่าลบคุณต้องมีสิทธิ์ใช้งานรูท (เช่นใช้sudoคำสั่ง) อ่านเพิ่มเติมเกี่ยวกับniceและreniceโดยการพิมพ์man niceและman reniceใน Terminal.app

niceและreniceไม่ จำกัด เปอร์เซ็นต์ของ CPU ที่มีให้กับแอปพลิเคชั่นที่กำหนดอย่างไรก็ตามพวกเขาอนุญาตให้เปลี่ยนลำดับความสำคัญของการกำหนดเวลาหรือกล่าวอีกนัยหนึ่งว่าเวลา CPU มากเพียงใดที่กระบวนการจะได้รับ ทั้งหมดนี้เกี่ยวข้องกับการโหลด CPU ในระบบของคุณดังนั้นหากระบบมีการใช้งานต่ำคุณมักจะไม่เห็นความแตกต่างใด ๆ


มีวิธีดูลำดับความสำคัญปัจจุบันของกระบวนการหรือไม่
theonlygusti

ใช้ top หรือ htop เพื่อดูค่า nice ปัจจุบันของกระบวนการ (ชงติดตั้ง 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 &'นี้ทำงานได้ดีถึงแม้ว่ามันจะลดลงถึง: ฉันไม่แน่ใจว่า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 ได้
John Mark Mitchell

โอ้ฉันพบอะไร เพิ่งติดตั้ง AppTamer ยินดีที่จะรายงานผลงานได้ดีอย่างน่าอัศจรรย์ ฉันใช้มันเพื่อเก็บสตาร์คราฟต์ใหม่ไว้ในมาสเตอร์เมื่อฉันกดแท็บใหม่ โอ้และฉันลืมที่จะพูดถึงฉันใช้ macOS Sierra 10.12.6 ขอบคุณสำหรับคำแนะนำ!
ขบวนแห่

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.