使用nice,cpulimit和cgroups限制程式CPU使用率

banq發表於2018-12-05

大多數程式以相同的優先順序啟動,Linux核心在處理器上均勻地為每個任務安排時間。有一個CPU密集型程式可以以較低的優先順序執行嗎?然後你需要告訴排程程式有關它!
至少有三種方法可以控制程式獲得的CPU時間:
  • 使用nice命令手動降低任務的優先順序。
  • 使用cpulimit命令重複暫停執行程式,使其不超過某個限制。
  • 使用Linux的內建控制組,這種機制告訴排程程式限制程式可用的資源量。


nice
nice命令調整程式的優先順序,使其執行頻率降低。當您需要將CPU密集型任務作為後臺或批處理作業執行時,這非常有用。程度範圍從-20(最有利的排程)到19(最不利的)。Linux上的程式預設情況下以0的良好狀態啟動。nice命令(沒有任何附加引數)將啟動一個程度為10的程式。在該級別,排程程式將其視為優先順序較低的任務併為其提供較少的CPU資源。

Nice有一個名為的相關命令renice。它改變了已經執行的程式的niceness級別。要使用它,找出佔用所有CPU時間的程式的PID(使用ps),然後執行renice:

renice +10 1234

其中1234是PID。

CPULimit
cpulimit工具透過以不同的間隔暫停程式來限制程式的CPU使用率,以使其保持在定義的上限之下。它透過向程式傳送SIGSTOP和SIGCONT訊號來實現此目的。它不會更改nice程式的值,而是監視和控制實際的CPU使用情況。
當您想要確保程式不使用超過CPU的某個部分時,cpulimit非常有用。
相比nice的缺點是當系統空閒時,程式無法使用所有可用的CPU時間。

安裝:

wget -O cpulimit.zip https://github.com/opsengine/cpulimit/archive/master.zip
unzip cpulimit.zip
cd cpulimit-master
make
sudo cp src/cpulimit /usr/bin


上面的命令將從GitHub下載原始碼,解壓縮歸檔檔案,構建二進位制檔案並將其複製到/usr/bin。
cpulimit的使用類似nice的方式,但是您需要使用'-l'引數顯式定義程式的最大CPU限制。

可以透過使用'-p'引數指定其PID來限制當前正在執行的程式。例如

cpulimit -l 50 -p 1234

其中1234是PID。

cgroup
控制組(cgroup)是Linux核心功能,允許您指定核心應如何將特定資源分配給一組程式。使用cgroup,您可以指定駐留在特定組中的程式可以使用多少CPU時間,系統記憶體,網路頻寬或這些資源的組合。

控制組的優勢超過nice或者cpulimit是限制應用於一組程式,而不是僅應用於一個程式。此外,nice或cpulimit僅限制程式的CPU使用率,而cgroup可以限制其他程式資源。

透過明智地使用cgroup,可以控制伺服器的整個子系統的資源。例如,在為大規模伺服器部署而設計的最小Linux發行版CoreOS中,升級過程由cgroup控制。這意味著下載和安裝系統更新不會影響系統效能。
 

相關文章