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