Tôi có thể tự giới hạn% CPU được sử dụng bởi một quy trình không?


52

Tôi muốn giới hạn thời gian CPU dành riêng cho một số quy trình nhất định (ví dụ: Firefox, Safari, ...).

Tôi không thể hiểu tại sao các chương trình như vậy, ngay cả khi không được sử dụng (không tải gì, không có hình động, chạy trong nền, ...), rất đói tài nguyên. Tại sao trình duyệt phải ăn 50% CPU trở lên? Tôi có thể giới hạn ở mức 10% không?


Đây không phải là câu trả lời trực tiếp cho câu hỏi của bạn, nhưng Safari và Firefox thường không đói CPU. Bạn có thể muốn xem xét những gì họ có thể đang làm. Có thể một tiện ích mở rộng / trình cắm có thể chịu trách nhiệm cho việc tiêu thụ tài nguyên quá mức và bạn có thể vô hiệu hóa nó (hoặc xóa nó nếu bạn không còn sử dụng nó nữa.)
Tim Campbell

Câu trả lời:


7

Đó không phải là chính xác những gì bạn muốn, nhưng, liên quan đến google drive và chrome, điều này đã giúp tôi:

Google Drive ("Sao lưu và đồng bộ hóa")

  • giảm ưu tiên:

    for f in $(pgrep 'Backup and Sync'; pgrep 'FinderSyncAPIExtension'); do renice +20 -p $f; done
    
  • trở lại bình thường:

    for f in $(pgrep 'Backup and Sync'; pgrep 'FinderSyncAPIExtension'); do renice 0 -p $f; done
    

Chrome

  • khử ưu tiên tất cả các quy trình hiện tại:

    for f in $(pgrep 'Chrome'); do renice +20 -p $f; done
    
  • thiết lập trở lại bình thường tất cả các quy trình hiện tại:

    for f in $(pgrep 'Chrome'); do renice 0 -p $f; done
    

44

cputhrottlelà công cụ bạn cần. Bạn có thể cài đặt nó với Homebrew .

Bạn có thể theo dõi một loạt các quy trình theo tên bằng cách chạy tập lệnh Bash bên dưới. Tôi không chắc chắn làm thế nào để biến điều này thành một mục đăng nhập vì cputhrottleyêu cầu quyền siêu người dùng. Chạy nó dưới dạng tập lệnh, trong quy trình làm việc của Automator, bất cứ điều gì:

# 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

[Đã chỉnh sửa]

Tôi đã thêm một phiên bản khác cho tập lệnh này ( bashtập lệnh), có thể hữu ích cho những người đang tìm cách giới hạn CPU cho nhiều ứng dụng.

Kịch bản mới này cũng cho phép bạn chỉ định một danh sách chứa tên ứng dụng và giới hạn CPU cho nó.

Sự khác biệt chính là bạn có thể thêm giới hạn cpu cho mỗi ứng dụng và nó sẽ chỉ chạy một lần cho mỗi ứng dụng. Tôi cũng đã thêm tùy chọn để giết tất cả các cputhrottlequy trình.

Kịch bản giả định rằng cả hai cputhrottlepidofđược cài đặt trước khi chạy nó.

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

Nguồn:


3
Như đã chỉ ra trong một bình luận khác , cputhrottleforumula đã bị xóa khỏi Homebrew vào ngày 17 tháng 2 năm 2019 vì nó không hoạt động nữa . Yosemite là phiên bản cuối cùng của macOS hỗ trợ cputhrottle.
Casimir

@Casimir và bây giờ, phải làm sao?
Peter Samokhin

@PeterSamokhin Xin lỗi, tôi không biết về một sự thay thế. Nhưng tôi cũng không tìm kiếm gần đây.
Casimir

15

Bạn thực sự có thể! Có CPUThrption , cho phép chỉ định một PID để hạn chế.

Lưu ý, họ đang cố gắng sử dụng nhiều như vậy vì một lý do, đó là một công cụ hữu ích nhưng liệu nó sẽ làm cho nó tốt hơn hay tồi tệ hơn cho bạn mỗi ngày sẽ là thứ bạn khám phá.


1
Hấp dẫn. Nhưng với tiện ích này, tôi phải khởi chạy một chương trình, tìm (các) bộ điều khiển và sử dụng thủ công. Mỗi khi tôi khởi chạy nó. Có điều gì đó cho phép tôi nói với hệ thống không: Từ hôm nay luôn chạy chương trình này với tối đa 25% CPU.
Pietro

Theo như tôi biết là không, tôi chỉ từng gặp CPUThrption.
Nicholas Smith

Không tìm thấy tệp 404
André Levy

11

Mặc dù không phải là câu trả lời trực tiếp cho câu hỏi của OP, nhưng nếu bạn gặp sự cố với một quy trình cụ thể chiếm quá nhiều thời gian CPU của bạn và khiến máy tính của bạn không thể sử dụng được và bạn không bận tâm quá trình đó mất bao lâu để hoàn thành nhiệm vụ đang làm, bạn có thể sử dụng reniceđể thay đổi mức độ ưu tiên của quy trình đó, làm cho nó hoạt động tốt (do đó là tên).

