我想限制專用於某些進程(例如Firefox,Safari等)的CPU時間。
我什至不理解為什麼這樣的程序,即使不使用也是如此(沒有加載,沒有動畫,在後台運行,...),非常耗資源。為什麼瀏覽器必須佔用我50%或更多的CPU?我可以限制為10%嗎?
我想限制專用於某些進程(例如Firefox,Safari等)的CPU時間。
我什至不理解為什麼這樣的程序,即使不使用也是如此(沒有加載,沒有動畫,在後台運行,...),非常耗資源。為什麼瀏覽器必須佔用我50%或更多的CPU?我可以限制為10%嗎?
cputhrottle
是您需要的工具。您可以使用 Homebrew安裝它。
您可以通過運行以下Bash腳本來按名稱監視一系列進程。我不太確定如何將其轉換為登錄項,因為 cputhrottle
需要超級用戶權限。在Automator工作流程中,將其作為腳本運行,無論如何:
##從Activity Monitor獲取流程/應用程序名稱並將其放在此處apps =(“ AppOne”“ AppTwo”“ AppThree”)#在true時在此處設置各自的限制limits = {30 40 50);在$ {apps}中為app做;為$ {limits}做限制;為$(pgrep $ {app})中的pid做;做sudo / path / to / cputhrottle $ {pid} $ {limit}做完donedone
[編輯]
我為此腳本添加了其他版本(一個 bash
腳本),對於那些希望限制多個應用程序的CPU的人可能有用。
此新腳本還允許您指定一個包含應用程序名稱和名稱的列表。
主要區別是您可以為每個應用程序添加cpu限制,並且每個應用程序只能運行一次。我還添加了用於殺死所有 cputhrottle
進程的選項。
腳本假定 cputhrottle
和 pidof
都是
#!/ bin / bashif [[$ EUID > 0]];然後回顯“請以root / sudo身份運行此腳本”退出1fi#將--kill作為參數殺死所有正在運行的cputhrottlesif [$ 1 =“ --kill”];然後在$ {pids}中回顯“正在運行cputhrottles ...” pids =`pidof cputhrottle`;執行echo“ > Killing PID $ {pid}” sudo kill $ {pid}完成echo“完成!”退出0 'webstorm; 40'applications [4] ='Safari; 35'for i in“ $ {applications [@]}” ;;做app =($ {i //; /})app_name = $ {app [0]} cpu_limit = $ {app [1]}
printf“ \ n正在尋找$ {app_name} ... \ n” pids =`pidof $ {app}`為$ {pids}中的pid;做echo“ > PID = $ {pid},CPU = $ {cpu_limit}” sudo cputhrottle $ {pid} $ {cpu_limit} & donedoneprintf“ \ nDone!\ n” echo“運行此腳本,將'--kill'作為參數刪除所有cputhrottles。”
來源:
您確實可以! 有CPUThrottle,它允許指定要限制的PID。
請注意,由於某種原因,他們正試圖大量使用它,這是一個有用的工具,但是它是否會使您每天都會發現對您來說好還是壞。
儘管不是OP問題的直接答案,但是如果您遇到特定進程的問題,該進程佔用了過多的CPU時間,並使計算機無法使用,並且您不介意該進程花費了多長時間要完成正在執行的任務,可以使用 renice
更改該進程的優先級,使其表現良好(因此得名)。
首先,您需要找到正在消耗CPU資源的進程的PID。您可以在活動監視器中或使用 ps
命令在Terminal.app中執行此操作-例如要查找Safari瀏覽器的PID,請輸入:
MacBook:〜ps -ef | grep Safari 501 17452 263 0 11:36 pm ?? 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用戶特權(例如,使用 sudo
命令)。在Terminal.app中鍵入 man nice
和 man renice
,了解有關 nice
和 renice
的更多信息。
nice
和 renice
本身並不限制可用於給定應用程序的CPU的百分比,但是它們確實允許更改調度優先級,或者話說一個進程將獲得多少CPU時間。這都是與系統上的CPU負載有關的,因此,如果系統未充分利用,您很可能看不到任何區別。
這不完全是您想要的,但就Google驅動器和Chrome而言,這對我有什麼幫助:
Google驅動器(“備份和同步”)
取消優先級:
,用於$ {做renice +20 -p $ f;完成
設置回正常:
在$(pgrep'Backup and Sync'; pgrep'FinderSyncAPIExtension' );做renice 0 -p $ f;已完成
Chrome
取消對當前所有進程的優先級:在$ {pgrep'Chrome')中為f的p>
;做renice +20 -p $ f;完成
設置為所有當前當前進程正常:
for $(pgrep'Chrome')中的f;做renice 0 -p $ f;完成
尼古拉斯·史密斯(Nicholas Smith)發布的鏈接不再起作用。因此,我發現了另一個應用程序,該應用程序可以為再次搜索該應用程序的人們提供幫助。該應用程序將調用Apppolice。
有一個簡單的單行代碼可以完成所有操作:
ps axu |grep鉻|grep -v grep |awk'{print $ 2}'|sudo xargs -n 1 -I'{}'sh -c'cputhrottle {} 10 &'
輸入您的應用名稱(而不是Chromium)和所需的百分比(而不是10),就可以了!
這是基於先前的答案,但是添加了ctrl + c的陷阱以確保被節流的進程保持在繼續狀態,並添加 set -e
,因此此腳本將退出如果進程本身退出,將完全清除:
陷阱ctrl_c_fn INT
函數ctrl_c_fn(){
迴聲“捕獲到CTRL-C,退出”
殺死-SIGCONT $ pid
出口
}
回顯“輸入進程ID”
讀pid
回顯“按Ctrl-C退出”
設置-e
雖然是真的做
殺死-SIGSTOP $ pid
睡眠0.009
殺死-SIGCONT $ pid
睡眠0.001
完成
這對我有用
回顯“輸入進程ID”,讀回顯為“按Ctrl-C退出”,但為true;殺死-SIGSTOP $ pid sleep 0.009殺死-SIGCONT $ pid sleep 0.001done
這是我的最終腳本,請保持命令cputhrottle的清潔 僅在不存在的情況下執行新的操作
#!/ bin / bash
###
#設置cputhrottle如果不存在
###
set_service_cpu_limit(){
service_pid = $(pgrep $ 1)
限額= $ 2
如果[[!-z $ service_pid]];然後
service_cpu = $(ps aux | grep“ sudo cputhrottle $ service_pid $ limit” | grep -v grep | wc -l)
如果[[!$ service_cpu -gt 0]];然後
sudo cputhrottle $ service_pid $ limit &
科幻
科幻
}
###
#主循環
###
雖然是真的做
set_service_cpu_limit bzfilelist 2
set_service_cpu_limit bztransmit 2
睡0.5
完成
Dimitri編寫的腳本運行良好(在macOS上),但是在關閉應用程序後,該腳本始終運行並顯示錯誤。我對其進行了更改以使其完成(未找到有關PID的錯誤消息):
echo“輸入進程ID”
讀pid
回顯“按Ctrl-C退出”
而殺死-SIGSTOP $ pid;做
睡眠0.009
殺死-SIGCONT $ pid
睡眠0.001
做完了
我使用 AppPolice。這有點不穩定和笨拙,但是由於沒有其他選擇,而且問題很小,我認為這是一個不錯的解決方案。在Catalina上工作。
cputhrottle
(請參閱fny和Nicholas Smith的答案)就可以在macOS 10.15上運行。
您可以按照此處列出的步驟簡單快速地進行操作: https://web.archive.org/web/20191223180139/https://sourceware.org/gdb/wiki/PermissionsDarwin
您可以在此處下載 cputhrottle
: http://www.willnolan.com/cputhrottle/cputhrottle.html