1. 程式人生 > >使用 nice、bulimic 和 cgroups 限制 cpu 佔用率

使用 nice、bulimic 和 cgroups 限制 cpu 佔用率

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

 資料夾,執行 make 和 sudo make install 進行編譯和安裝。這樣,就把 matho-primes 程式安裝到了 /usr/local/bin 目錄中。

接下來,通過命令列執行:

  1. /usr/local/bin/matho-primes 09999999999>/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命令來啟動執行,而另一個正常啟動執行:

  1. nice matho-primes 09999999999>/dev/null&
  2. matho-primes 09999999999>/dev/null&

再執行top命令。

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

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

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

  1. renice+101234

其中,1234是程序的 PID。

測試完 nice 和 renice 命令後,記得要將 matho-primes 程序全部殺掉。

cpulimit命令

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

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

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

  1. wget-O cpulimit.zip https://github.com/opsengine/cpulimit/archive/master.zip
  2. unzip cpulimit.zip
  3. cd cpulimit-master
  4. make
  5. sudocp src/cpulimit /usr/bin

上面的命令列,會先從從 GitHub 上將原始碼下載到本地,然後再解壓、編譯、並安裝到 /usr/bin 目錄下。

cpulimit 的使用方式和 nice 命令類似,但是需要使用者使用 -l 選項顯式地定義程序的 cpu 使用率上限值。舉例說明:

  1. cpulimit -l 50 matho-primes 09999999999>/dev/null&

從上面的例子可以看出 matho-primes 只使用了50%的 cpu 資源,剩餘的 cpu 時間都在 idle。

cpulimit 還可以在執行時對程序進行動態限制,使用 -p 選項來指定程序的 PID,下面是一個例項:

  1. 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 命令來建立控制組,如下所示:

  1. sudo cgcreate -g cpu:/cpulimited
  2. sudo 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,輸入以下命令:

  1. sudo cgset -r cpu.shares=512 cpulimited

使用 cgexec 命令來啟動控制組的執行,為了測試這兩個控制組,我們先用cpulimited 控制組來啟動 matho-primes 程序,命令列如下:

  1. sudo cgexec -g cpu:cpulimited /usr/local/bin/matho-primes 09999999999>/dev/null&

開啟 top 可以看到,matho-primes 程序佔用了所有的 cpu 資源。

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

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

  1. sudo cgexec -g cpu:lesscpulimited /usr/local/bin/matho-primes 09999999999>/dev/null&

再開啟 top 就可以看到,cpu.shares 值大的控制組會得到更多的 cpu 執行時間。

現在,我們再在 cpulimited 控制組中增加一個 matho-primes 程序:

  1. sudo cgexec -g cpu:cpulimited /usr/local/bin/matho-primes 09999999999>/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中國 榮譽推出


相關推薦

使用 nicebulimic cgroups 限制 cpu 用率

Linux核心是一名了不起的馬戲表演者,它在程序和系統資源間小心地玩著雜耍,並保持系統的正常運轉。 同時,核心也很公正:它將資源公平地分配給各個程序。 但是,如果你需要給一個重要程序提高優先順序時,該怎麼做呢? 或者是,如何降低一個程序的優先順序? 又或者,如何限制

使用 nicecpulimit cgroups 限制 cpu 用率

文章出處:http://www.linux.cn/article-4742-1.html Linux核心是一名了不起的馬戲表演者,它在程序和系統資源間小心地玩著雜耍,並保持系統的正常運轉。 同時,核心也很公正:它將資源公平地分配給各個程序。 但是,如果你需要給一個重

Linux---使用 nicecpulimit cgroups 限制 cpu 用率

Linux核心在各個程序間公平地分配系統資源,以保障系統的正常運轉。但是有時候,我們需要提高一個程序的優先順序,或者降低一個程序的優先順序,我們就需要由使用者為核心指定程序的優先順序。大部分程序啟動時的優先順序是相同的,因此Linux核心會公平地進行排程。 如果想讓一個CPU

java獲取JVM的CPU用率記憶體用率執行緒數及伺服器的網口吞吐率磁碟讀寫速率

怎麼說呢,本人菜鳥一枚,費了幾天時間,終於做了一個用java獲取JVM的CPU佔用率、記憶體佔用率、執行緒數及伺服器的網口吞吐率、磁碟讀寫速率的實現。 其中windows環境下獲取jvm 的cpu佔用率這裡是參考網上別人的東西(在此感謝提供參考的網友),其他的都是基於自己的想法做出來的。該工具類

EnvoygRPC速率限制

作者 Venil Noronha | 譯者 王全根 | 審校者 楊傳勝 王凱 | 2500字 | 閱讀大約需要5分鐘 檢視原文 | 歸檔於 translation | 標籤 #Envoy #Grcp #Rate-Limiting Envoy是專為Cloud Nati

