在Linux下面,能夠經過top命令看到CPU的負載狀況,其輸出大概以下(只摘錄CPU部分):html
top - 01:24:41 up 6 min, 2 users, load average: 0.00, 0.03, 0.00 %Cpu(s): 2.5 us, 1.8 sy, 3.1 ni, 90.5 id, 1.7 wa, 0.0 hi, 0.4 si, 0.0 st
這裏的load average以及縮寫的us、sy、ni、id、wa、hi、si、st都是些什麼意思呢?這些值在一個什麼樣的區間比較合理呢?若是值超過了合理區間,應該怎麼處理呢?這篇未來聊聊這些問題。linux
load average表明CPU的平均負載值,上面示例中的load average: 0.00, 0.03, 0.00
分別表示當前CPU在1分鐘、5分鐘和15分鐘內的平均負載。這些負載值是怎麼來的呢?緩存
這些數據來自於文件/proc/loadavg,內核會負責統計出這些數據。網絡
top和uptime命令顯示的內容就來自於這個文件,那麼這裏所謂的平均負載是個什麼概念? 根據proc的幫助文件可知,這裏的值就是單位時間內處於運行狀態以及等待disk I/O狀態的平均job數量。這裏的運行狀態和job都是內核的概念,這裏簡單澄清一下:app
對內核來講,進程和線程都是job性能
job處於運行狀態指job處於內核的運行隊列中,正在或等待被CPU調度(用戶空間的進程正在運行不表明須要被CPU調度,有可能在等待I/O,也有可能在sleep等等)ui
由於某一刻(瞬間)等待調度的進程多少並不能反映系統的總體壓力,因此這裏取了1,5和15分鐘的平均值。spa
那麼這個值的大小反映系統什麼樣的一個壓力狀態呢?這裏以單核CPU爲例線程
小於1: 說明平均每次只有不到一個job在忙,對於單核的CPU來講,徹底能處理過來unix
等於1: 說明平均每次恰好有一個job在忙,對於單核的CPU來講,恰好能處理過來
大於1: 說明平均每次有多於一個job在忙,對於單核的CPU來講,因爲一次只能處理一個任務,因此確定有任務在等待,說明系統負載較大,調度不過來,有job須要等待
從上面能夠看出,一旦大於1,就說明job得不到及時調度,系統性能將受影響。對於多核來講,因爲一次能夠調度多個job,因此大於1不必定有問題,以4核CPU爲例,該值大於4才說明CPU忙不過來。
那這個平均負載保持在多少比較合適呢?其實沒有一個標準值,但通常的作法是預留必定的空間來應對系統負載的波動,建議控制在「0.7*核數」之內,好比4核,那麼0.7*4=2.8比較合適,一旦超過這個值,須要分析緣由並着手解決。
load average經過統計等待運行的平均job數量來推斷CPU的繁忙程度,而%Cpu(s)則直接統計CPU處於不一樣狀態的時間,比上面的load average更直觀,因此在實際上也被使用的更多。
整體來講,CPU會處於下面三種狀態中的一種:
Idle: 處於空閒狀態,沒有任務須要調度
User space: 正在運行user space的代碼(處於用戶態)
Kernel: 正在運行內核的代碼(處於內核態)
對上面這三種狀態,內核又進一步細分爲不少狀態,這裏以上面輸出的8種狀態爲例進行說明:
2.5 us : 表示CPU有2.5%的時間在運行用戶態代碼(即在運行用戶態程序)
1.8 sy : 表示CPU有1.8%的時間在運行內核態代碼。內核負責管理系統的全部進程和硬件資源,全部的內核代碼都運行在內核態,當用戶態進程須要訪問硬件資源時,如分配內存,讀寫I/O等,也須要經過系統調用進入內核態運行內核代碼。%sy高說明內核佔用太多資源,或者用戶進程發起了太多的系統調用。
3.1 ni : 表示CPU有3.1%的時間在運行niceness不爲0的進程代碼。默認狀況下,進程的niceness值都爲0,但能夠經過命令nice來啓動一個進程並指定其niceness值,niceness的取值範圍是-20到19,值越小,表示優先級越高,越優先被內核調度。
90.5 id : 表示CPU有90.5%的時間處於空閒狀態
1.7 wa : 表示CPU有1.7%的時間處於I/O等待狀態。一般狀況下,當CPU遇到一個I/O操做時,會先觸發I/O操做,而後去幹別的,等I/O操做完成後,CPU再接着繼續工做,但若是這時系統比較空閒,CPU沒有別的事情能夠作,那麼CPU將處於等待狀態,這種處於等待狀態的時間將會被統計進I/O wait,也就是說CPU處於I/O wait狀態即CPU閒着沒事幹在等I/O操做結束,和idle幾乎是同樣的。這個值高說明CPU閒且I/O操做多或者I/O操做慢,但低並不能說明沒有I/O操做或者I/O操做快,有多是CPU在忙別的,因此這只是一個參考值,須要和其餘的統計項一塊兒來分析。
0.0 hi & 0.4 si : 這兩個值反映了CPU有多少時間花在了中斷處理上,hi(hardware interrupts)是硬件中斷,si(softirqs)是軟件中斷。硬件中斷通常由I/O設備引發,如網卡、磁盤等,發生硬件中斷後,CPU須要當即處理,當硬件中斷中須要處理的事情不少時,內核會生成相應的軟中斷,而後將耗時且不須要當即處理完成的操做放在軟中斷中執行,好比當網卡收到網絡包時,須要CPU當即把數據拷貝到內存中去,由於網卡自帶的緩存較小,若是不及時處理的話後面的數據包就進不來,致使丟包,當數據拷貝到內存中以後,就不須要那麼着急的處理了,這時候能夠將處理數據包(協議棧)的代碼放在軟中斷中執行。本人不是內核專家,關於軟中斷的部分請參考Understanding the Linux Kernel, 3rd Edition
0.0 st : %st和虛擬機有關,當系統運行在虛擬機中時,當前虛擬機就會和宿主機以及其它的虛擬機共享CPU,%st就表示當前虛擬機在等待CPU爲它服務的時間。該值越大,表示物理CPU被宿主機和其它虛擬機佔用的時間越長,致使當前虛擬機得不到充足的CPU資源。若是%st長時間大於0,說明CPU資源得不到知足,這時能夠考慮將虛擬機移到其它機器上,或者減小當前機器運行的虛擬機數量。
上面這些統計項的總和等於100%,除了%idle以外,其它的任何一項數值太高都表明系統有問題,須要具體問題具體分析。
%us太高 : 表示有用戶態進程佔用了過多的CPU,經過top命令能夠很清楚的看到是哪一個進程,若是這不是預期的行爲,能夠經過kill命令殺死相應的進程或者重啓它
%sy太高 : 若是隻是偶爾太高的話,不用擔憂,但若是是持續走高的話,就須要重視,有多是某些進程的系統調用太頻繁,好比進程不停的往控制檯輸出日誌,但若是用戶態的進程都沒有問題,那多是內核裏面的代碼出現了問題,尤爲是代碼寫的很差的驅動模塊
%ni太高 : 說明有人用nice程序運行了比較耗CPU的進程。若是niceness值大於0的話,就沒什麼好擔憂的,由於它的優先級比默認優先級要低,不會影響CPU性能,但最好仍是確認一下該進程不會搶佔系統的其它資源,如內存、磁盤I/O等,避免對系統總體性能形成影響。若是niceness值小於0的話,表示該進程優先級高且佔用CPU資源多,須要確保該進程佔用的CPU資源是符合預期的,若是不是,能夠用top命令把它找出來並kill掉或者重啓。
%wa太高 : 意味着系統中有進程在作大量的I/O操做,或者在讀寫速度比較慢的I/O設備,好比頻繁的讀寫磁盤,這時能夠經過iotop命令來查看是哪些進程佔I/O,而後再針對不一樣的進程作相應的處理;還有一種狀況就是系統在頻繁的使用交換分區,這時須要解決的就是內存的問題,而不是I/O的問題。
%hi或者%si太高 : %hi太高通常是硬件出問題了,%si太高通常是內核裏面的代碼出問題了
%st 太高 : 正如上面介紹介紹的那樣,%st太高表示當前虛擬機得不到足夠的CPU資源。這時能夠考慮將當前虛擬機搬遷到其它的主機上,或者想辦法下降當前主機的負載,好比關掉一些其它的虛擬機。
load average和%Cpu(s)以不一樣的方式給出了當前主機的CPU負載狀況,經過%Cpu(s)咱們能夠看到系統當前的實時負載,如今不少監控系統每隔一段時間都會採集一次%Cpu(s),而後存儲起來以圖形的方式展現出來,這樣就能很直觀的看到CPU負載的變化,固然若是沒有這樣的監控系統的話,經過load average也能大概的知道最近一段時間內的平均負載(最長15分鐘)。