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