Bisakah saya secara manual membatasi% CPU yang digunakan oleh suatu proses?

52

Saya ingin membatasi jumlah waktu CPU yang didedikasikan untuk proses tertentu (mis. Firefox, Safari, ...).

Saya tidak bisa mengerti mengapa program seperti itu, bahkan ketika tidak digunakan (tidak ada yang memuat, tidak ada animasi, berjalan di latar belakang, ...), sangat membutuhkan sumber daya. Mengapa browser harus memakan 50% atau lebih dari CPU saya? Bisakah saya membatasi hingga 10%?

Pietro
sumber
Ini bukan jawaban langsung untuk pertanyaan Anda, tetapi Safari dan Firefox biasanya tidak lapar CPU. Anda mungkin ingin melihat apa yang mungkin mereka lakukan. Mungkin ekstensi / plug-in mungkin bertanggung jawab atas konsumsi sumber daya yang berlebihan dan Anda mungkin dapat menonaktifkannya (atau menghapusnya jika Anda tidak lagi menggunakannya.)
Tim Campbell

Jawaban:

7

Ini tidak persis apa yang Anda inginkan, tetapi, dalam hal google drive dan chrome ini apa trik untuk saya:

Google Drive ("Cadangan dan Sinkronisasi")

  • tidak memprioritaskan:

    for f in $(pgrep 'Backup and Sync'; pgrep 'FinderSyncAPIExtension'); do renice +20 -p $f; done
    
  • kembali ke normal:

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

Chrome

  • hapus prioritas semua proses saat ini:

    for f in $(pgrep 'Chrome'); do renice +20 -p $f; done
    
  • set kembali ke normal semua proses saat ini:

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

cputhrottleadalah alat yang Anda butuhkan. Anda dapat menginstalnya dengan Homebrew .

Anda dapat memantau serangkaian proses dengan nama dengan menjalankan skrip Bash di bawah ini. Saya tidak yakin bagaimana mengubahnya menjadi item masuk karena cputhrottlememerlukan izin pengguna super. Jalankan sebagai skrip, dalam alur kerja Automator, apa pun:

# 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

[Diedit]

Saya telah menambahkan versi yang berbeda untuk skrip ini ( bashskrip), yang mungkin berguna bagi orang yang mencari untuk membatasi CPU untuk beberapa aplikasi.

Skrip baru ini juga memungkinkan Anda menentukan daftar yang berisi nama aplikasi dan batas CPU untuknya.

Perbedaan utama adalah bahwa Anda dapat menambahkan batas cpu per aplikasi, dan itu akan berjalan hanya sekali per aplikasi. Saya juga menambahkan opsi untuk membunuh semua cputhrottleproses.

Script mengasumsikan bahwa keduanya cputhrottledan pidofdiinstal sebelum menjalankannya.

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

Sumber:

fny
sumber
3
Seperti yang ditunjukkan dalam komentar lain , cputhrottleforumula telah dihapus dari Homebrew pada 17 Februari 2019 karena tidak berfungsi lagi . Yosemite adalah versi terakhir dari macOS yang didukung cputhrottle.
Casimir
@Casimir dan sekarang, apa yang harus dilakukan?
Peter Samokhin
@PeterSamokhin Maaf, saya tidak tahu alternatif. Tapi saya juga belum mencari baru-baru ini.
Casimir
15

Anda memang bisa! Ada CPUThrottle , yang memungkinkan untuk menentukan PID untuk dibatasi.

Catatan, mereka mencoba menggunakan sebanyak itu karena suatu alasan, ini adalah alat yang berguna tetapi apakah itu akan membuatnya lebih baik atau lebih buruk bagi Anda pada hari ke hari akan menjadi sesuatu yang Anda temukan.

Nicholas Smith
sumber
1
Menarik. Tetapi dengan utilitas ini saya harus meluncurkan sebuah program, menemukan PID (s) dan menggunakan cputhrottle secara manual. Setiap kali saya meluncurkannya. Apakah ada sesuatu yang memungkinkan saya untuk memberitahu sistem: "Mulai hari ini selalu jalankan program ini dengan maksimum 25% CPU"?
Pietro
Sejauh yang saya ketahui tidak, saya hanya pernah menemukan CPUThrottle.
Nicholas Smith
404 File tidak ditemukan
André Levy
11

Meskipun bukan jawaban langsung untuk pertanyaan OP, jika Anda mengalami masalah dengan proses tertentu yang menghabiskan terlalu banyak waktu CPU Anda, dan membuat komputer Anda tidak dapat digunakan, dan Anda tidak keberatan berapa lama proses itu untuk menyelesaikan tugas yang sedang dikerjakannya, Anda dapat menggunakan reniceuntuk mengubah prioritas proses itu, menjadikannya berperilaku baik (karenanya namanya).

