? 上一篇下一篇 ?

Linux負載急劇增加的原因分析及應對方法

     負載(load)是linux機器的一個重要指標,直觀了反應了機器當前的狀態。Linux的負載高,主要是由于CPU使用、內存使用、IO消耗三部分引起。任意一項使用過量,都將導致服務器負載的急劇增加。

直接查看負載狀況可以用命令:

#uptime
既然是CPU使用,內存使用和IO消耗。那么需要兩個命令來查看,一個是top一個是iostat。top自帶,但只能較好的顯示CPU和內存情況,無法獲得更多的IO具體信息。


對一般的系統來說,根據cpu數量去判斷。如果平均負載始終在1.2一下,而你有2顆cup的機器。那么基本不會出現cpu不夠用的情況。也就是Load平均要小于Cpu的數量
1.4:Load與容量規劃(Capacity Planning)
       一般是會根據15分鐘那個load 平均值為首先。

對一般的系統來說,根據cpu數量去判斷。如果平均負載始終在1.2一下,而你有2顆cup的機器。那么基本不會出現cpu不夠用的情況。也就是Load平均要小于Cpu的數量
1.4:Load與容量規劃(Capacity Planning)
       一般是會根據15分鐘那個load 平均值為首先。

1.5:Load誤解:
1:系統load高一定是性能有問題。
    真相:Load高也許是因為在進行cpu密集型的計算
        2:系統Load高一定是CPU能力問題或數量不夠。
    真相:Load高只是代表需要運行的隊列累計過多了。但隊列中的任務實際可能是耗Cpu的,也可能是耗i/0及其他因素的。
3:系統長期Load高,首先增加CPU
    真相:Load只是表象,不是實質。增加CPU個別情況下會臨時看到Load下降,但治標不治本。

2:在Load average 高的情況下如何鑒別系統瓶頸。
   是CPU不足,還是io不夠快造成或是內存不足?

1.5:Load誤解:
1:系統load高一定是性能有問題。
    真相:Load高也許是因為在進行cpu密集型的計算
        2:系統Load高一定是CPU能力問題或數量不夠。
    真相:Load高只是代表需要運行的隊列累計過多了。但隊列中的任務實際可能是耗Cpu的,也可能是耗i/0及其他因素的。
3:系統長期Load高,首先增加CPU
    真相:Load只是表象,不是實質。增加CPU個別情況下會臨時看到Load下降,但治標不治本。

 

下面我們來深入了解負載高的原理及應對方法

 

  一、CPU利用率和負載率的區別
 這里要區別CPU負載和CPU利用率,它們是不同的兩個概念,但它們的信息可以在同一個top命令中進行顯示。CPU利用率顯示的是程序在運行期間實時占用的CPU百分比,這是對一個時間段內CPU使用狀況的統計,通過這個指標可以看出在某一個時間段內CPU被占用的情況, 如果被占用時間很高,那么就需要考慮CPU是否已經處于超負荷運作。而CPU負載顯示的是在一段時間內CPU正在處理以及等待CPU處理的進程數之和的統計信息,也就是CPU使用隊列的長度的統計信息。
 
CPU利用率高并不意味著負載就一定大,可能這個任務是一個CPU密集型的。一樣CPU低利用率的情況下是否會有高Load Average的情況產生呢?理解占有時間和使用時間就可以知道,當CPU分配時間片以后,是否使用完全取決于使用者,因此完全可能出現低利用率高Load Average的情況。另外IO設備也可能導致CPU負載高。
 
由此來看,僅僅從CPU的使用率來判斷CPU是否處于一種超負荷的工作狀態還是不夠的,必須結合Load Average來全局的看CPU的使用情況。網上有個例子來說明兩者的區別如下:某公用電話亭,有一個人在打電話,四個人在等待,每人限定使用電話一分鐘,若有人一分鐘之內沒有打完電話,只能掛掉電話去排隊,等待下一輪。電話在這里就相當于CPU,而正在或等待打電話的人就相當于任務數。在電話亭使用過程中,肯定會有人打完電話走掉,有人沒有打完電話而選擇重新排隊,更會有新增的人在這兒排隊,這個人數的變化就相當于任務數的增減。為了統計平均負載情況,我們5秒鐘統計一次人數,并在第1、5、15分鐘的時候對統計情況取平均值,從而形成第1、5、15分鐘的平均負載。有的人拿起電話就打,一直打完1分鐘,而有的人可能前三十秒在找電話號碼,或者在猶豫要不要打,后三十秒才真正在打電話。如果把電話看作CPU,人數看作任務,我們就說前一個人(任務)的CPU利用率高,后一個人(任務)的CPU利用率低。當然, CPU并不會在前三十秒工作,后三十秒歇著,CPU是一直在工作。只是說,有的程序涉及到大量的計算,所以CPU利用率就高,而有的程序牽涉到計算的部分很少,CPU利用率自然就低。但無論CPU的利用率是高是低,跟后面有多少任務在排隊沒有必然關系。
 
