1. 程式人生 > >LoadRunner監控Linux的CPU(LINUX的vmstat命令也可以做到)

LoadRunner監控Linux的CPU(LINUX的vmstat命令也可以做到)

上篇講如何用LoadRunner監控Linux的效能指標,但是關於CPU的幾個指標沒有搞清楚,下面就詳細說說。

CPU Utilization就是CPU的利用率,

75%以上就比較高了(也有說法是80%或者更高)。除了這個指標外,還要結合Load Average和Context Switch Rate來看,有可能CPU高是因為後兩個指標高導致的。

後來發現瞭如下兩片博文:理解Load Average做好壓力測試,“Load Average是 CPU的 Load,它所包含的資訊不是 CPU的使用率狀況,而是在一段時間內 CPU正在處理以及等待 CPU處理的程序數之和的統計資訊,也就是 CPU使用佇列的長度的統計資訊。”,基本解釋了multi-process,multi-thread程式的原理。理解Linux處理器的負載均值(翻譯) ,簡單說起來就一句話:

   Load Average < CPU個數 * 核數 *0.7

比如1個1核CPU,Load Average < 1 * 1 * 0.7;1個4核的CPU,Load Average必須 < 1 * 4* 0.7 = 2.8。

檢視cpu的資訊:grep 'model name' /proc/cpuinfo

Context Switch Rate就是Process(Thread)的切換,

如果切換過多,會讓CPU忙於切換,也會導致影響吞吐量。《高效能伺服器架構》這篇文章的第2節就是說的是這個問題的。究竟多少算合適?google了一大圈,沒有一個確切的解釋。Context Switch大體上由兩個部分組成:中斷和程序(包括執行緒)切換,一次中斷(Interrupt)會引起一次切換,程序(執行緒)的建立、啟用之類的也會引起一次切換。CS的值也和TPS(Transaction Per Second)相關的,假設每次呼叫會引起N次CS,那麼就可以得出

   Context Switch Rate = Interrupt Rate + TPS* N

CSR減掉IR,就是程序/執行緒的切換,假如主程序收到請求交給執行緒處理,執行緒處理完畢歸還給主程序,這裡就是2次切換。也可以用CSR、IR、TPS的值代入公式中,得出每次事物導致的切換數。因此,要降低CSR,就必須在每個TPS引起的切換上下功夫,只有N這個值降下去,CSR就能降低,理想情況下N=0,但是無論如何如果N >= 4,則要好好檢查檢查。另外網上說的CSR<5000,我認為標準不該如此單一。

在linux中,也可以用vmstat檢視r(Load Arerage),in(Interrupt)和cs(Context Switch)

這三個指標在LoadRunner中可以監控到;另外,在linux中,也可以用vmstat檢視r(Load Arerage),in(Interrupt)和cs(Context Switch)

#vmstat 1 5

procs--------------memory-------------   ----swap-- ---io--  -system------cpu----

 r  b   swpd   free    buff       cache         si  so    bi    bo  in   cs us sy id wa

 0  0244644  29156 415720 2336484    0   0     1    49   2    1      1 0 98    0

 0  0244644  29140 415720 2336484    0   0     0    28   9    115  0  099    1

 0  0244644  29140 415720 2336484    0   0     0    24   62  256  0  0100  0

 0  0244644  29140 415720 2336484    0   0     0     0    5    93    0  0100  0

 0  0244644  29140 415720 2336484    0   0     0     0    58  255  0  0100  0

Interrupt Rate包括核心由於程序的時間片中斷。(在 Linux 2.6 中,系統時鐘每 1 毫秒中斷一次時鐘頻率,用 HZ 巨集表示,定義為 1000,即每秒中斷 1000 次。系統不一樣,核心不一樣配置100、250的都有。)

核心的時鐘頻率可以通過如下命令知道

cat /boot/config-`uname -r` | grep'^CONFIG_HZ='

CONFIG_HZ=100

每秒總的時鐘中斷數就是 = cpu個數 * 核數 * CONFIG_HZ

cat /proc/interrupts

         CPU0       CPU1       CPU2       CPU3      

LOC:  97574747   52361843  105207680  69447653   Local timer interrupts

RES:    107368     257510      98635    186294   Rescheduling interrupts

CAL:     14174      14206      14164        194  function call interrupts

TLB:   1007949     853117     992546    591410   TLB shootdowns

可以檢視中斷的型別以及次數

======================分割線=======================

vmstat命令是最常見的Linux/Unix監控工具,可以展現給定時間間隔的伺服器的狀態值,包括伺服器的CPU使用率,記憶體使用,虛擬記憶體交換情況,IO讀寫情況。這個命令是我檢視Linux/Unix最喜愛的命令,一個是Linux/Unix都支援,二是相比top,我可以看到整個機器的CPU,記憶體,IO的使用情況,而不是單單看到各個程序的CPU使用率和記憶體使用率(使用場景不一樣)。