記一次CPU用率load高的排查

  前不久公司進行了一次大促,晚上值班。大促是從晚上8點多開始的,一開始流量慢慢的進來,觀察了應用的各項指標,一切都是正常的,因為這是雙11過後的第一次大促,想著使用者的購買慾應該不會太強,所以我們的運維同事9點多就回家了在家裡面遠端支援,留下交易組和其它後端的技術值班,樓主就是交易組的。誰知10點整的時候我

linux問題排查 - 高cpu用率的程序執行緒

1.簡介           一個程式,完成它預設的功能,並不能說明它是一個優良的程式。好的程式,應該是對資源的合理利用,亦或是 用更少的資源(使用合理的演算法),實現更多有效的產出。 &

minerdwnTKYg程序(病毒)--被攻擊CPU用率達到100%

今天登入伺服器感覺伺服器特別的慢。結果檢視發現有兩個程序佔用CPU100%了,一個是minerd一個是wnTKYg。如果大家遇到請小心。 檢視伺服器各個程式佔用資源量 [root@iZ2z

【轉】Linux下java程序CPU用率高分析方法

文章轉載的地址: https://blog.linuxeye.cn/343.html   在工作當中,肯定會遇到由程式碼所導致的高CPU耗用以及記憶體溢位的情況。這種情況發生時,我們怎麼去找出原因並解決。 一般解決方法是通過top命令找出消耗資源高的執行緒id,利用strace命令檢視該執行緒

Java獲取CPU用率

原文連結:https://www.jianshu.com/p/015cc4805e29 最近做一個Java效能統計的問題,需要統計當前程序佔用CPU的情況,最開始使用Java MxBean來獲取 OperatingSystemMXBean osMxBean = ManagementFactory

Sublime Text 3 CPU用率過高 && WebStorm記憶體佔用過高

  用Sublime Text 3或WebStorm進行前端開發時,遇到了同樣的問題:當專案檔案比較多或檔案比較大時,CPU佔用率或記憶體佔用持續比較高,後來經查閱發現是index files導致的,可以理解為:Sublime Text 3或WebStorm需要不斷重新整理檔案索引,不斷將專案檔案從硬碟中讀到

一行命令讓CPU用率達到100%

一行命令讓CPU佔用率達到100% for i in `seq 1 $(cat /proc/cpuinfo |grep "physical id" |wc -l)`; do dd if=/dev/zero of=/dev/null & done 說明:

(轉)linux top命令中各cpu用率含義及案例分析

原文:https://blog.csdn.net/ydyang1126/article/details/72820349 linux top命令中各cpu佔用率含義 0 效能監控介紹 1 確定應用型別 2 確定基準線統計 0 安裝監控工具

intellij idea cpu用率太大太滿 執行速度太慢 使了五個解決方法最終成功

突然發現,intellij idea 特別卡,在程式碼間移動的時候,居然重新整理都跟不上,然後開啟工作管理員一看,CPU佔用率100%。。。intellij idea自己一個程式的佔用率就高達80~90,這還只是單純的開啟,沒有做其他任何操作。然後,就是解決唄。 方法一:升級idea。 去官

Java 獲取 CPU 用率

轉自:https://www.jianshu.com/p/015cc4805e29 最近做一個Java效能統計的問題,需要統計當前程序佔用CPU的情況,最開始使用Java MxBean來獲取: OperatingSystemMXBean osMxBean = ManagementFactor

寫一個守護程序+cpu用率在20%波動的程式

1.cpu佔用率在20%波動的程式怎麼寫 //makecpu.c void makeCpu() { int time_start; int fulltime = 100;//總時間

線上Java程式導致伺服器CPU用率過高的問題排除過程

1、故障現象 客服同事反饋平臺系統執行緩慢,網頁卡頓嚴重,多次重啟系統後問題依然存在,使用top命令檢視伺服器情況,發現CPU佔用率過高。 2、CPU佔用過高問題定位 2.1、定位問題程序 使用top命令檢視資源佔用情況,發現pid為14063的程序佔用了大量的CPU

程式碼執行時 CPU用率100%的解決方法

原因:        建立連線後啟動新的執行緒,如果執行緒中有簡單粗暴的不含阻塞的while(1)迴圈,會持續佔用CPU,導致CPU佔用率極高。 解決: 在while(1)的大迴圈中插入一句sleep

雲伺服器 ECS Linux 系統 CPU 用率較高問題排查思路

如果雲伺服器 ECS Linux 系統的 CPU 持續跑高,則會對系統穩定性和業務執行造成影響。本文對 CPU 佔用率較高問題的排查分析做簡要說明。可以通過 vmstat 從系統維度檢視 CPU 資源的使用情況。用法說明:格式:vmstat -n 1-n 1表示結果一秒重新整理一次。示例輸出:$ vmstat

Linux 系統 CPU 用率較高問題排查思路

CPU負載檢視方法: 使用vmstat檢視系統維度的CPU負載 使用top檢視程序維度的CPU負載 使用 vmstat 檢視系統緯度的 CPU 負載: 可以通過 vmstat 從系統維度檢視 CPU 資源的使用情況。 用法說明: 格式:vmstat -n 1# -n 1