新四季網

ace-guard佔用cpu高怎麼辦(使用nicecpulimit)

2023-04-24 16:38:10

Linux內核是一名了不起的馬戲表演者,它在進程和系統資源間小心地玩著雜耍,並保持系統的正常運轉。 同時,內核也很公正:它將資源公平地分配給各個進程。

但是,如果你需要給一個重要進程提高優先級時,該怎麼做呢? 或者是,如何降低一個進程的優先級? 又或者,如何限制一組進程所使用的資源呢?

答案是需要由用戶來為內核指定進程的優先級

大部分進程啟動時的優先級是相同的,因此Linux內核會公平地進行調度。 如果想讓一個CPU密集型的進程運行在較低優先級,那麼你就得事先配置好調度器。

下面介紹3種控制進程運行時間的方法:

使用 nice 命令手動降低任務的優先級。使用 cpulimit 命令不斷的暫停進程,以控制進程所佔用處理能力不超過特定限制。使用linux內建的control groups(控制組)功能,它提供了限制進程資源消耗的機制。

我們來看一下這3個工具的工作原理和各自的優缺點。

模擬高cpu佔用率

在分析這3種技術前,我們要先安裝一個工具來模擬高CPU佔用率的場景。我們會用到CentOS作為測試系統,並使用Mathomatic toolkit中的質數生成器來模擬CPU負載。

很不幸,在CentOS上這個工具沒有預編譯好的版本,所以必須要從源碼進行安裝。先從 http://mathomatic.orgserve.de/mathomatic-16.0.5.tar.bz2這個連結下載源碼包並解壓。然後進入mathomatic-16.0.5/primes文件夾,運行makesudo make install進行編譯和安裝。這樣,就把matho-primes程序安裝到了/usr/local/bin目錄中。

接下來,通過命令行運行:

/usr/local/bin/matho-primes 0 9999999999 > /dev/null &

程序運行後,將輸出從0到9999999999之間的質數。因為我們並不需要這些輸出結果,直接將輸出重定向到/dev/null就好。

現在,使用top命令就可以看到matho-primes進程榨乾了你所有的cpu資源。

好了,接下來(按q鍵)退出 top 並殺掉 matho-primes 進程(使用 fg 命令將進程切換到前臺,再按 CTRL C)

nice命令

下面介紹一下nice命令的使用方法,nice命令可以修改進程的優先級,這樣就可以讓進程運行得不那麼頻繁。 這個功能在運行cpu密集型的後臺進程或批處理作業時尤為有用。nice值的取值範圍是[-20,19],-20表示最高優先級,而19表示最低優先級。 Linux進程的默認nice值為0。使用nice命令(不帶任何參數時)可以將進程的nice值設置為10。這樣調度器就會將此進程視為較低優先級的進程,從而減少cpu資源的分配。

下面來看一個例子,我們同時運行兩個 matho-primes進程,一個使用nice命令來啟動運行,而另一個正常啟動運行:

nice matho-primes 0 9999999999 > /dev/null &matho-primes 0 9999999999 > /dev/null &

再運行top命令。

看到沒,正常運行的進程(nice值為0)獲得了更多的cpu運行時間,相反的,用nice命令運行的進程佔用的cpu時間會較少(nice值為10)。

在實際使用中,如果你要運行一個CPU密集型的程序,那麼最好用nice命令來啟動它,這樣就可以保證其他進程獲得更高的優先級。 也就是說,即使你的伺服器或者臺式機在重載的情況下,也可以快速響應。

nice 還有一個關聯命令叫做 renice,它可以在運行時調整進程的 nice 值。使用 renice 命令時,要先找出進程的 PID。下面是一個例子:

renice 10 1234

其中,1234是進程的 PID。

測試完 nicerenice命令後,記得要將matho-primes進程全部殺掉。

cpulimit命令

接下來介紹 cpulimit命令的用法。cpulimit命令的工作原理是為進程預設一個 cpu 佔用率門限,並實時監控進程是否超出此門限,若超出則讓該進程暫停運行一段時間。cpulimit 使用 SIGSTOP 和 SIGCONT 這兩個信號來控制進程。它不會修改進程的 nice 值,而是通過監控進程的 cpu 佔用率來做出動態調整。

cpulimit 的優勢是可以控制進程的cpu使用率的上限值。但與 nice 相比也有缺點,那就是即使 cpu 是空閒的,進程也不能完全使用整個 cpu 資源。

在 CentOS 上,可以用下面的方法來安裝它:

wget -O cpulimit.zip https://github.com/opsengine/cpulimit/archive/master.zipunzip cpulimit.zipcd cpulimit-mastermakesudo 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 還可以在運行時對進程進行動態限制,使用 -p選項來指定進程的 PID,下面是一個實例:

cpulimit -l 50 -p 1234

其中,1234是進程的 PID。

cgroups 命令集

最後介紹,功能最為強大的控制組(cgroups)的用法。cgroups 是 Linux 內核提供的一種機制,利用它可以指定一組進程的資源分配。 具體來說,使用 cgroups,用戶能夠限定一組進程的 cpu 佔用率、系統內存消耗、網絡帶寬,以及這幾種資源的組合。

對比nice和cpulimit,cgroups 的優勢在於它可以控制一組進程,不像前者僅能控制單進程。同時,nice 和 cpulimit 只能限制 cpu 使用率,而 cgroups 則可以限制其他進程資源的使用。

對 cgroups 善加利用就可以控制好整個子系統的資源消耗。就拿 CoreOS 作為例子,這是一個專為大規模伺服器部署而設計的最簡化的 Linux 發行版本,它的 upgrade 進程就是使用 cgroups 來管控。這樣,系統在下載和安裝升級版本時也不會影響到系統的性能。

