使用 nice、cpulimit 和cgroups 獲取進程的 CPU 使用率

jopen 10年前發布 | 18K 次閱讀 nice Linux

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

    退出 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 。

    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 &

    top

    注意,現在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可用時間。

    top

    這是因為當一個單獨的進程運行時,它使用盡可能多的的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時間。

    top

    現在在cpulimited組中啟動另一個matho-primes進程:

    sudo cgexec -g cpu:cpulimited /usr/local/bin/matho-primes 0 9999999999 > /dev/null &


    https://dl.dropboxusercontent.com/u/468982/blog/cpu<em>usage</em>blog/image04.jpg

    觀察CPU是如何仍舊按2:1比例分配。現在cpulimited組中的兩個matho-primes任務在均勻地共享CPU,而另一個組中的進程仍然獲得了更多的處理器時間。

    你可以從Red Hat閱讀完全的控制組文檔 (同樣適用于 CentOS 7).

    使用 Scout 監控CPU使用率

    監控CPU使用率是簡單的方法是什么? 在服務器上安裝了監控agent后, Scout 會自動跟蹤CPU和內存使用的軌跡。

    scout server view

    你還可以創建觸發器,當進程超過指定的CPU和內存使用率上限的時候提醒你。

    免費注冊Scout,試一下CPU進程監控。

    TL;DR

    overview

    任務服務器或者桌面系統的有限資源都是寶貴的。上面說的這些工具可以幫你有效地管理這些資源,特別是CPU資源:

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!