說在前面:
在linux操作系統中,我們一般查看系統的cpu負載情況常用的命令可以是uptime,top,還有vmstat等這些個都是可以有的。每個工具所提供的信息各不相同,
我這里要討論的僅說cpu部分。使用uptime命令,可以得到操作系統在過去1分鍾,5分鍾和15分鍾的cpu平均負載值,也就是傳說中的 load average,這個和top命令右上角那個地方顯示出來的東東是想通的,那么這個load average到底是個什么樣的東西呢,其實它表示的就是在cpu里面運行的進程數量,不過這里的進程和使用命令來查看到的進程可不太一樣。在一定時間內 cpu所能處理和承載的進程數量是有限的,這個數值與cpu的性能有直接關系,或者說這個數值標志着cpu的性能高低,反應到實際的計算機使用上來就是更 高性能的cpu可以在同一時間處理更多進程內容,所以說,一般當你去電腦城買個人電腦的時候導購就會問你電腦的大致用途,其實他們這個時候是在幫你計算你 所需要的電腦性能,其中就包括計算cpu的最大負載值,當然他們一般都不會這么去算,而是根據價格,因為價格高的cpu往往性能就更好,緊接着,他們會問 你大概的預算,其實當了解到你買電腦的用途之后他們自己心里已經幫你預算好了,如果你的預算高於他們的預算,那么恭喜那位賣電腦的,他可以多賺點了。所以 買電腦一定要根據實際需求,比如說cpu支持很高的負載,而你在實際使用中卻根本達不到那么高的負載,那不就成了殺雞用殺豬刀么。
說到底,cpu在單位時間內所能處理的進程數越高,那它的性能應該就越高。但是關於這個負載,網上資料有很多種說法,有的說是負載不應該超 過cpu的核心數量,有的說不應該超過cpu核心數量的2倍,有的說不應該超過cpu核心數量的3倍,為什么會有這么多種說法呢,其實大家都是擔心一個相 同的問題----怕cpu扛不住,這里超不超過幾倍不要緊,最主要的判斷標准是你的cpu在達到一定程度負載的時候是不是系統和應用程序依然運行良好,也 就是說判斷標准還與實際的應用有關,如果cpu的負載都超了核心數好幾倍但是軟件運行還依然順暢,那這個也是可以有的。這里就得說說cpu的運行隊列了, 有關運行隊列的狀態參數可以通過vmstat命令來查看,這里不多做解釋,它有兩項,一項是run,一項是blocked,也就是vmstat查看到的最 前面的兩排,run代表正在cpu里面執行的,blocked代表由於磁盤或其他方面的瓶頸導致他在cpu里面等待的,這兩個數值其實和使用uptime 或者top命令查看到的系統負載值是很有關系的,基本上,系統在某個時間的負載值就等同於run的值加上blocked的值,但是這里直接這樣用加法來表 示也是不對的,系統負載值是一個平均值,可以是小數,而運行隊列的數目是整數。在cpu處於空閑的情況下,run+blocked一般接近0,偶爾蹦出個 1啊2啊的,所以空閑狀態下的負載均值一般都是0.幾。
但是,當系統的負載逐漸升高,也就是說cpu里運行的東東逐漸變多,那么反應到負載均值上其數值也會跟着逐漸增大,而且可以是很大很大,完全超出 cpu核心數的好多倍,比如我前幾天用一台8核機器做測試的時候用top命令查看到的負載值居然達到了將近600,這已經遠遠超出了cpu可承受的范圍, 那為什么已經超出了可接受范圍這個負載均值還可以漲到那么高呢,這是因為在cpu里,同一時間可以運行的進程數量有限的,也就是說,vmstat查看到的 run值最大不能超過某個數,但是blocked卻可以繼續變大,因為進程已經blocked掉了,它幾乎占用不了多少cpu資源,而正在run的就不一 樣了,一個cpu同一時間能run多少完全取決於它的物理性能,所以當你的機器負載不斷升高,你用top命令查看到的負載值也會不斷升高,而當負載達到一 定高度時,cpu能處理的運行隊列也達到上限,run的值不再增加,這時,blocked的值會繼續增加,理論上,blocked可以一直增加到直到系統 崩潰。
總結:在評估cpu的性能優劣時完全照搬網上說的幾倍幾倍是不准確的,還得你自己動手看看vmstat顯示的run值和blocked值,當出現明 顯較多的blocked的時候,就說明cpu產生了瓶頸。而top命令和uptime命令顯示的負載均值,只能作為判斷系統過去某個時間段的狀態的參照, 與cpu的性能關系不大。
關於CPU,有3個重要的概念:上下文切換(context switchs),運行隊列(Run queue)和使用率(utilization)。
上下文切換:
目前流行的CPU在同一時間內只能運行一個線程,超線程的處理器可以在同一時間運行多個線程(包括多核CPU),Linux內核會把多核的處理器當作多個單獨的CPU來識別。
一個標准的Linux內核可以支持運行50~50000個進程運行,對於普通的CPU,內核會調度和執行這些進程。每個進程都會分到CPU的時間片來運行,當一個進程用完時間片或者被更高優先級的進程搶占后,它會備份到CPU的運行隊列中,同時其他進程在CPU上運行。這個進程切換的過程被稱作上下文切換。過多的上下文切換會造成系統很大的開銷。
[work106 ~]$ vmstat
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st 4 0 1874084 3341144 296868 16677400 0 0 0 9 0 0 7 1 91 0 0 cs表示上下文切換的數量
運行隊列
每個CPU都會維持一個運行隊列,理想情況下,調度器會不斷讓隊列中的進程運行。進程不是處在sleep狀態就是run able狀態。如果CPU過載,就會出現調度器跟不上系統的要求,導致可運行的進程會填滿隊列。隊列愈大,程序執行時間就愈長。
[work106 ~]$ uptime
11:44:52 up 839 days, 19:55, 2 users, load average: 11.11, 10.33, 9.94 "load average" 用來表示運行隊列,用top 命令我們可以看到CPU一分鍾,5分鍾和15分鍾內的運行隊列的大小。這個值越大表明系統負荷越大。
[work106 ~]$ vmstat
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st 4 0 1874084 3341144 296868 16677400 0 0 0 9 0 0 7 1 91 0 0 r表示運行隊列的大小,r的參考值是:小於4,隊列大於4時,表明系統的cpu或內存可能有問題,如果r經常大於4,且id經常少於40,表示cpu的負荷很重。當隊列變長時,隊列中進程在等待cpu調度執行時所花的時間會變長. id參考值: 大於40,如果r經常大於4,且id經常小於40,表示cpu的負荷很重。 wa 參考值:小於25%,超過25%的wa的值可以表示磁盤子系統可能沒有被正確平衡,也可能是磁盤密集工作負載的結果,系統的磁盤或其它I/o可能有問題,可以通過iostat/SAR –C命令進一步分解分析
關於時間片和動態優先級
時間片對於CPU來說是很關鍵的參數,如果時間片太長,就會使系統的交互性能變差,用戶感覺不到並行。如果太短,又會造成系統頻繁的上下文切換,使性能下降。對於IO Bound的系統來講並不需要太長的時間片,因為系統主要是IO操作;而對於CPU Bound的系統來說需要長的時間片以保持cache的有效性。
每一個進程啟動的時候系統都會給出一個默認的優先級,但在運行過程中,系統會根據進程的運行狀況不斷調整優先級,內核會升高或降低進程的優先級(每次增加或降低5),判斷標准是根據進程處於sleep狀態的時間。
IO Bound進程大部分時間在sleep狀態,所以內核會調高它的優先級,CPU Bound進程會被內核懲罰降低優先級。因此,如果一個系統上即運行IO Bound進程,又運行CPU Bound進程,會發現,IO Bound進程的性能不會下降,而CPU Bound進程性能會不斷下降。
經驗總結:
top - 12:00:20 up 839 days, 20:11, 2 users, load average: 10.54, 10.15, 9.87 Tasks: 228 total, 1 running, 227 sleeping, 0 stopped, 0 zombie Cpu(s): 66.0%us, 7.9%sy, 0.0%ni, 25.5%id, 0.5%wa, 0.0%hi, 0.2%si, 0.0%st
- 對於每一個CPU來說運行隊列不要超過3,例如,如果是雙核CPU就不要超過6;
- 如果CPU在滿負荷運行,應該符合下列分布,
a) User Time:65%~70%, us過大,說明有用戶進程占用很多cpu時間,需要進一步的分析其它軟硬件因素。
b) System Time:30%~35%,sy過大,說明系統管理方面花了很多時間,說明該系統中某個子系統產生了瓶頸,需要進一步分析其它軟硬件因素。
c) User Time+System Time ,合理值范圍是 60-85%,如果在一個多用戶系統中us+sy時間超過85%,則進程可能要花時間在運行隊列中等待,響應時間和業務吞吐量會受損害
d) Idle:0%~5%, CPU完全空閑的百分比 - 對於上下文切換要結合CPU使用率來看,如果CPU使用滿足上述分布,大量的上下文切換也是可以接受的。
- 出現cpu計數器不在范圍時,不一定是由於cpu資源不夠,因為其他資源的也會引起,例如內存不夠時,cpu會忙內存管理的事,表面上可能是cpu的利用為100%
轉自:https://www.jianshu.com/p/a19202a926fb