下面做一下演示,我們將創建兩個控制組(cgroups),並對其分配不同的 cpu 資源。這兩個控制組分別命名為「cpulimited」和「lesscpulimited」。

使用 cgcreate 命令來創建控制組,如下所示:

sudo cgcreate -g cpu:/cpulimitedsudo cgcreate -g cpu:/lesscpulimited

其中「-g cpu」選項用於設定 cpu 的使用上限。除 cpu 外,cgroups 還提供 cpuset、memory、blkio 等控制器。cpuset 控制器與 cpu 控制器的不同在於,cpu 控制器只能限制一個 cpu 核的使用率,而 cpuset 可以控制多個 cpu 核。

cpu 控制器中的 cpu.shares 屬性用於控制 cpu 使用率。它的默認值是 1024,我們將 lesscpulimited 控制組的 cpu.shares 設為1024(默認值),而 cpulimited 設為512,配置後內核就會按照2:1的比例為這兩個控制組分配資源。

要設置 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 資源。

因為只有一個進程在系統中運行,不管將其放到哪個控制組中啟動,它都會儘可能多的使用cpu資源。cpu 資源限制只有在兩個進程爭奪cpu資源時才會生效。

那麼,現在我們就啟動第二個 matho-primes 進程,這一次我們在 lesscpulimited 控制組中來啟動它:

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

再打開 top 就可以看到,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 時間基本相當,而另一組中的 matho-primes 進程顯然獲得了更多的運行時間。

更多的使用方法,可以在 Red Hat 上查看詳細的 cgroups 使用說明。(當然CentOS 7也有)

使用Scout來監控cpu佔用率

監控cpu佔用率最為簡單的方法是什麼?Scout工具能夠監控能夠自動監控進程的cpu使用率和內存使用情況。

Scout的觸發器(trigger)功能還可以設定 cpu 和內存的使用門限,超出門限時會自動產生報警。

從這裡可以獲取 Scout的試用版。

總結

計算機的系統資源是非常寶貴的。上面介紹的這3個工具能夠幫助大家有效地管理系統資源,特別是cpu資源:

nice可以一次性調整進程的優先級。cpulimit在運行cpu密集型任務且要保持系統的響應性時會很有用。cgroups是資源管理的瑞士軍刀,同時在使用上也很靈活。

譯者:coloka校對:wxy

本文由 LCTT原創翻譯,Linux中國榮譽推出

本文由 LCTT 原創翻譯,Linux中國首發。也想加入譯者行列,為開源做一些自己的貢獻麼?歡迎加入LCTT!

翻譯工作和譯文發表僅用於學習和交流目的,翻譯工作遵照CC 協議規定,如果我們的工作有侵犯到您的權益,請及時聯繫我們。

歡迎遵照CC 協議規定轉載,敬請在正文中標註並保留原文/譯文連結和作者/譯者等信息。

,
同类文章
葬禮的夢想

葬禮的夢想

夢見葬禮,我得到了這個夢想,五個要素的五個要素,水火只好,主要名字在外面,職業生涯良好,一切都應該對待他人治療誠意,由於小,吉利的冬天夢想,秋天的夢是不吉利的
找到手機是什麼意思?

找到手機是什麼意思?

找到手機是什麼意思?五次選舉的五個要素是兩名士兵的跡象。與他溝通很好。這是非常財富,它擅長運作,職業是仙人的標誌。單身男人有這個夢想,主要生活可以有人幫忙
我不怎麼想?

我不怎麼想?

我做了什麼意味著看到米飯烹飪?我得到了這個夢想,五線的主要土壤,但是Tu Ke水是錢的跡象,職業生涯更加真誠。他真誠地誠實。這是豐富的,這是夏瑞的巨星
夢想你的意思是什麼?

夢想你的意思是什麼?

你是什​​麼意思夢想的夢想?夢想,主要木材的五個要素,水的跡象,主營業務,主營業務,案子應該抓住魅力,不能疏忽,春天夢想的吉利夢想夏天的夢想不幸。詢問學者夢想
拯救夢想

拯救夢想

拯救夢想什麼意思?你夢想著拯救人嗎?拯救人們的夢想有一個現實,也有夢想的主觀想像力,請參閱週宮官方網站拯救人民夢想的詳細解釋。夢想著敵人被拯救出來
2022愛方向和生日是在[質量個性]中

2022愛方向和生日是在[質量個性]中

[救生員]有人說,在出生88天之前,胎兒已經知道哪天的出生,如何有優質的個性,將走在什麼樣的愛情之旅,將與生活生活有什么生活。今天
夢想切割剪裁

夢想切割剪裁

夢想切割剪裁什麼意思?你夢想切你的手是好的嗎?夢想切割手工切割手有一個真正的影響和反應,也有夢想的主觀想像力。請參閱官方網站夢想的細節,以削減手
夢想著親人死了

夢想著親人死了

夢想著親人死了什麼意思?你夢想夢想你的親人死嗎?夢想有一個現實的影響和反應,還有夢想的主觀想像力,請參閱夢想世界夢想死亡的親屬的詳細解釋
夢想搶劫

夢想搶劫

夢想搶劫什麼意思?你夢想搶劫嗎?夢想著搶劫有一個現實的影響和反應,也有夢想的主觀想像力,請參閱週恭吉夢官方網站的詳細解釋。夢想搶劫
夢想缺乏缺乏紊亂

夢想缺乏缺乏紊亂

夢想缺乏缺乏紊亂什麼意思?你夢想缺乏異常藥物嗎?夢想缺乏現實世界的影響和現實,還有夢想的主觀想像,請看官方網站的夢想組織缺乏異常藥物。我覺得有些東西缺失了