一般vmstat工具的使用是通過兩個數字引數來完成的,第一個引數是取樣的時間間隔數,單位是秒,第二個引數是取樣的次數,如:

[email protected]:~# vmstat 2 1
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa
 1  0      0 3498472 315836 3819540    0    0     0     1    2    0  0  0 100  0

2表示每個兩秒採集一次伺服器狀態,1表示只採集一次。

實際上,在應用過程中,我們會在一段時間內一直監控,不想監控直接結束vmstat就行了,例如:

複製程式碼

[email protected]:~# vmstat 2  
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa
 1  0      0 3499840 315836 3819660    0    0     0     1    2    0  0  0 100  0
 0  0      0 3499584 315836 3819660    0    0     0     0   88  158  0  0 100  0
 0  0      0 3499708 315836 3819660    0    0     0     2   86  162  0  0 100  0
 0  0      0 3499708 315836 3819660    0    0     0    10   81  151  0  0 100  0
 1  0      0 3499732 315836 3819660    0    0     0     2   83  154  0  0 100  0

複製程式碼

這表示vmstat每2秒採集資料,一直採集,直到我結束程式,這裡採集了5次資料我就結束了程式。

好了,命令介紹完畢,現在開始實戰講解每個引數的意思。

r 表示執行佇列(就是說多少個程序真的分配到CPU),我測試的伺服器目前CPU比較空閒,沒什麼程式在跑,當這個值超過了CPU數目,就會出現CPU瓶頸了。這個也和top的負載有關係,一般負載超過了3就比較高,超過了5就高,超過了10就不正常了,伺服器的狀態很危險。top的負載類似每秒的執行佇列。如果執行佇列過大,表示你的CPU很繁忙,一般會造成CPU使用率很高。

b 表示阻塞的程序,這個不多說,程序阻塞,大家懂的。

swpd 虛擬記憶體已使用的大小,如果大於0,表示你的機器實體記憶體不足了,如果不是程式記憶體洩露的原因,那麼你該升級記憶體了或者把耗記憶體的任務遷移到其他機器。

free   空閒的實體記憶體的大小,我的機器記憶體總共8G,剩餘3415M。

buff   Linux/Unix系統是用來儲存,目錄裡面有什麼內容,許可權等的快取,我本機大概佔用300多M

cache cache直接用來記憶我們開啟的檔案,給檔案做緩衝,我本機大概佔用300多M(這裡是Linux/Unix的聰明之處,把空閒的實體記憶體的一部分拿來做檔案和目錄的快取,是為了提高 程式執行的效能,當程式使用記憶體時,buffer/cached會很快地被使用。)

si  每秒從磁碟讀入虛擬記憶體的大小,如果這個值大於0,表示實體記憶體不夠用或者記憶體洩露了,要查詢耗記憶體程序解決掉。我的機器記憶體充裕,一切正常。

so  每秒虛擬記憶體寫入磁碟的大小,如果這個值大於0,同上。

bi  塊裝置每秒接收的塊數量,這裡的塊裝置是指系統上所有的磁碟和其他塊裝置,預設塊大小是1024byte,我本機上沒什麼IO操作,所以一直是0,但是我曾在處理拷貝大量資料(2-3T)的機器上看過可以達到140000/s,磁碟寫入速度差不多140M每秒

bo 塊裝置每秒傳送的塊數量,例如我們讀取檔案,bo就要大於0。bi和bo一般都要接近0,不然就是IO過於頻繁,需要調整。

in 每秒CPU的中斷次數,包括時間中斷

cs 每秒上下文切換次數,例如我們呼叫系統函式,就要進行上下文切換,執行緒的切換,也要程序上下文切換,這個值要越小越好,太大了,要考慮調低執行緒或者程序的數目,例如在apache和nginx這種web伺服器中,我們一般做效能測試時會進行幾千併發甚至幾萬併發的測試,選擇web伺服器的程序可以由程序或者執行緒的峰值一直下調,壓測,直到cs到一個比較小的值,這個程序和執行緒數就是比較合適的值了。系統呼叫也是,每次呼叫系統函式,我們的程式碼就會進入核心空間,導致上下文切換,這個是很耗資源,也要儘量避免頻繁呼叫系統函式。上下文切換次數過多表示你的CPU大部分浪費在上下文切換,導致CPU幹正經事的時間少了,CPU沒有充分利用,是不可取的。

us 使用者CPU時間,我曾經在一個做加密解密很頻繁的伺服器上,可以看到us接近100,r執行佇列達到80(機器在做壓力測試,效能表現不佳)。

sy 系統CPU時間,如果太高,表示系統呼叫時間長,例如是IO操作頻繁。

id  空閒 CPU時間,一般來說,id + us + sy = 100,一般我認為id是空閒CPU使用率,us是使用者CPU使用率,sy是系統CPU使用率。

wt 等待IO CPU時間。