Pertama, Anda perlu menemukan PID dari proses yang menggunakan sumber daya CPU. Anda dapat melakukannya di Monitor Aktivitas, atau di Terminal.app dengan psperintah - misalnya untuk menemukan PID browser Safari, ketik:

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

Baris kedua di atas adalah output, dan PID adalah 17452 dalam kasus khusus ini.

Kemudian, tugas selanjutnya adalah mengubah prioritas proses (misalkan Safari yang ingin kita jadikan berperilaku baik). Untuk melakukan ini, dalam jenis Terminal.app:

MacBook:~😈  renice -n 10 -p 17452

The -npilihan mengubah tingkat bagus dengan menambahkan 10 dengan nilai saat ini (0 secara default). Kisaran nilai adalah -20 hingga 20, dengan nilai terendah yang berarti prioritas tertinggi. Sebagai pengguna biasa, Anda dapat menggunakan nilai 0 hingga 20. Untuk menetapkan nilai negatif, Anda harus memiliki hak akses root (mis. Gunakan sudoperintah). Baca lebih lanjut tentang nicedan renicedengan mengetik man nicedan man renicedi Terminal.app.

nicedan renicetidak membatasi persentase CPU yang tersedia untuk aplikasi tertentu, mereka memperbolehkan untuk mengubah prioritas penjadwalan, atau dengan kata lain berapa banyak waktu CPU dari suatu proses akan didapat. Ini semua relatif terhadap beban CPU pada sistem Anda, jadi jika sistem ini kurang dimanfaatkan, Anda kemungkinan besar tidak akan melihat perbedaan.

mikrofon
sumber
Apakah ada cara untuk melihat prioritas proses saat ini?
theonlygusti
gunakan top atau htop untuk melihat nilai bagus dari suatu proses. (buat instal htop), (sudo apt install htop). Anda akan melihat salah satu kolom yang berisi nilai.
Tmanok
6

Ada satu garis sederhana untuk melakukan semua itu:

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

Tulis nama aplikasi Anda alih-alih Chromium dan persentase yang diinginkan alih-alih 10 dan Anda siap berangkat!

Yuriy Nasretdinov
sumber
Ini bekerja dengan baik, meskipun dapat dikurangi menjadi: pgrep Dropbox | sudo xargs -n 1 -I'{}' sh -c 'cputhrottle {} 10 &'. Namun saya tidak yakin apakah macOS sudah pgrepdiinstal.
bigsweater
5

Ini didasarkan pada jawaban sebelumnya, tetapi menambahkan jebakan untuk ctrl + c untuk memastikan proses yang dicekik akan dibiarkan dalam status melanjutkan, dan menambahkan set -eagar skrip ini akan keluar dengan bersih jika proses itu sendiri keluar:

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
pengguna100375
sumber
3

Tautan yang diposkan Nicholas Smith tidak berfungsi lagi. Jadi saya menemukan satu aplikasi lain yang berfungsi untuk orang-orang yang mencari lagi. aplikasi memanggil Apppolice.

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

John Wells
sumber
2
Mirip dengan AppPolice, ada AppTamer ( stclairsw.com/AppTamer ). Satu kata peringatan: pada saat saya menulis komentar ini, AppTamer belum kompatibel dengan OSX Sierra.
John Mark Mitchell
Ya ampun, sungguh menemukan. Baru saja menginstal AppTamer. Senang melaporkan bekerja dengan sangat baik. Saya menggunakannya untuk menjaga StarCraft baru di-remaster sejalan ketika saya alt-tab keluar. Oh dan saya lupa menyebutkan, saya menjalankan macOS Sierra 10.12.6. Terima kasih untuk sarannya!
iring
Apppolice telah dihentikan.
LаngLаngС
Tapi masih berfungsi dengan baik.
phil pirozhkov
3

Ini adalah skrip terakhir saya, tetap bersihkan perintah cputhrottle hanya jalankan yang baru jika tidak ada

#!/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
Alejo JM
sumber
3

Skrip yang Dimitri tulis tidak bekerja dengan baik (pada macOS), tetapi tetap berjalan dengan kesalahan setelah aplikasi ditutup. Saya mengubahnya untuk menyelesaikannya (dengan pesan kesalahan tentang PID tidak ditemukan):

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
Bart Meerdink
sumber
Ini mungkin merupakan suntingan yang dibuat untuk jawaban asli Dimitri, untuk meningkatkan jawaban itu, dan bukan jawaban terpisah dengan (pada dasarnya) info yang sama.
fsb
2

sh ini bekerja untuk saya

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
Dmitriy Buldakov
sumber