क्या मैं मैन्युअल रूप से एक प्रक्रिया द्वारा उपयोग किए जाने वाले% CPU को सीमित कर सकता हूं?


52

मैं कुछ प्रक्रियाओं (जैसे फ़ायरफ़ॉक्स, सफारी, ...) को समर्पित सीपीयू समय की मात्रा को सीमित करना चाहूंगा।

मैं समझ नहीं पा रहा हूं कि इस तरह के कार्यक्रमों का उपयोग तब भी क्यों नहीं किया जाता है (कुछ भी लोड नहीं हो रहा है, कोई एनिमेशन नहीं है, पृष्ठभूमि में चल रहा है, ...), इतने भूखे हैं। एक ब्राउज़र को मेरे सीपीयू का 50% या अधिक क्यों खाना चाहिए? क्या मैं इसे 10% तक सीमित कर सकता हूं?


यह सीधे आपके सवाल का जवाब नहीं है, लेकिन सफारी और फ़ायरफ़ॉक्स आमतौर पर सीपीयू भूखे नहीं हैं। आप उन बातों पर गौर करना चाहते हैं जो वे कर रहे होंगे। संभवतः एक संसाधन / प्लग-इन अत्यधिक संसाधन खपत के लिए जिम्मेदार हो सकता है और आप इसे अक्षम कर सकते हैं (या इसे हटा दें यदि आप अब इसका उपयोग नहीं करते हैं।)
टिम कैम्पबेल

जवाबों:


7

यह ठीक नहीं है जो आप चाहते थे, लेकिन, Google ड्राइव और क्रोम के संबंध में यह मेरे लिए क्या चाल थी:

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 के साथ इंस्टॉल कर सकते हैं ।

आप नीचे बैश स्क्रिप्ट चलाकर नाम से प्रक्रियाओं की एक श्रृंखला की निगरानी कर सकते हैं। मुझे यह पक्का नहीं है कि cputhrottleसुपरसियर की अनुमति के लिए इसे लॉगिन आइटम में कैसे बदलना है । इसे एक स्क्रिप्ट के रूप में चलाएं, एक ऑटोमेटर वर्कफ़्लो में, जो भी:

# 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स्क्रिप्ट) के लिए एक अलग संस्करण जोड़ा है , जो कई अनुप्रयोगों के लिए सीपीयू को सीमित करने वाले लोगों के लिए उपयोगी हो सकता है।

यह नई स्क्रिप्ट आपको एप्लिकेशन नाम और इसके लिए सीपीयू सीमा वाली एक सूची निर्दिष्ट करने की अनुमति देती है।

मुख्य अंतर यह है कि आप प्रति एप्लिकेशन सीपीयू सीमा जोड़ सकते हैं, और यह केवल एक बार आवेदन के अनुसार चलेगा। मैंने सभी 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फ़ोरम 17 फरवरी, 2019 को होमब्रे से हटा दिया गया था क्योंकि यह अब काम नहीं करता है । Yosemite समर्थन के लिए macOS का अंतिम संस्करण था cputhrottle
कासिमिर

@ कासिमिर और अब, क्या करना है?
पीटर समोखिन

@PeterSamokhin क्षमा करें, मुझे विकल्प का पता नहीं है। लेकिन मैंने हाल ही में खोज नहीं की है।
कासिमिर

15

आप वास्तव में कर सकते हैं! CPUThrottle है , जो प्रतिबंधित करने के लिए PID निर्दिष्ट करने की अनुमति देता है।

ध्यान दें, वे एक कारण के लिए इतना उपयोग करने की कोशिश कर रहे हैं, यह एक उपयोगी उपकरण है, लेकिन क्या यह आपके लिए एक दिन के लिए बेहतर या बदतर बना देगा जो आपको पता चलेगा।


1
दिलचस्प। लेकिन इस उपयोगिता के साथ मुझे एक कार्यक्रम लॉन्च करना है, इसके पीआईडी ​​(ओं) को ढूंढना है और मैन्युअल रूप से cputhrottle का उपयोग करना है। हर बार मैं इसे लॉन्च करता हूं। क्या ऐसा कुछ है जो मुझे सिस्टम को बताने की अनुमति देता है: "आज से हमेशा अधिकतम 25% सीपीयू के साथ इस कार्यक्रम को चलाएं"?
पिट्रो

जहाँ तक मुझे जानकारी है, मैं केवल CPUThrottle पर आया हूँ।
निकोलस स्मिथ

404 फ़ाइल नहीं मिली
एंड्रे लेवी

11

हालांकि ओपी के सवाल का सीधा जवाब नहीं है, यदि आप एक विशेष प्रक्रिया के साथ एक मुद्दा उठा रहे हैं, जो आपके सीपीयू समय को बहुत अधिक ले जा रहा है, और आपके कंप्यूटर को बेकार बना रहा है, और आपको कोई आपत्ति नहीं है कि उस प्रक्रिया को समाप्त होने में कितना समय लगता है यह जिस कार्य पर काम कर रहा है, आप reniceउस प्रक्रिया की प्राथमिकता को बदलने के लिए उपयोग कर सकते हैं , जिससे यह अच्छी तरह से व्यवहार करता है (इसलिए नाम)।

