天天看點

centos使用 nice、cpulimit 和 cgroups 限制 cpu 占用率

3種控制程序運作時間的方法:

  • 使用 nice 指令手動降低任務的優先級。
  • 使用 cpulimit 指令不斷的暫停程序,以控制程序所占用處理能力不超過特定限制。
  • 使用linux内建的control groups(控制組)功能,它提供了限制程序資源消耗的機制。

模拟高cpu占用率

在分析這3種技術前,我們要先安裝一個工具來模拟高CPU占用率的場景。我們會用到CentOS作為測試系統,并使用Mathomatic toolkit中的質數生成器來模拟CPU負載。

在CentOS上這個工具沒有預編譯好的版本,是以必須要從源碼進行安裝。先從 http://mathomatic.orgserve.de/mathomatic-16.0.5.tar.bz2 這個連結下載下傳源碼包并解壓。然後進入 mathomatic-16.0.5/primes 檔案夾,運作 make 和 sudo make install 進行編譯和安裝。這樣,就把matho-primes 程式安裝到了 /usr/local/bin 目錄中。

接下來,通過指令行運作:

  1. /usr/local/bin/matho-primes 0 9999999999 > /dev/null &

程式運作後,将輸出從0到9999999999之間的質數。因為我們并不需要這些輸出結果,直接将輸出重定向到/dev/null就好。

現在,使用top指令就可以看到matho-primes程序榨幹了你所有的cpu資源。

centos使用 nice、cpulimit 和 cgroups 限制 cpu 占用率

好了,接下來(按q鍵)退出 top 并殺掉 matho-primes 程序(使用 fg 指令将程序切換到前台,再按 CTRL+C)

nice指令

下來介紹一下nice指令的使用方法,nice指令可以修改程序的優先級,這樣就可以讓程序運作得不那麼頻繁。 這個功能在運作cpu密集型的背景程序或批處理作業時尤為有用。 nice值的取值範圍是[-20,19],-20表示最高優先級,而19表示最低優先級。 Linux程序的預設nice值為0。使用nice指令(不帶任何參數時)可以将程序的nice值設定為10。這樣排程器就會将此程序視為較低優先級的程序,進而減少cpu資源的配置設定。

下面來看一個例子,我們同時運作兩個 matho-primes 程序,一個使用nice指令來啟動運作,而另一個正常啟動運作:

  1. nice matho-primes 0 9999999999 > /dev/null &
  2. matho-primes 0 9999999999 > /dev/null &

再運作top指令。

centos使用 nice、cpulimit 和 cgroups 限制 cpu 占用率

看到沒,正常運作的程序(nice值為0)獲得了更多的cpu運作時間,相反的,用nice指令運作的程序占用的cpu時間會較少(nice值為10)。

在實際使用中,如果你要運作一個CPU密集型的程式,那麼最好用nice指令來啟動它,這樣就可以保證其他程序獲得更高的優先級。 也就是說,即使你的伺服器或者桌上型電腦在重載的情況下,也可以快速響應。

nice 還有一個關聯指令叫做 renice,它可以在運作時調整程序的 nice 值。使用 renice 指令時,要先找出程序的 PID。下面是一個例子:

  1. renice +10 1234

其中,1234是程序的 PID。

測試完 nice 和 renice 指令後,記得要将 matho-primes 程序全部殺掉。

cpulimit指令

接下來介紹 cpulimit 指令的用法。 cpulimit 指令的工作原理是為程序預設一個 cpu 占用率門限,并實時監控程序是否超出此門限,若超出則讓該程序暫停運作一段時間。cpulimit 使用 SIGSTOP 和 SIGCONT 這兩個信号來控制程序。它不會修改程序的 nice 值,而是通過監控程序的 cpu 占用率來做出動态調整。

cpulimit 的優勢是可以控制程序的cpu使用率的上限值。但與 nice 相比也有缺點,那就是即使 cpu 是空閑的,程序也不能完全使用整個 cpu 資源。

在 CentOS 上,可以用下面的方法來安裝它:

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

上面的指令行,會先從從 GitHub 上将源碼下載下傳到本地,然後再解壓、編譯、并安裝到 /usr/bin 目錄下。

cpulimit 的使用方式和 nice 指令類似,但是需要使用者使用 -l 選項顯式地定義程序的 cpu 使用率上限值。舉例說明:

  1. cpulimit -l 50 matho-primes 0 9999999999 > /dev/null &
centos使用 nice、cpulimit 和 cgroups 限制 cpu 占用率

從上面的例子可以看出 matho-primes 隻使用了50%的 cpu 資源,剩餘的 cpu 時間都在 idle。

cpulimit 還可以在運作時對程序進行動态限制,使用 -p 選項來指定程序的 PID,下面是一個執行個體:

  1. cpulimit -l 50 -p 1234

