CPULimit 是一個可以用來限制程式 CPU 使用量的小工具,我們可以用他來調節 CPU 的用量,避免 CPU 被某些程式佔用。
在 Linux 系統上執行一個比較需要 CPU 計算的程式時,在沒有特殊的限制之下,程式會盡可能使用系統上剩餘的 CPU 資源,也就是說如果沒有別的程式同時在使用 CPU 的話,100% 的 CPU 資源都會被該程式佔用,如果想要限制程式不要佔用太多的 CPU 資源,就可以使用 CPULimit 這個小工具。
安裝 CPULimit
CPULimit 並不是系統內建的工具使用前要先安裝。在 Debian 或 Ubuntu 系列的 Linux 中,可以使用 apt 來安裝:
sudo apt-get install cpulimit
若在 CentOS Linux 中,可在啟用 EPEL 套件庫後,再以 yum 安裝:
sudo yum install cpulimit
限制程式 CPU 使用率
CPULimit 可以限制任何程式的 CPU 使用率,這裡我們拿一行簡單的 md5sum
指令作為示範:
# 非常耗費 CPU 的程式md5sum /dev/urandom
這行指令會從 /dev/urandom
讀取亂數的資料,計算其 MD5 檢查碼,這個指令非常耗費 CPU,而且試算不完的,若要中止此程式,請按下 Ctrl
+ c
。
在這行 md5sum
指令執行之後,我們可以使用 top
指令查看目前系統的狀況,此時 md5sum
的 CPU 用量應該會接近 100%。
top
畫面
如果想要讓這個 md5sum
程式不要吃掉太多的 CPU 資源,可以使用 cpulimit
來限制其 CPU 用量:
# 限制 PID 為 21203 的程式其 CPU 用量上限為 50%cpulimit --pid 21203 --limit 50
執行之後,該程式的 CPU 用量就會被控制在 50% 左右。
top
畫面
另外也可以使用程式的名稱來指定要調整 CPU 用量的程式:
# 以程式名稱來指定cpulimit --exe md5sum --limit 50
或是以絕對路徑的方式來指定,這樣可以避免不同程式有相同名稱的問題:
# 以程式名稱來指定cpulimit --path /usr/bin/md5sum --limit 50
由於 cpulimit
可在目標程式執行之後再調整 CPU 用量,所以我們可以在發現 CPU 滿載時動態調整,非常方便。
如果在程式執行前就已經確定要調整 CPU 用量,也可以直接以 cpulimit
來執行程式,例如:
# 以 cpulimit 直接執行程式cpulimit --limit 50 -- md5sum /dev/urandom
背景執行
cpulimit
在執行時也會佔用一個終端機,若想讓 cpulimit
在背景執行,可加上 --background
參數:
# 將 cpulimit 放在背景執行cpulimit --pid 21203 --limit 50 --background
中止 CPU 用量過高的程式
cpulimit
配合 --limit
參數可以限制程式的 CPU 用量上限值,如果程式超過這個上限值,預設會調節 CPU 用量,而如果想要在 CPU 用量過高時直接中止程式,可以加上 --kill
參數:
# 中止 CPU 用量過高的程式cpulimit --pid 21203 --limit 50 --kill
自動離開
在預設的狀況下,cpulimit
在執行時若沒有發現指定的程式(或是指定的程式已經中止了),它還是會持續等待並監控系統的行程,只要有發現符合條件的程式,就會繼續進行 CPU 用量的控制。
若想讓 cpulimit
在找不到目標程式時自動離開,可以加上 --lazy
參數:
# 若找不到 md5sum,則離開cpulimit --exe md5sum --limit 50 --lazy
實用範例
在撰寫 bash 指令稿時,我們可以先執行一個程式,緊接著從 bash 的 $!
變數讀取出前一個執行程式的 PID,這樣就可以不需要在手動查出程式的 PID 了:
# 執行程式md5sum /dev/urandom &# 限制上一個執行程式的 CPU 用量cpulimit --pid $! --limit 50
一般的使用者只能調整自己程式的 CPU 用量,如果以系統管理者權限執行的話,就可以調整所有人的程式 CPU 用量。