सबसे पहले, आपको सीपीयू संसाधनों का उपयोग करने वाली प्रक्रिया के पीआईडी ​​को खोजने की आवश्यकता है। आप या तो एक्टिविटी मॉनिटर में कर सकते हैं, या टर्मिनल में कर सकते हैं। psकमांड के साथ - जैसे कि सफारी ब्राउज़र के पीआईडी ​​को खोजने के लिए, टाइप करें:

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

ऊपर की दूसरी पंक्ति आउटपुट है, और पीआईडी ​​इस विशेष मामले में 17452 है।

फिर, अगला कार्य प्रक्रिया की प्राथमिकता को बदलना है (मान लें कि यह सफारी है जिसे हम अच्छी तरह से व्यवहार करना चाहते हैं)। ऐसा करने के लिए, Terminal.app प्रकार में:

MacBook:~😈  renice -n 10 -p 17452

-nविकल्प वर्तमान मूल्य (डिफ़ॉल्ट रूप से 0) के लिए 10 जोड़कर अच्छा स्तर बदल जाता है। मानों की श्रेणी -20 से 20 है, जिसमें न्यूनतम मान उच्चतम प्राथमिकता है। एक साधारण उपयोगकर्ता के रूप में, आप 0 से 20 मानों का उपयोग कर सकते हैं। एक नकारात्मक मान निर्दिष्ट करने के लिए, आपको रूट विशेषाधिकार (जैसे sudoकमांड का उपयोग ) करने की आवश्यकता है। इसके बारे में niceऔर reniceटाइप करके man niceऔर man reniceTerminal.app में और पढ़ें ।

niceऔर reniceप्रति दिए गए आवेदन के लिए उपलब्ध सीपीयू के प्रतिशत को सीमित नहीं करते हैं, हालांकि वे शेड्यूलिंग प्राथमिकता को बदलने की अनुमति देते हैं, या दूसरे शब्दों में सीपीयू समय की एक प्रक्रिया को कितना प्राप्त करेगा। यह आपके सिस्टम पर CPU लोड के सापेक्ष है, इसलिए यदि सिस्टम का उपयोग किया जा रहा है, तो आपको सबसे अधिक कोई अंतर दिखाई नहीं देगा।


क्या किसी प्रक्रिया की वर्तमान प्राथमिकता को देखने का एक तरीका है?
Theonlygusti

किसी प्रक्रिया का वर्तमान अच्छा मूल्य देखने के लिए शीर्ष या htop का उपयोग करें। (brew install htop), (sudo apt install htop)। आप मान वाले एक कॉलम को देखेंगे।
तमनोक

6

यह सब करने के लिए एक सरल लाइनर है:

ps axu | grep Chromium | grep -v grep | awk '{print $2}' | sudo xargs -n 1 -I'{}' sh -c 'cputhrottle {} 10 &'

क्रोमियम के बजाय अपना ऐप नाम लिखें और 10 के बजाय वांछित प्रतिशत और आप जाने के लिए अच्छे हैं!


यह अच्छी तरह से काम किया है, हालांकि इसे कम किया जा सकता है pgrep Dropbox | sudo xargs -n 1 -I'{}' sh -c 'cputhrottle {} 10 &':। मुझे यकीन नहीं है कि macOS pgrepस्थापित के साथ आता है, हालांकि।
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

निकोलस स्मिथ ने जो लिंक पोस्ट किया वह अब काम नहीं करता है। इसलिए मुझे एक अन्य ऐप मिला जो उन लोगों के लिए ट्रिक करता है जो इसे फिर से खोज रहे हैं। ऐप को एपपोलिस कहते हैं।

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


2
AppPolice के समान, AppTamer ( stclairsw.com/AppTamer ) है। सावधानी का एक शब्द: जैसा कि मैंने यह टिप्पणी लिखी है, AppTamer को अभी तक OSX सिएरा संगत होना चाहिए।
जॉन मार्क मिशेल

ओह माय, क्या पता। बस AppTamer स्थापित किया है। रिपोर्ट में प्रसन्नता से कल्पनात्मक रूप से अच्छी तरह से काम करता है। जब मैं ऑल-टैब आउट करता हूं, तो नए स्टारक्राफ्ट को लाइन में फिर से रखने के लिए इसका उपयोग करता हूं। ओह और मैं उल्लेख करना भूल गया, मैं macOS सिएरा 10.12.6 चला रहा हूं। सलाह के लिये धन्यवाद!
काफिले

Apppolice को बंद कर दिया गया है।

लेकिन फिर भी काफी ठीक काम करता है।
दिर पिरोजोवकोव

3

यह मेरी अंतिम स्क्रिप्ट है, कमांड को साफ रखें कि यदि कोई मौजूद नहीं है तो केवल नया निष्पादित करें

#!/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

दिमित्री ने जो स्क्रिप्ट लिखी है, वह अच्छी तरह से (macOS पर) काम करती है, लेकिन यह एप्लिकेशन बंद होने के बाद त्रुटियों के साथ चलती रहती है। मैंने इसे समाप्त करने के लिए इसे बदल दिया (पीआईडी ​​के बारे में एक त्रुटि संदेश के साथ नहीं मिला):

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

यह संभवतः उस उत्तर को बेहतर बनाने के लिए दिमित्री के मूल उत्तर के लिए किया गया एक संपादन होना चाहिए, और एक ही जानकारी के साथ एक अलग उत्तर (मूल रूप से) नहीं होना चाहिए।
fsb

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.