其中,1234是程序的 PID。

cgroups 指令集

最後介紹,功能最為強大的控制組(cgroups)的用法。cgroups 是 Linux 核心提供的一種機制,利用它可以指定一組程序的資源配置設定。 具體來說,使用 cgroups,使用者能夠限定一組程序的 cpu 占用率、系統記憶體消耗、網絡帶寬,以及這幾種資源的組合。

對比nice和cpulimit,cgroups 的優勢在于它可以控制一組程序,不像前者僅能控制單程序。同時,nice 和 cpulimit 隻能限制 cpu 使用率,而 cgroups 則可以限制其他程序資源的使用。

對 cgroups 善加利用就可以控制好整個子系統的資源消耗。就拿 CoreOS 作為例子,這是一個專為大規模伺服器部署而設計的最簡化的 Linux 發行版本,它的 upgrade 程序就是使用 cgroups 來管控。這樣,系統在下載下傳和安裝更新版本時也不會影響到系統的性能。

下面做一下示範,我們将建立兩個控制組(cgroups),并對其配置設定不同的 cpu 資源。這兩個控制組分别命名為“cpulimited”和“lesscpulimited”。

使用 cgcreate 指令來建立控制組,如下所示:

  1. sudo cgcreate -g cpu:/cpulimited
  2. sudo cgcreate -g cpu:/lesscpulimited

其中“-g cpu”選項用于設定 cpu 的使用上限。除 cpu 外,cgroups 還提供 cpuset、memory、blkio 等控制器。cpuset 控制器與 cpu 控制器的不同在于,cpu 控制器隻能限制一個 cpu 核的使用率,而 cpuset 可以控制多個 cpu 核。

cpu 控制器中的 cpu.shares 屬性用于控制 cpu 使用率。它的預設值是 1024,我們将 lesscpulimited 控制組的 cpu.shares 設為1024(預設值),而 cpulimited 設為512,配置後核心就會按照2:1的比例為這兩個控制組配置設定資源。

要設定 cpulimited 組的 cpu.shares 為 512,輸入以下指令:

  1. sudo cgset -r cpu.shares=512 cpulimited

使用 cgexec 指令來啟動控制組的運作,為了測試這兩個控制組,我們先用cpulimited 控制組來啟動 matho-primes 程序,指令行如下:

  1. sudo cgexec -g cpu:cpulimited/usr/local/bin/matho-primes09999999999>/dev/null&

打開 top 可以看到,matho-primes 程序占用了所有的 cpu 資源。

centos使用 nice、cpulimit 和 cgroups 限制 cpu 占用率

因為隻有一個程序在系統中運作,不管将其放到哪個控制組中啟動,它都會盡可能多的使用cpu資源。cpu 資源限制隻有在兩個程序争奪cpu資源時才會生效。

那麼,現在我們就啟動第二個 matho-primes 程序,這一次我們在 lesscpulimited 控制組中來啟動它:

  1. sudo cgexec -g cpu:lesscpulimited/usr/local/bin/matho-primes09999999999>/dev/null&

再打開 top 就可以看到,cpu.shares 值大的控制組會得到更多的 cpu 運作時間。

centos使用 nice、cpulimit 和 cgroups 限制 cpu 占用率

現在,我們再在 cpulimited 控制組中增加一個 matho-primes 程序:

  1. sudo cgexec -g cpu:cpulimited/usr/local/bin/matho-primes09999999999>/dev/null&
centos使用 nice、cpulimit 和 cgroups 限制 cpu 占用率

看到沒,兩個控制組的 cpu 的占用率比例仍然為2:1。其中,cpulimited 控制組中的兩個 matho-primes 程序獲得的cpu 時間基本相當,而另一組中的 matho-primes 程序顯然獲得了更多的運作時間。

更多的使用方法,可以在 Red Hat 上檢視詳細的 cgroups 使用說明。(當然CentOS 7也有)

使用Scout來監控cpu占用率

監控cpu占用率最為簡單的方法是什麼?Scout 工具能夠監控能夠自動監控程序的cpu使用率和記憶體使用情況。

centos使用 nice、cpulimit 和 cgroups 限制 cpu 占用率

Scout的觸發器(trigger)功能還可以設定 cpu 和記憶體的使用門限,超出門限時會自動産生報警。

從這裡可以擷取 Scout 的試用版。

總結

計算機的系統資源是非常寶貴的。上面介紹的這3個工具能夠幫助大家有效地管理系統資源,特别是cpu資源:

  • nice可以一次性調整程序的優先級。
  • cpulimit在運作cpu密集型任務且要保持系統的響應性時會很有用。
  • cgroups是資源管理的瑞士軍刀,同時在使用上也很靈活。

繼續閱讀