Trước tiên, bạn cần tìm PID của quá trình sử dụng hết tài nguyên CPU. Bạn có thể thực hiện điều đó trong Trình giám sát hoạt động hoặc trong Terminal.app bằng pslệnh - ví dụ: để tìm PID của trình duyệt Safari, gõ:

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

Dòng thứ hai ở trên là đầu ra, và PID là 17452 trong trường hợp cụ thể này.

Sau đó, nhiệm vụ tiếp theo là thay đổi mức độ ưu tiên của quy trình (giả sử đó là Safari chúng tôi muốn thực hiện hành vi độc đáo). Để làm điều này, trong loại Terminal.app:

MacBook:~😈  renice -n 10 -p 17452

Các -ntùy chọn thay đổi mức độ thoải mái bằng cách thêm từ 10 đến giá trị hiện tại (0 theo mặc định). Phạm vi của các giá trị là -20 đến 20, với giá trị thấp nhất có nghĩa là mức ưu tiên cao nhất. Là người dùng thông thường, bạn có thể sử dụng các giá trị từ 0 đến 20. Để gán giá trị âm, bạn cần phải có quyền root (ví dụ: sử dụng sudolệnh). Đọc thêm về nicerenicebằng cách gõ man niceman renicetrong Terminal.app.

nicerenicekhông giới hạn tỷ lệ phần trăm của CPU có sẵn cho một ứng dụng nhất định, tuy nhiên chúng cho phép thay đổi mức ưu tiên lập lịch hoặc nói cách khác là thời gian CPU sẽ xử lý bao nhiêu thời gian. Điều này hoàn toàn liên quan đến tải CPU trên hệ thống của bạn, vì vậy nếu hệ thống được sử dụng, rất có thể bạn sẽ không thấy bất kỳ sự khác biệt nào.


Có cách nào để xem mức độ ưu tiên hiện tại của một quy trình không?
theonlygusti

sử dụng top hoặc htop để xem giá trị tốt đẹp hiện tại của một tiến trình. (bia cài đặt htop), (sudo apt cài đặt htop). Bạn sẽ thấy một trong các cột chứa giá trị.
Tmanok

6

Có một lớp lót đơn giản để làm tất cả những điều đó:

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

Viết tên ứng dụng của bạn thay vì Chromium và tỷ lệ phần trăm mong muốn thay vì 10 và bạn thật tuyệt!


Điều này làm việc tốt, mặc dù nó có thể được giảm xuống : pgrep Dropbox | sudo xargs -n 1 -I'{}' sh -c 'cputhrottle {} 10 &'. Tôi không chắc chắn nếu macOS đi kèm với pgrepcài đặt, tuy nhiên.
bigsweater

5

Điều này dựa trên câu trả lời trước đó, nhưng việc thêm bẫy cho ctrl + c để đảm bảo quá trình được điều chỉnh được để lại ở trạng thái tiếp tục và thêm vào set -eđó tập lệnh này sẽ thoát sạch nếu quá trình tự thoát:

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

Liên kết mà Nicholas Smith đã đăng không hoạt động nữa. Vì vậy, tôi đã tìm thấy một ứng dụng khác thực hiện thủ thuật cho những người đang tìm kiếm lại nó. ứng dụng gọi Apppolice.

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


2
Tương tự như AppPolice, có AppTamer ( stclairsw.com/AppTamer ). Một lời cảnh báo: khi tôi viết bình luận này, AppTamer vẫn chưa tương thích với OSX Sierra.
John Mark Mitchell

Ôi trời, thật là một tìm thấy. Chỉ cần cài đặt AppTamer. Vui lòng báo cáo công việc tuyệt vời tốt. Tôi sử dụng nó để giữ cho StarCraft mới được làm lại theo dòng khi tôi tắt tab. Ồ và tôi quên đề cập, tôi đang chạy macOS Sierra 10.12.6. Cám ơn vì sự gợi ý!
kỵ binh

Apppolice đã bị ngưng.
LаngLаngС

Nhưng vẫn hoạt động khá tốt.
phil pirozhkov

3

Đây là kịch bản cuối cùng của tôi, hãy giữ sạch lệnh điều khiển chỉ thực hiện lệnh mới nếu không tồn tại

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

Kịch bản Dimitri đã viết không hoạt động tốt (trên macOS), nhưng nó vẫn chạy với lỗi sau khi đóng ứng dụng. Tôi đã thay đổi nó để hoàn tất (với thông báo lỗi về PID không tìm thấy):

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

Đây có lẽ phải là một chỉnh sửa được thực hiện cho câu trả lời ban đầu của Dimitri, để cải thiện câu trả lời đó, và không phải là một câu trả lời riêng biệt với (về cơ bản) cùng một thông tin.
fsb

2

cái này làm việc cho tôi

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.