Linux內(nèi)核是一名了不起的馬戲表演者,它在進程和系統(tǒng)資源間小心地玩著雜耍,并保持系統(tǒng)的正常運轉(zhuǎn)。 同時,內(nèi)核也很公正:它將資源公平地分配給各個進程。
但是,如果你需要給一個重要進程提高優(yōu)先級時,該怎么做呢? 或者是,如何降低一個進程的優(yōu)先級? 又或者,如何限制一組進程所使用的資源呢?
答案是需要由用戶來為內(nèi)核指定進程的優(yōu)先級
大部分進程啟動時的優(yōu)先級是相同的,因此Linux內(nèi)核會公平地進行調(diào)度。 如果想讓一個CPU密集型的進程運行在較低優(yōu)先級,那么你就得事先配置好調(diào)度器。
下面介紹3種控制進程運行時間的方法:
- 使用 nice 命令手動降低任務(wù)的優(yōu)先級。
使用 cpulimit 命令不斷的暫停進程,以控制進程所占用處理能力不超過特定限制。
使用linux內(nèi)建的control groups(控制組)功能,它提供了限制進程資源消耗的機制。
我們來看一下這3個工具的工作原理和各自的優(yōu)缺點。
模擬高cpu占用率
在分析這3種技術(shù)前,我們要先安裝一個工具來模擬高CPU占用率的場景。我們會用到CentOS作為測試系統(tǒng),并使用Mathomatic toolkit中的質(zhì)數(shù)生成器來模擬CPU負載。
很不幸,在CentOS上這個工具沒有預(yù)編譯好的版本,所以必須要從源碼進行安裝。先從 http://mathomatic.orgserve.de/mathomatic-16.0.5.tar.bz2 這個鏈接下載源碼包并解壓。然后進入 mathomatic-16.0.5/primes 文件夾,運行 make 和 sudo make install 進行編譯和安裝。這樣,就把 matho-primes 程序安裝到了 /usr/local/bin 目錄中。
接下來,通過命令行運行:
/usr/local/bin/matho-primes 0 9999999999 > /dev/null
程序運行后,將輸出從0到9999999999之間的質(zhì)數(shù)。因為我們并不需要這些輸出結(jié)果,直接將輸出重定向到/dev/null就好。
現(xiàn)在,使用top命令就可以看到matho-primes進程榨干了你所有的cpu資源。
好了,接下來(按q鍵)退出 top 并殺掉 matho-primes 進程(使用 fg 命令將進程切換到前臺,再按 CTRL+C)
nice命令
下面介紹一下nice命令的使用方法,nice命令可以修改進程的優(yōu)先級,這樣就可以讓進程運行得不那么頻繁。 這個功能在運行cpu密集型的后臺進程或批處理作業(yè)時尤為有用。 nice值的取值范圍是[-20,19],-20表示最高優(yōu)先級,而19表示最低優(yōu)先級。 Linux進程的默認nice值為0。使用nice命令(不帶任何參數(shù)時)可以將進程的nice值設(shè)置為10。這樣調(diào)度器就會將此進程視為較低優(yōu)先級的進程,從而減少cpu資源的分配。
下面來看一個例子,我們同時運行兩個 matho-primes 進程,一個使用nice命令來啟動運行,而另一個正常啟動運行:
nice matho-primes 0 9999999999 > /dev/null
matho-primes 0 9999999999 > /dev/null
再運行top命令。
看到?jīng)],正常運行的進程(nice值為0)獲得了更多的cpu運行時間,相反的,用nice命令運行的進程占用的cpu時間會較少(nice值為10)。
在實際使用中,如果你要運行一個CPU密集型的程序,那么最好用nice命令來啟動它,這樣就可以保證其他進程獲得更高的優(yōu)先級。 也就是說,即使你的服務(wù)器或者臺式機在重載的情況下,也可以快速響應(yīng)。
nice 還有一個關(guān)聯(lián)命令叫做 renice,它可以在運行時調(diào)整進程的 nice 值。使用 renice 命令時,要先找出進程的 PID。下面是一個例子:
renice +10 1234
其中,1234是進程的 PID。
測試完 nice 和 renice 命令后,記得要將 matho-primes 進程全部殺掉。
cpulimit命令
接下來介紹 cpulimit 命令的用法。 cpulimit 命令的工作原理是為進程預(yù)設(shè)一個 cpu 占用率門限,并實時監(jiān)控進程是否超出此門限,若超出則讓該進程暫停運行一段時間。cpulimit 使用 SIGSTOP 和 SIGCONT 這兩個信號來控制進程。它不會修改進程的 nice 值,而是通過監(jiān)控進程的 cpu 占用率來做出動態(tài)調(diào)整。
cpulimit 的優(yōu)勢是可以控制進程的cpu使用率的上限值。但與 nice 相比也有缺點,那就是即使 cpu 是空閑的,進程也不能完全使用整個 cpu 資源。
在 CentOS 上,可以用下面的方法來安裝它:
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 使用率上限值。舉例說明:
cpulimit -l 50 matho-primes 0 9999999999 > /dev/null
從上面的例子可以看出 matho-primes 只使用了50%的 cpu 資源,剩余的 cpu 時間都在 idle。
cpulimit 還可以在運行時對進程進行動態(tài)限制,使用 -p 選項來指定進程的 PID,下面是一個實例:
cpulimit -l 50 -p 1234
其中,1234是進程的 PID。
cgroups 命令集
最后介紹,功能最為強大的控制組(cgroups)的用法。cgroups 是 Linux 內(nèi)核提供的一種機制,利用它可以指定一組進程的資源分配。 具體來說,使用 cgroups,用戶能夠限定一組進程的 cpu 占用率、系統(tǒng)內(nèi)存消耗、網(wǎng)絡(luò)帶寬,以及這幾種資源的組合。
對比nice和cpulimit,cgroups 的優(yōu)勢在于它可以控制一組進程,不像前者僅能控制單進程。同時,nice 和 cpulimit 只能限制 cpu 使用率,而 cgroups 則可以限制其他進程資源的使用。
對 cgroups 善加利用就可以控制好整個子系統(tǒng)的資源消耗。就拿 CoreOS 作為例子,這是一個專為大規(guī)模服務(wù)器部署而設(shè)計的最簡化的 Linux 發(fā)行版本,它的 upgrade 進程就是使用 cgroups 來管控。這樣,系統(tǒng)在下載和安裝升級版本時也不會影響到系統(tǒng)的性能。
下面做一下演示,我們將創(chuàng)建兩個控制組(cgroups),并對其分配不同的 cpu 資源。這兩個控制組分別命名為“cpulimited”和“lesscpulimited”。
使用 cgcreate 命令來創(chuàng)建控制組,如下所示:
sudo cgcreate -g cpu:/cpulimited
sudo cgcreate -g cpu:/lesscpulimited
其中“-g cpu”選項用于設(shè)定 cpu 的使用上限。除 cpu 外,cgroups 還提供 cpuset、memory、blkio 等控制器。cpuset 控制器與 cpu 控制器的不同在于,cpu 控制器只能限制一個 cpu 核的使用率,而 cpuset 可以控制多個 cpu 核。
cpu 控制器中的 cpu.shares 屬性用于控制 cpu 使用率。它的默認值是 1024,我們將 lesscpulimited 控制組的 cpu.shares 設(shè)為1024(默認值),而 cpulimited 設(shè)為512,配置后內(nèi)核就會按照2:1的比例為這兩個控制組分配資源。
要設(shè)置 cpulimited 組的 cpu.shares 為 512,輸入以下命令:
sudo cgset -r cpu.shares=512 cpulimited
使用 cgexec 命令來啟動控制組的運行,為了測試這兩個控制組,我們先用cpulimited 控制組來啟動 matho-primes 進程,命令行如下:
sudo cgexec -g cpu:cpulimited /usr/local/bin/matho-primes 0 9999999999 > /dev/null
打開 top 可以看到,matho-primes 進程占用了所有的 cpu 資源。
因為只有一個進程在系統(tǒng)中運行,不管將其放到哪個控制組中啟動,它都會盡可能多的使用cpu資源。cpu 資源限制只有在兩個進程爭奪cpu資源時才會生效。
那么,現(xiàn)在我們就啟動第二個 matho-primes 進程,這一次我們在 lesscpulimited 控制組中來啟動它:
sudo cgexec -g cpu:lesscpulimited /usr/local/bin/matho-primes 0 9999999999 > /dev/null
再打開 top 就可以看到,cpu.shares 值大的控制組會得到更多的 cpu 運行時間。
現(xiàn)在,我們再在 cpulimited 控制組中增加一個 matho-primes 進程:
sudo cgexec -g cpu:cpulimited /usr/local/bin/matho-primes 0 9999999999 > /dev/null
看到?jīng)],兩個控制組的 cpu 的占用率比例仍然為2:1。其中,cpulimited 控制組中的兩個 matho-primes 進程獲得的cpu 時間基本相當(dāng),而另一組中的 matho-primes 進程顯然獲得了更多的運行時間。
更多的使用方法,可以在 Red Hat 上查看詳細的 cgroups 使用說明。(當(dāng)然CentOS 7也有)
使用Scout來監(jiān)控cpu占用率
監(jiān)控cpu占用率最為簡單的方法是什么?Scout 工具能夠監(jiān)控能夠自動監(jiān)控進程的cpu使用率和內(nèi)存使用情況。
Scout的觸發(fā)器(trigger)功能還可以設(shè)定 cpu 和內(nèi)存的使用門限,超出門限時會自動產(chǎn)生報警。
從這里可以獲取 Scout 的試用版。
總結(jié)
計算機的系統(tǒng)資源是非常寶貴的。上面介紹的這3個工具能夠幫助大家有效地管理系統(tǒng)資源,特別是cpu資源:
- nice可以一次性調(diào)整進程的優(yōu)先級。
cpulimit在運行cpu密集型任務(wù)且要保持系統(tǒng)的響應(yīng)性時會很有用。
cgroups是資源管理的瑞士軍刀,同時在使用上也很靈活。