CPU數量和CPU核心數(即內核數)都會影響到CPU負載,因為任務最終是要分配到CPU核心去處理的。兩塊CPU要比一塊CPU好,雙核要比單核好。因此,我們需要記住,除去CPU性能上的差異,CPU負載是基于內核數來計算的,即“有多少內核,即有多少負載”,如單核最好不要超過100%,也就是負載為1.00,如此類推。
 
Linux里有一個/proc目錄,存放的是當前運行系統的虛擬映射,其中有一個文件為cpuinfo,這個文件里存放著CPU的信息。/proc/cpuinfo文件按邏輯CPU而非真實CPU分段落顯示信息,每個邏輯CPU的信息占用一個段落,第一個邏輯CPU標識從0開始。
$ cat /proc/cpuinfo processor       : 0vendor_id       : GenuineIntelcpu family      : 6model           : 63model name      : Intel(R) Xeon(R) CPU E5-2630 v3 @ 2.40GHzstepping        : 2microcode       : 0x36cpu MHz         : 2399.998cache size      : 20480 KBphysical id     : 0siblings        : 2core id         : 0cpu cores       : 2apicid          : 0initial apicid  : 0fpu             : yesfpu_exception   : yescpuid level     : 15wp              : yesflags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr ......bogomips        : 4799.99clflush size    : 64cache_alignment : 64address sizes   : 42 bits physical, 48 bits virtualpower management:

要理解該文件中的CPU信息,有幾個相關的概念要知道,如:processor表示邏輯CPU的標識、model name表示真實CPU的型號信息、physical id表示真實CPU和標識、cpu cores表示真實CPU的內核數等等。
 
邏輯CPU的描述:現在的服務器一般都使用了“超線程”(Hyper-Threading,簡稱HT)技術來提高CPU的性能。超線程技術是在一顆CPU同時執行多個程序而共同分享一顆CPU內的資源,理論上要像兩顆CPU一樣在同一時間執行兩個線程。雖然采用超線程技術能同時執行兩個線程,但它并不象兩個真正的CPU那樣,每各CPU都具有獨立的資源。當兩個線程都同時需要某一個資源時,其中一個要暫時停止,并讓出資源,直到這些資源閑置后才能繼續。因此超線程的性能并不等于兩顆CPU的性能。具有超線程技術的CPU還有一些其它方面的限制。
 
二、CPU負載率的計算方式
 
Load average的概念源自UNIX系統,雖然各家的公式不盡相同,但都是用于衡量正在使用CPU的進行數量和正在等待CPU的進程數量,一句話就是runable processes的數量。所以Load average可以作為CPU瓶頸的參考指標,如果大于CPU的數量,說明CPU可能不夠用了。
 
但是,在Linux上有點差異!
 
Linux上的load average除了包括正在使用CPU的進程數量和正在等待CPU的進程數量之外,還包括uninterruptible sleep的進程數量。通常等待IO設備、等待網絡的時候,進程會處于uninterruptible sleep狀態。Linux設計者的邏輯是,uninterruptible sleep應該都是很短暫的,很快就會恢復運行,所以被等同于runnable。然而uninterruptible sleep即使再短暫也是sleep,何況現實世界中uninterruptible sleep未必很短暫,大量的、或長時間的uninterruptible sleep通常意味著IO設備遇到了瓶頸。眾所周知,sleep狀態的進程是不需要CPU的,即使所有的CPU都空閑,正在sleep的進程也是運行不了的,所以sleep進程的數量絕對不適合用作衡量CPU負載的指標,Linux把uninterruptible sleep進程算進load average的做法直接顛覆了load average的本來意義。所以在Linux系統上,load average這個指標基本失去了作用,因為你不知道它代表什么意思,當看到load average很高的時候,你不知道是runnable進程太多還是uninterruptible sleep進程太多,也就無法判斷是CPU不夠用還是IO設備有瓶頸。
 
從另一個方面來說,也就可以解釋為什么磁盤慢時(大量磁盤使用時),CPU負載會急劇增加了?;旧衔遗龅紺PU負載高的情況就兩種情況:CPU本身處理太多任務,再加上軟中斷和上下文切換太頻繁導致負載高;再就是磁盤太慢導致了不可中斷睡眠太多導致CPU負載高。