使用 nice、cpulimit 和cgroups 獲取進(jìn)程的 CPU 使用率
Linux內(nèi)核是一個令人難以置信的馬戲團(tuán)的表演者,可以很小心的玩弄許多進(jìn)程和它們的資源需求,來保證你的服務(wù)器一直嗡嗡作響。內(nèi)核也是關(guān)于公平的一切:當(dāng)有資源競爭時,內(nèi)核試圖公平的分發(fā)這些資源。
然而,如果你有一個需要優(yōu)先級的重要進(jìn)程怎么辦?一個低優(yōu)先級的進(jìn)程呢?或者,限制一組進(jìn)程的資源呢?
這需要你的幫助,因為沒有你的幫助,內(nèi)核是無法知道哪些是CPU的關(guān)鍵進(jìn)程。
所有進(jìn)程最開始都擁有相同的優(yōu)先級,Linux內(nèi)核會為每個任務(wù)分配均勻的CPU調(diào)度時間??偛荒茏屢粋€CPU密集型的進(jìn)程只運行在低優(yōu)先級吧?所以,你需要告訴調(diào)度器你需要怎么樣的優(yōu)先級。
最少可以有三種方法來控制我們可以為進(jìn)程獲得多少CPU時間:
-
使用 nice 命令手動降低任務(wù)的優(yōu)先級。
-
使用 cpulimit 命令來反復(fù)掛起進(jìn)程,使進(jìn)程不超過一定的時間限制。
-
使用 Linux's 內(nèi)置的 control groups, control groups是一種告訴調(diào)度器去限制進(jìn)程能獲取的資源數(shù)量的機(jī)制。
下面我們來看一下這些方法如何工作,還有它們的優(yōu)缺點。
模擬CPU高使用率
在看這幾個方法前,我們需要找一個工具來模擬系統(tǒng)上CPU負(fù)載的情況。我們將使用CentOS作為測試操作系統(tǒng),然后,為了能人為地加大處理器的負(fù)荷,我們可以使用來自Mathomatic toolkit 質(zhì)數(shù)生成器。
因為在CentOS上并沒有現(xiàn)成的質(zhì)數(shù)生成器的包,所以我們需要手工編譯一下。從http://mathomatic.orgserve.de /mathomatic-16.0.5.tar.bz2 下載源碼,然后解壓。切換目錄到 mathomatic-16.0.5/primes. 運行 make && sudo make install進(jìn)行編譯和安裝.完成后,可執(zhí)行文件就會在 /usr/local/bin 目錄下。
運行下面的命令:
- /usr/local/bin/matho-primes 0 9999999999 > /dev/null &
這個命令會生成一個從0到999999999的質(zhì)數(shù)列表。這個列表我們并不需要保存,所以結(jié)果輸出到 /dev/null。
現(xiàn)在運行一個top命令,可以看到 matho-primes 進(jìn)程正在使用所有可用的CPU資源。
退出 top (按 q 鍵) ,然后kill掉matho-primes進(jìn)程 (使用 fg命令把進(jìn)程推到前臺,然后按 CTRL+C )。
nice
nice 命令會調(diào)整進(jìn)程的優(yōu)先級,這樣這個進(jìn)程就不會經(jīng)常運行。當(dāng)你需要運行一個CPU密集型的后臺任務(wù)或者批處理任務(wù)的時候,這是非常有用的。niceness 值(注:調(diào)度優(yōu)先級)范圍從-20 (優(yōu)先級最高) 到 19 (優(yōu)先級最低)。 Linux上,進(jìn)程的優(yōu)先級默認(rèn)是0。nice命令(沒有額外參數(shù)) 會以10的優(yōu)先級來啟動進(jìn)程。這個優(yōu)先級下,調(diào)度器會把這個任務(wù)看作一個低優(yōu)先級的任務(wù)并且分配較少的CPU資源。
啟動兩個matho-primes任務(wù), 一個使用nice,一個不使用nice:
- nice matho-primes 0 9999999999 > /dev/null &
- matho-primes 0 9999999999 > /dev/null &
現(xiàn)在看一下 top 。
注意觀察沒有使用nice啟動的進(jìn)程(優(yōu)先級為0的進(jìn)程)獲得了更多的處理器時間,相反,使用nice啟動,優(yōu)先級為10的進(jìn)程則獲得了很少處理器時間。
這有什么實際意義呢?如果你要運行一個CPU密集型任務(wù),你可以使用nice啟動它,接下來,調(diào)度器就總會讓其他任務(wù)的優(yōu)先級比它高。這意味著,即使服務(wù)器(或者桌面系統(tǒng))在高負(fù)荷下仍然能夠保持響應(yīng)。
Nice有一個相關(guān)的命令叫 renice。 這個命令可以重新改變一個正在運行中的進(jìn)程的優(yōu)先級。使用方法,找出占用CPU時間的進(jìn)程的PID(使用ps命令),然后運行 renice:
- renice +10 1234
這里, 1234 就是進(jìn)程的PID.
在完成實驗后,不要忘了使用niceand renice 把matho-primes都kill掉。
cpulimit
cpulimit工具通過在不同的時間間隔掛起進(jìn)程來限制進(jìn)程的CPU使用率,讓進(jìn)程在指定的上限中運行。cpulimit程序通過發(fā)送 SIGSTOP 和 SIGCONT 信號給進(jìn)程來。這不會改變進(jìn)程的優(yōu)先級,相反,它會監(jiān)控CPU的真實使用率。
當(dāng)你想保證進(jìn)程的CPU使用率在一定限度下的時候,cpulimit是很有用的。nice的缺點就是,當(dāng)系統(tǒng)空閑時,進(jìn)程也不會使用所有可用的CPU時間。
在CentOS上安裝cpulimit的方法:
- 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目錄下。
cgroups
控制組(cgroups)是一個Linux內(nèi)核特性,它允許你指定內(nèi)核應(yīng)該如何給一個進(jìn)程組分配特定的資源。你可以用cgroups指定在某一個組中的進(jìn)程使用多少cpu時間、系統(tǒng)內(nèi)存、網(wǎng)絡(luò)帶寬,或者這些組合資源。
控制組相對于nice或cpulimit的優(yōu)勢在于,限制是針對一個進(jìn)程集合,而不只是一個進(jìn)程。還有,nice或cpulimit僅僅限制進(jìn)程的CPU使用率,而cgroups可以限制其他進(jìn)程資源。
審慎地使用cgroups使得一個服務(wù)器的完整子系統(tǒng)的資源可控。 例如在CoreOS中,為大規(guī)模服務(wù)器部署設(shè)計的Linux最小化發(fā)行,升級進(jìn)程是由一個cgroup控制。這意味著系統(tǒng)的下載和安裝不影響系統(tǒng)性能。
為了演示cgroups,我們將創(chuàng)建兩個擁有不同CPU資源分配的組,分別叫做‘cpulimited’和‘lesscpulimited’;
用cgcreate創(chuàng)建組的命令如下:
- sudo cgcreate -g cpu:/cpulimited
- sudo cgcreate -g cpu:/lesscpulimited
命令的"-g cpu'部分告訴cgroups,可以對該組中的進(jìn)程設(shè)置CPU資源分配限制,其他控制包括cpuset,memory和blkio。cpuset控制在允許一個組中進(jìn)程綁定到一個指定的CPU或CPU核集中和cpu控制相關(guān)。
cpu控制有一個屬性是cpu.shares。內(nèi)核用它決定cgroups中進(jìn)程間可用的CPU共享資源,默認(rèn)值是1024。一個組(lesscpulimited)使用默認(rèn)值1024,另一個組(cpulimited)設(shè)置成512,內(nèi)核按2:1比例劃分CPU資源。
在cpulimted組中將cpu.shares設(shè)置成512:
- sudo cgset -r cpu.shares=512 cpulimited
使用cgexec命令啟動一個cgroup任務(wù)。 為了測試這兩個組,在cpulimited組中啟動matho-primes:
- sudo cgexec -g cpu:lesscpulimited /usr/local/bin/matho-primes 0 9999999999 > /dev/null
top命令顯示了cgroup中有更大cpu.shares值的進(jìn)程得到更多的CPU時間。
現(xiàn)在在cpulimited組中啟動另一個matho-primes進(jìn)程:
- sudo cgexec -g cpu:cpulimited /usr/local/bin/matho-primes 0 9999999999 > /dev/null
觀察CPU是如何仍舊按2:1比例分配?,F(xiàn)在cpulimited組中的兩個matho-primes任務(wù)在均勻地共享CPU,而另一個組中的進(jìn)程仍然獲得了更多的處理器時間。
使用 Scout 監(jiān)控CPU使用率
監(jiān)控CPU使用率是簡單的方法是什么? 在服務(wù)器上安裝了監(jiān)控agent后, Scout 會自動跟蹤C(jī)PU和內(nèi)存使用的軌跡。
你還可以創(chuàng)建觸發(fā)器,當(dāng)進(jìn)程超過指定的CPU和內(nèi)存使用率上限的時候提醒你。
TL;DR
任務(wù)服務(wù)器或者桌面系統(tǒng)的有限資源都是寶貴的。上面說的這些工具可以幫你有效地管理這些資源,特別是CPU資源:
-
nice ,一個很好的工具來“一次性”調(diào)整系統(tǒng)。
-
cpulimit ,當(dāng)你需要運行CPU密集型任務(wù),但是CPU空閑時間對系統(tǒng)的快速響應(yīng)又很重要的時候,cpulimit非常有用。
-
cgroups 是限制進(jìn)程的瑞士軍刀,它為系統(tǒng)提供了極大的靈活性。
原文出自:http://www.oschina.net/translate/restricting-process-cpu-usage-using-nice-cpulimit-and-cgroups