CPULimit 限制 Linux 程式 CPU 使用率教學

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 用量。

參考資料:TecmintOSTechNix

Linux

2 Comments

  1. Tzu Yau, Lin

    標題應該要改成cpulimit喔,不是罩杯的限制 🙂

Leave a Reply